Win32 API
Окно сообщений
Поиск…
Синтаксис
- #include <windows.h>
- BOOL WINAPI DestroyWindow (HWND hwnd);
- VOID WINAPI PostQuitMessage (int exitcode);
- BOOL WINAPI MoveWindow (HWND hwnd, int x, int y, int cx, int cy, BOOL bRepaint);
WM_CREATE
Сообщение WM_CREATE отправляется в вашу оконную процедуру во время вызова CreateWindowEx
окна. Аргумент lp
содержит указатель на CREATESTRUCT
содержащий аргументы, переданные CreateWindowEx
. Если приложение возвращает 0 из WM_CREATE, создается окно. Если приложение возвращает -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 просит сохранить ваши изменения), в отличие от этого уничтожения, когда окно уже закрыто (подумайте о освобождении памяти 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, если вы обрабатываете это сообщение.
аргументация | Значение |
---|---|
в.ч. | Одна из констант размера окна . |
Л.П. | 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 (в.ч.) | LOWORD (в.ч.) | Л.П. |
---|---|---|---|
Меню | 0 | Идентификатор меню (IDM_ *) | 0 |
ускоритель | 1 | Accel ID (IDM_ *) | 0 |
контроль | код уведомления | Контрольный идентификатор | 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);
}