Win32 API
Fenstermeldungen
Suche…
Syntax
- #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
Während des CreateWindowEx
Aufrufs des Fensters wird eine WM_CREATE-Nachricht an Ihre Fensterprozedur CreateWindowEx
. Das Argument lp
enthält einen Zeiger auf ein CREATESTRUCT
das die an CreateWindowEx
Argumente enthält. Wenn eine Anwendung von WM_CREATE 0 zurückgibt, wird das Fenster erstellt. Wenn eine Anwendung -1 zurückgibt, wird die Erstellung abgebrochen.
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
Diese Nachricht wird an Ihre Fensterprozedur gesendet, wenn ein Fenster zerstört wird. Es wird gesendet, nachdem das Fenster vom Bildschirm entfernt wurde. In den meisten Anwendungen werden alle in WM_CREATE enthaltenen Ressourcen wie Speicher oder Handles freigegeben. Wenn Sie mit dieser Nachricht umgehen, geben Sie 0 zurück.
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
Wird gesendet, wenn auf die Schaltfläche Schließen einer Anwendung geklickt wird. Verwechseln Sie dies nicht mit WM_DESTROY
das gesendet wird, wenn ein Fenster zerstört wird. Der Hauptunterschied liegt in der Tatsache, dass das Schließen in WM_CLOSE möglicherweise abgebrochen wird (denken Sie an Microsoft Word, dass Sie Ihre Änderungen speichern müssen), statt zu zerstören, wenn das Fenster bereits geschlossen wurde.
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
Diese Nachricht wird an die Fensterprozedur gesendet, nachdem sich ihre Größe geändert hat. Der häufigste Grund für die Behandlung dieser Nachricht besteht darin, die Position aller untergeordneten Fenster anzupassen. Wenn Sie beispielsweise in Notepad die Größe des Fensters ändern, wird auch die Größe des untergeordneten Fensters (Bearbeitungssteuerelement) geändert. Geben Sie 0 zurück, wenn Sie diese Nachricht bearbeiten.
Streit | Wert |
---|---|
wp | Eine der Fenstergrößenkonstanten . |
lp | LOWORD (lp) ist die neue Breite des Kundenbereichs HIWORD (lp) ist die neue Höhe des Kundenbereichs. |
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
Wird an ein Fenster gesendet, wenn:
- Der Benutzer wählt ein Element aus einem Menü aus
- Ein Steuerelement sendet eine Benachrichtigung an sein übergeordnetes Fenster
- Ein Gaspedal-Tastendruck wird übersetzt
Nachrichtenquelle | HIWORD (wp) | LOWORD (wp) | lp |
---|---|---|---|
Speisekarte | 0 | Menü-ID (IDM_ *) | 0 |
Beschleuniger | 1 | Accel-ID (IDM_ *) | 0 |
Steuerung | Benachrichtigungscode | Steuer-ID | HWND des Kontrollfensters |
Wenn ein Benutzer beispielsweise im Editor auf "Datei-> Öffnen" klickt, wird ein Dialogfeld angezeigt, in dem der Benutzer eine Datei öffnen kann. Menüelemente werden in der WM_CREATE-Nachricht der Fensterprozedur wie folgt verarbeitet:
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);
}