今回はキー入力を取得してみます
OnChar関数を作成し、メッセージクラッカーに渡します
戻り値、引数は次の通りです
/* void Cls_OnChar(HWND hwnd, TCHAR ch, int cRepeat) */ #define HANDLE_WM_CHAR(hwnd, wParam, lParam, fn) \ ((fn)((hwnd), (TCHAR)(wParam), (int)(short)LOWORD(lParam)), 0L)
注目して欲しいのはwParamとlParamの扱いです
wParamはTCHAR型に、lParamの下位バイトはint型にキャストされています
LOWORDは
#define LOWORD(l) ((WORD)((DWORD_PTR)(l) & 0xffff))
で定義されているマクロで下位バイトを示します
このように、wParamとlParamの取扱いはメッセージごとに違います
WM_DESTROYでは使用しませんでした
メッセージクラッカーの定義に従えば、パラメータの適切な使い方がわかります
ちなみにここでは使いませんが
上位バイトを示すにはHIWORDというマクロを使います
#define HIWORD(l) ((WORD)((DWORD_PTR)(l) >> 16))
ではキー入力メッセージ処理部分を書いてみましょう
どのキーが押されたかというメッセージは
WM_CHARメッセージが送られてきます
//-------------------------------------------------------// // キー文字メッセージ処理 // // 引数: hWnd ウィンドウハンドル // ch 入力された文字 // cRepeat リピートカウント(長押し時、キー処理を行う回数) //-------------------------------------------------------// void OnChar(HWND hWnd, TCHAR ch, int cRepeat){ _tprintf(_T("%c"),ch); } //------------------------------------------------------// // ウィンドウ破棄メッセージ処理 // // 引数: hWnd ウィンドウハンドル //------------------------------------------------------// void OnDestroy(HWND hWnd){ PostQuitMessage(0); } //-----------------------------------------------------// // ウィンドウプロシージャ // デフォルトの処理はDefWindowProc関数で行う // // 引数: hWnd ウィンドウハンドル // msg メッセージ // wParam パラメータ // lParam パラメータ // // 戻り値:処理結果 //-----------------------------------------------------// LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){ switch(msg){ // キーボード HANDLE_MSG(hWnd,WM_CHAR,OnChar); HANDLE_MSG(hWnd,WM_DESTROY,OnDestroy); } return DefWindowProc(hWnd, msg, wParam, lParam); }
デバックコンソールを表示しておいてください
_tprintf関数は通常のprintf関数とUnicode文字出力用のwprintf関数を切り替えるマクロです
TCHAR型は文字コード定義によってchar型とwchar_t型が切り替わる文字です
文字に関しては全てTCHAR型で取り扱えば、文字コードの問題は回避できます
全ソースコードは下から
main.cpp