Win32 API
Komunikaty w oknie
Szukaj…
Składnia
- #include <windows.h>
- BOOL WINAPI DestroyWindow (HWND hwnd);
- VOID WINAPI PostQuitMessage (int kod wyjścia);
- BOOL WINAPI MoveWindow (HWND hwnd, int x, int y, int cx, int cy, BOOL bRepaint);
WM_CREATE
Komunikat WM_CREATE jest wysyłany do procedury okna podczas wywołania okna CreateWindowEx
. Argument lp
zawiera wskaźnik do CREATESTRUCT
który zawiera argumenty przekazane do CreateWindowEx
. Jeśli aplikacja zwróci 0 z WM_CREATE, okno zostanie utworzone. Jeśli aplikacja zwróci -1, tworzenie zostanie anulowane.
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
Ta wiadomość jest wysyłana do procedury okna, gdy okno jest niszczone. Jest wysyłany po usunięciu okna z ekranu. Większość aplikacji zwalnia wszelkie zasoby, takie jak pamięć lub uchwyty, uzyskane w WM_CREATE. Jeśli poradzisz sobie z tą wiadomością, zwróć 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
Wysyłane po kliknięciu przycisku zamykania aplikacji. Nie myl tego z WM_DESTROY
który jest wysyłany, gdy okno zostanie zniszczone. Główna różnica polega na tym, że zamykanie może być anulowane w WM_CLOSE (pomyśl o Microsoft Word proszącym o zapisanie twoich zmian), w przeciwieństwie do tego, że niszczenie następuje, gdy okno zostało już zamknięte (pomyśl o zwolnieniu pamięci przez 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
Ta wiadomość jest wysyłana do procedury okna po zmianie jego rozmiaru. Najczęstszym powodem obsługi tego komunikatu jest dostosowanie położenia dowolnego okna potomnego. Na przykład w Notatniku po zmianie rozmiaru okna zmienia się również okno potomne (kontrola edycji). Zwróć 0, jeśli obsłużysz tę wiadomość.
Argument | Wartość |
---|---|
wp | Jedna ze stałych zmiany rozmiaru okna . |
lp | LOWORD (lp) to nowa szerokość obszaru roboczego HIWORD (lp) to nowa wysokość obszaru roboczego. |
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
Wysłano do procedury okna, gdy:
- użytkownik wybiera element z menu
- formant wysyła powiadomienie do swojego okna nadrzędnego
- naciśnięcie klawisza skrótu jest tłumaczone
Źródło wiadomości | HIWORD (wp) | LOWORD (wp) | lp |
---|---|---|---|
Menu | 0 | Identyfikator menu (IDM_ *) | 0 |
Akcelerator | 1 | Accel ID (IDM_ *) | 0 |
Kontrola | kod powiadomienia | Identyfikator kontroli | HWND okna kontrolnego |
Na przykład w Notatniku, gdy użytkownik kliknie „Plik-> Otwórz”, pojawi się okno dialogowe umożliwiające użytkownikowi otwarcie pliku. Pozycje menu są przetwarzane w komunikacie WM_CREATE procedury okna w następujący sposób:
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);
}