Win32 API
ウィンドウメッセージ
サーチ…
構文
- #include <windows.h>
- BOOL WINAPI DestroyWindow(HWND hwnd);
- VOID WINAPI PostQuitMessage(int出口コード);
- BOOL WINAPI MoveWindow(HWND hwnd、int x、int y、int cx、int cy、BOOL bRepaint);
WM_CREATE
WM_CREATEメッセージは、ウィンドウのCreateWindowEx
呼び出し中にウィンドウプロシージャに送信されます。 lp
引数には、 CreateWindowEx
渡される引数を含むCREATESTRUCT
へのポインタが含まれています。アプリケーションがWM_CREATEから0を返すと、ウィンドウが作成されます。アプリケーションが-1を返した場合、作成はキャンセルされます。
LRESULT CALLBACK winproc(HWND hwnd, UINT wm, WPARAM wp, LPARAM lp)
{
switch (wm) {
case WM_CREATE:
CREATESTRUCT *cs = (CREATESTRUCT *) lp;
if (MessageBox(hwnd,
"Do you want to continue creating the window?", "", MB_YESNO)
== IDYES) {
/* create window controls */
return 0;
}
/* cancel creation */
return -1;
}
return DefWindowProc(hwnd, wm, wp, lp);
}
WM_DESTROY
このメッセージは、ウィンドウが破棄されたときにウィンドウプロシージャに送信されます。ウィンドウが画面から削除された後に送信されます。ほとんどのアプリケーションでは、WM_CREATEで取得されたメモリやハンドルなどのリソースはすべて解放されます。このメッセージを処理する場合は、0を返します。
LRESULT CALLBACK winproc(HWND hwnd, UINT wm, WPARAM wp, LPARAM lp)
{
static char *text;
switch (wm) {
case WM_CREATE:
text = malloc(256);
/* use the allocated memory */
return 0;
case WM_CLOSE:
switch (MessageBox(hwnd, "Save changes?", "", MB_YESNOCANCEL)) {
case IDYES:
savedoc();
/* fall through */
case IDNO:
DestroyWindow(hwnd);
break;
}
return 0;
case WM_DESTROY:
/* free the memory */
free(text);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, wm, wp, lp);
}
WM_CLOSE
アプリケーションの閉じるボタンがクリックされたときに送信されます。ウィンドウを破棄するときに送信されるWM_DESTROY
と混同しないでください。主な違いは、WM_CLOSE(Microsoft Wordで変更を保存すると思う)で閉じることがキャンセルされている点です.Windowsが既に閉じられている(Microsoft Wordのメモリを解放すると考える)場合とは異なります。
LRESULT CALLBACK winproc(HWND hwnd, UINT wm, WPARAM wp, LPARAM lp)
{
static char *text;
switch (wm) {
case WM_CREATE:
text = malloc(256);
/* use the allocated memory */
return 0;
case WM_CLOSE:
switch (MessageBox(hwnd, "Save changes?", "", MB_YESNOCANCEL)) {
case IDYES:
savedoc();
/* fall through */
case IDNO:
DestroyWindow(hwnd);
break;
}
return 0;
case WM_DESTROY:
/* free the memory */
free(text);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, wm, wp, lp);
}
WM_SIZE
このメッセージは、サイズが変更された後、ウィンドウのウィンドウプロシージャに送信されます。このメッセージを処理する最も一般的な理由は、子ウィンドウの位置を調整することです。たとえば、メモ帳では、ウィンドウのサイズが変更されると、子ウィンドウ(編集コントロール)のサイズも変更されます。このメッセージを処理する場合は0を返します。
引数 | 値 |
---|---|
wp | ウィンドウサイジング定数の 1つ。 |
lp | LOWORD(lp)はクライアント領域の新しい幅です HIWORD(lp)はクライアント領域の新しい高さです。 |
LRESULT CALLBACK winproc(HWND hwnd, UINT wm, WPARAM wp, LPARAM lp)
{
switch (wm) {
case WM_SIZE:
/* hwndEdit is the handle of the edit control window */
MoveWindow(hwndEdit, 0, 0, LOWORD(lp), HIWORD(lp), TRUE);
return 0;
}
return DefWindowProc(hwnd, wm, wp, lp);
}
WM_COMMAND
次の場合にウィンドウプロシージャに送信されます。
- ユーザはメニューから項目を選択する
- コントロールが親ウィンドウに通知を送信する
- アクセラレータキーストロークが翻訳される
メッセージソース | HIWORD(wp) | LOWORD(wp) | lp |
---|---|---|---|
メニュー | 0 | メニューID(IDM_ *) | 0 |
アクセル | 1 | Accel ID(IDM_ *) | 0 |
コントロール | 通知コード | コントロールID | コントロールウィンドウのHWND |
たとえば、メモ帳で、ユーザーが "ファイル - >開く"をクリックすると、ファイルを開くためのダイアログボックスが表示されます。メニュー項目は、ウィンドウプロシージャのWM_CREATEメッセージで次のように処理されます。
LRESULT CALLBACK winproc(HWND hwnd, UINT wm, WPARAM wp, LPARAM lp)
{
switch (wm) {
case WM_COMMAND:
switch (LOWORD(wp) {
case ID_FILE_OPEN:
/* show file open dialog */
break;
case ID_FILE_NEW:
/* create new instance */
break;
}
return 0;
}
return DefWindowProc(hwnd, wm, wp, lp);
}