操作する

カーソルキーを押すと文字がキーに対応して動くようにした。
WM_KEYDOWNやらWM_KEYUPやら使って操作する事もできるが、今後のためにGetKeyState()を使用した
使い方はプログラム内部を見ればわかるが、
if(GetKeyState(VK_UP) & 0x80){/*対応する処理*/}
とすれば良い。(「VK_UP」を「'w'」とすれば w Keyに対応してくれる)
VK_UPのほかの種類を調べたければ「VK_UP」「バーチャルキー」等で検索すれば出てくるでしょう。
サンプル
プログラムは?
#include <windows.h>
#include <windowsx.h>
#include <string>
const int WINX = 320;
const int WINY = 240;
const char* TITLE = "〜うぃんどう〜";
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HDC Back_Init_Surface(HWND hwnd)
{
HDC hdc,BackDC;
HBITMAP hBackBMP;
hdc = GetDC(hwnd); // 今の画面を取得
BackDC = CreateCompatibleDC(hdc); // hdcに似た領域
hBackBMP = CreateCompatibleBitmap(hdc,WINX,WINY); // WINX,WINYは画面の大きさ
SelectObject(BackDC,hBackBMP); // 作ったものを絡める
PatBlt(BackDC,0,0,WINX,WINY,WHITENESS); // 白で塗りつぶす
ReleaseDC(hwnd,hdc); // 借りたものは返さないと。
return BackDC;//裏画面を返す
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR lpCmdLine,int nCmdShow)
{
MSG msg;
WNDCLASSEX wc;
HWND hwnd;
// --- 設定 Start --- //
ZeroMemory(&wc,sizeof(WNDCLASSEX)); // 内部の情報を全て0に!
// --- 情報の登録 --- //
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.lpszMenuName = NULL;
wc.hInstance = hInstance;
wc.hIcon = (HICON)LoadImage(NULL,MAKEINTRESOURCE(IDI_APPLICATION),IMAGE_ICON,0,0,LR_SHARED);
wc.hIconSm = (HICON)LoadImage(NULL,MAKEINTRESOURCE(IDI_APPLICATION),IMAGE_ICON,0,0,LR_SHARED);
wc.hCursor = (HCURSOR)LoadImage(NULL,MAKEINTRESOURCE(IDC_ARROW),IMAGE_CURSOR,0,0,LR_DEFAULTCOLOR | LR_SHARED);
wc.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszClassName= TITLE;
// --- 情報の登録 End --- //
if(!RegisterClassEx(&wc))return FALSE; // ちゃんと登録されてる?
// --- 設定 End --- //
// --- ウィンドウを表示のために作ります --- //
DWORD dwStyle = WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX; // ウィンドウの大きさ変更できないように
hwnd = CreateWindowEx(0,TITLE,TITLE,dwStyle, // タイトル、スタイルの登録
GetSystemMetrics(SM_CXSCREEN)/2 - WINX/2,// スクリーンの大きさを取得して真ん中に表示
GetSystemMetrics(SM_CYSCREEN)/2 - WINY/2,// 上に同じ Y座標版
CW_USEDEFAULT, // 今のところ大きさはどうでもいいよ
CW_USEDEFAULT, // 上に同じ。
NULL,NULL,hInstance,NULL);
if(!hwnd)return FALSE; // ちゃんと作れた?
// --- ウィンドウ表示のために作ります End --- //
// --- ウィンドウを WINX WINYの大きさに --- //
RECT window_rect;
SetRect(&window_rect,0,0,WINX,WINY);
AdjustWindowRectEx(&window_rect,GetWindowLong(hwnd,GWL_STYLE),GetMenu(hwnd) != NULL,GetWindowLong(hwnd,GWL_EXSTYLE));
const int nWidth = window_rect.right - window_rect.left;
const int nHeight = window_rect.bottom - window_rect.top;
SetWindowPos(hwnd,NULL,0,0,nWidth,nHeight,SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
// --- ウィンドウを WINX WINYの大きさに END --- //
ShowWindow(hwnd,nCmdShow); // ウィンドウ表示するよ
UpdateWindow(hwnd);
for(;;){ // メインループ
if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)){
if(!GetMessage(&msg,(HWND)NULL,0,0))break; // メッセージが着たら処理するよ
TranslateMessage(&msg); // キーが押されたかどうか見てます。見てます。
DispatchMessage(&msg); // ウィンドウにメッセージ送信
}else{
// 毎回の処理
}
Sleep(1); // ちょっと息抜き
}
return (int)msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){
PAINTSTRUCT ps;
static int x=0,y=0; // 自分がどこにいるかの保持
static std::string course;// どのカーソルを押している?の保持
static HDC backhdc; // 裏画面
switch(msg){
case WM_KEYDOWN: // 何かキーを押された?
if(wParam != VK_ESCAPE){return 0;}// Esc押される以外は何もしないよ
case WM_DESTROY: // 終了するよ。
KillTimer(hwnd,1); // 終了前にタイマーを破棄するよ
ReleaseDC(hwnd,backhdc);// 裏画面破棄
PostQuitMessage(0);
return 0;
case WM_PAINT:{ // Paintのメッセージ
PatBlt(backhdc,0,0,WINX,WINY,WHITENESS);// 裏画面を白で初期化
// 座標(x,y)の位置にstrを書きます。
TextOut(backhdc,x,y,course.c_str(),lstrlen(course.c_str()));
HDC hdc = BeginPaint(hwnd,&ps);
BitBlt(hdc,0,0,WINX,WINY,backhdc,0,0,SRCCOPY);
EndPaint(hwnd,&ps);
return 0;
}
case WM_TIMER: // 一定時間ごとに動くよ
if(GetKeyState(VK_LEFT) & 0x80){ // カーソル左を感知したら
x--; // x-1を実行
course = "←"; // 方向を保持
}else if(GetKeyState(VK_RIGHT) & 0x80){
x++;
course = "→";
}else if(GetKeyState(VK_UP) & 0x80){
y--;
course = "↑";
}else if(GetKeyState(VK_DOWN) & 0x80){
y++;
course = "↓";
}
InvalidateRect(hwnd,NULL,FALSE); // 動いたら描画し直せ!
return 0;
case WM_CREATE: // Windowを作ったときに一度だけ実行します。
SetTimer(hwnd,1,10,NULL); // Timerを使いますよ(Timer準備物)
backhdc = Back_Init_Surface(hwnd); // 裏画面生成
course = "○"; // 初期化
return 0;
default:
break;
}
return (DefWindowProc(hwnd,msg,wParam,lParam));
}