Win32 API
Messaggi sulla finestra
Ricerca…
Sintassi
- #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
Un messaggio WM_CREATE viene inviato alla procedura della finestra CreateWindowEx
chiamata CreateWindowEx
della finestra. L'argomento lp
contiene un puntatore a un CREATESTRUCT
che contiene gli argomenti passati a CreateWindowEx
. Se un'applicazione restituisce 0 da WM_CREATE, viene creata la finestra. Se un'applicazione restituisce -1, la creazione viene annullata.
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
Questo messaggio viene inviato alla procedura della finestra quando una finestra viene distrutta. Viene inviato dopo che la finestra è stata rimossa dallo schermo. La maggior parte delle applicazioni libera risorse, come memoria o maniglie, ottenute in WM_CREATE. Se gestisci questo messaggio, restituisci 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
Inviato quando si fa clic sul pulsante di chiusura di un'applicazione. Non confondere questo con WM_DESTROY
che viene inviato quando una finestra verrà distrutta. La differenza principale risiede nel fatto che la chiusura può essere annullata in WM_CLOSE (si pensi a Microsoft Word che richiede di salvare le modifiche), invece che distruggere è quando la finestra è già stata chiusa (si pensi a Microsoft Word che libera memoria).
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
Questo messaggio viene inviato alla finestra della finestra dopo che la sua dimensione è cambiata. Il motivo più comune per la gestione di questo messaggio è la regolazione della posizione di qualsiasi finestra secondaria. Ad esempio, nel Blocco note, quando la finestra viene ridimensionata, viene ridimensionata anche la finestra secondaria (controllo di modifica). Restituisce 0 se gestisci questo messaggio.
Discussione | Valore |
---|---|
wp | Una delle costanti di dimensionamento della finestra . |
lp | LOWORD (lp) è la nuova larghezza dell'area client HIWORD (lp) è la nuova altezza dell'area client. |
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
Inviato a una finestra di dialogo quando:
- l'utente seleziona una voce da un menu
- un controllo invia una notifica alla sua finestra genitore
- un tasto di scelta rapida viene tradotto
Fonte del messaggio | HIWORD (wp) | LOWORD (wp) | lp |
---|---|---|---|
Menu | 0 | ID menu (IDM_ *) | 0 |
Acceleratore | 1 | ID Accel (IDM_ *) | 0 |
Controllo | codice di notifica | ID di controllo | HWND della finestra di controllo |
Ad esempio, nel Blocco note, quando un utente fa clic su "File-> Apri" viene visualizzata una finestra di dialogo per consentire all'utente di aprire un file. Le voci di menu vengono elaborate nel messaggio WM_CREATE della procedura della finestra in questo modo:
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);
}