bis MessageBox erscheint
-
Hallo,
hier erstmal der Quellcode:
[cpp]
#include <windows.h>LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("Systemmenü") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;if (!RegisterClass (&wndclass))
{ // UNICODE-Compilierung ist die einzige realistische Fehlermöglichkeit
MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}hwnd = CreateWindow (szAppName, // Name der Fensterklasse
szAppName, // Fenstertitel
WS_OVERLAPPEDWINDOW, // Fensterstil
CW_USEDEFAULT, // X-Position des Fensters
CW_USEDEFAULT, // Y-Position des Fensters
CW_USEDEFAULT, // Fensterbreite
CW_USEDEFAULT, // Fensterhöhe
NULL, // übergeordnetes Fenster
NULL, // Menü
hInstance, // Programm-Kopiezähler (Programm-ID)
NULL) ; // zusätzliche ParameterShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
HMENU hmenu = GetSystemMenu(hwnd, FALSE);
AppendMenu(hmenu, MF_SEPARATOR, 0, 0);
AppendMenu(hmenu, MF_STRING, 1, TEXT("INFOOO"));
DeleteMenu(hmenu, 0, MF_BYPOSITION);
DeleteMenu(hmenu, 1, MF_BYPOSITION);
DeleteMenu(hmenu, 2, MF_BYPOSITION);
DeleteMenu(hmenu, 3, MF_BYPOSITION);
AppendMenu(hmenu, MF_STRING, 2, TEXT("Close"));
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
return 0 ;case WM_PAINT:
return 0 ;case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
case WM_SYSCOMMAND:
switch(LOWORD(wParam))
{
case 1:
MessageBox(hwnd, TEXT("INFO"), TEXT("Information"), 0);
GetSystemMenu(hwnd, TRUE);
return 0;
case 2:
SendMessage(hwnd, WM_CLOSE, 0, 0);
return 0;
}
break;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}Also das Problem ist das wenn man About klickt das es zirka 1 minute dauernt bist die MessageBox bei case 1 erscheint. was ist der Fehler?
-
verdammt close tag vergessen:
#include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("Systemmenü") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { // UNICODE-Compilierung ist die einzige realistische Fehlermöglichkeit MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow (szAppName, // Name der Fensterklasse szAppName, // Fenstertitel WS_OVERLAPPEDWINDOW, // Fensterstil CW_USEDEFAULT, // X-Position des Fensters CW_USEDEFAULT, // Y-Position des Fensters CW_USEDEFAULT, // Fensterbreite CW_USEDEFAULT, // Fensterhöhe NULL, // übergeordnetes Fenster NULL, // Menü hInstance, // Programm-Kopiezähler (Programm-ID) NULL) ; // zusätzliche Parameter ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; HMENU hmenu = GetSystemMenu(hwnd, FALSE); AppendMenu(hmenu, MF_SEPARATOR, 0, 0); AppendMenu(hmenu, MF_STRING, 1, TEXT("INFOOO")); DeleteMenu(hmenu, 0, MF_BYPOSITION); DeleteMenu(hmenu, 1, MF_BYPOSITION); DeleteMenu(hmenu, 2, MF_BYPOSITION); DeleteMenu(hmenu, 3, MF_BYPOSITION); AppendMenu(hmenu, MF_STRING, 2, TEXT("Close")); while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: return 0 ; case WM_PAINT: return 0 ; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; case WM_SYSCOMMAND: switch(LOWORD(wParam)) { case 1: MessageBox(hwnd, TEXT("INFO"), TEXT("Information"), 0); GetSystemMenu(hwnd, TRUE); return 0; case 2: SendMessage(hwnd, WM_CLOSE, 0, 0); return 0; } break; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
-
omg das Programm braucht 40% prozessorleistung
da muss doch was falschgelaufen sein -.-
-
1. Wäre einrücken ganz nett
2. versuchs mal unter WM_COMMAND und nicht WM_SYSCOMMAND
3. Schreibt du in den cases immer ein return und am Ende des WM_ ein break, es gehört genau anders herumGreetz Tobi
-
1 Minute schrieb:
verdammt close tag vergessen:
"Ein" Post hätte trotzdem gereicht.
case WM_PAINT: return 0 ;Wer eine WM_PAINT abfängt, muss sie auch mit BeginPaint(...) EndPaint(...) verarbeiten, oder an DefWindowProc(..) weiter leiten.
Lösch die Zeilen und es funktioniert.
MfG Wally

-
T0bi schrieb:
3. Schreibt du in den cases immer ein return und am Ende des WM_ ein break, es gehört genau anders herum
Greetz TobiDa geb ich dir so nicht recht, für die WM_* Nachrichten sollte man den Wert zurückgeben den MS in der MSDN empfiehlt, man kann auch andere Werte returnieren z.B. DefWindowProc(..), aber dann sollte man schon wissen was man macht und warum man es so macht.
-
@case case
Man "muss" DefWindowsProc(..) zurückgeben, wenn man die Nachricht nicht behandelt bzw. eine Begin-/EndPaint(..) Kombi aufruft. Wenn man Sie behandelt kann man eigentlich zurückgeben, was man möchte.
MfG Wally
-
danke Wally ohne WM_PAINT gehts.