Problem mit erstem WinAPI Programm
-
Hallo.
Ich habe heute endlich mit der WinAPI Programmierung begonnen.
Dabei habe ich versucht mir einfach ein Fenster zu öffnen, jedoch öffnet sich kein. Visual C++ bleibt nur im debugmode.
Kann jemand den Fehler im folgenden Code finden? Ich finde ich einfach nicht.//MAIN_CPP #include <Windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); const char szClassName[] ="RechnerClass"; char szTitle[] ="Rechner"; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow) { HWND hWnd; WNDCLASSEX WndClassEx; MSG msg; //========REGISTRIERUNG========// WndClassEx.cbSize = sizeof(WndClassEx); WndClassEx.style = NULL; WndClassEx.lpfnWndProc = WndProc; WndClassEx.cbClsExtra = NULL; WndClassEx.cbWndExtra = NULL; WndClassEx.hInstance = hInstance; WndClassEx.hIcon = NULL; WndClassEx.hCursor = NULL; WndClassEx.hbrBackground = (HBRUSH)(COLOR_BACKGROUND+1); WndClassEx.lpszMenuName = NULL; WndClassEx.lpszClassName = szClassName; //Name des Prgrammes WndClassEx.hIconSm = NULL; if (!RegisterClassEx (&WndClassEx)) { MessageBox(NULL,"RegisterClass failed","Error",MB_OK); return false; }; //========FENSTER ERSTELLEN========// hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, szClassName, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); if (hWnd=NULL) { MessageBox(NULL,"Create Window failed","Error",MB_OK); }; ShowWindow(hWnd,iCmdShow); while(GetMessage(&msg,hWnd,NULL,NULL) > NULL) { TranslateMessage(&msg); DispatchMessage(&msg); }; return 0; } LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_QUIT: { MessageBox(NULL,"Programm wurde beendet","Programm Ende",MB_OK); DestroyWindow(hWnd); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd,msg,wParam,lParam); } }
Ich wäre echt dankbar.
MfG Crysis
-
while(GetMessage(&msg,hWnd,NULL,NULL) > NULL)
'NULL' hat hier eigtl. nichts verloren. Der Rueckgabewert ist ein BOOL. Abgesehen davon kann der Rueckgabewert von GetMessage auch negativ (kleiner als 0) sein.
GetMessage gibt 0 zurueck, wenn die Message WM_QUIT ist. Abgesehen davon gibt die Funktion noch -1 zurueck, wenn irgendein Fehler aufgetreten ist.
Hier ein Verbesserungsvorschlag:BOOL getmsgret; while((getmsgret = GetMessage(&msg,hWnd,NULL,NULL)) != 0) { if (getmsgret == -1) break; // oder Fehler behandeln TranslateMessage(&msg); DispatchMessage(&msg); };
Abgesehen von deinem Problem, hier noch ein Hinweis:
WM_QUIT wird niemals an WndProc uebergeben - siehe oben. Kannste also komplett aus WndProc streichen.
-
yannik?
-
hat leider auch nicht geholfen.
da passiert das selbe.
-
Bei
if (hWnd=NULL)
müsste der Compiler eigentlich ne Warnung erzeugen
-
nee. das geht alles.
also Visual C++ ist beim Debuggen und es wird mir kein Fenster angezeigt.btw. Kennt jemand ein gute Tutorial irgendwo online für die WinAPI?
-
du überschreibst das Fenster-Handle mit if(hWnd=NULL)
-
Bei Vergleichen gehört auf jedenfall ein == hin.
-
Also wenn du an
if (hWnd=NULL)
nichts ungewoehnlich findest ... dann solltest du dir nochmal die Grundlagen ansehen
Ansonsten ist die MSDN die beste Anlaufstelle, wenns um die WinAPI geht.
Kannst z.B. hier anfangen: http://msdn.microsoft.com/en-us/library/bb384843.aspx
-
Eric Cartman schrieb:
Also wenn du an
if (hWnd=NULL)
nichts ungewoehnlich findest ... dann solltest du dir nochmal die Grundlagen ansehen
Das werde ich glaub ich nicht tun.
War nur ein Rechschreibfehler. Jetzt funktioniert es komischer weise
mitif (hWnd==NULL)
-
Ich hätte gedacht, dass VC da direkt ne Warnung rausgibt. Das tut es scheinbar erst wenn man die Warnstufe auf "Level4 (/W4)" hochsetzt.
-
Crysis_02 schrieb:
Eric Cartman schrieb:
Also wenn du an
if (hWnd=NULL)
nichts ungewoehnlich findest ... dann solltest du dir nochmal die Grundlagen ansehen
Das werde ich glaub ich nicht tun.
War nur ein Rechschreibfehler. Jetzt funktioniert es komischer weise
mitif (hWnd==NULL)
Der Fehler passiert mir auch manchmal, da C und auch C++ hier nicht logisch mit dem Gleichheitsoperator umgehen. Warum man für Gleich == genommen hat und für eine Zuweisung = ist mir bis heute ein Rätsel und fern der Mathematik. Eine Zuweisung sollte in einer Programmiersprache nie mit einem Gleichheitszeichen geschehen, das := wie in Pascal ist zwar nicht schön aber weit aus logischer.
-
Crysis_02 schrieb:
Eric Cartman schrieb:
Also wenn du an
if (hWnd=NULL)
nichts ungewoehnlich findest ... dann solltest du dir nochmal die Grundlagen ansehen
Das werde ich glaub ich nicht tun.
War nur ein Rechschreibfehler. Jetzt funktioniert es komischer weise
mitif (hWnd==NULL)
Das hat mit WinApi wenig zu tun, weil C-Grundlagen: Zuweisungsoperator = und Vergleichsoperator ==
Komischerweise gibt es in der Programmierung nicht oder selten. Meist sind es eigene Fehler!
Das Gleichheitszeichen für eine Zuweisung (statt := in Pascal) wurde so gewählt, weil R&K schreibfaul waren und wir es doch auch sind.
-
GleichKeineZuweisung schrieb:
Der Fehler passiert mir auch manchmal, da C und auch C++ hier nicht logisch mit dem Gleichheitsoperator umgehen. Warum man für Gleich == genommen hat und für eine Zuweisung = ist mir bis heute ein Rätsel und fern der Mathematik. Eine Zuweisung sollte in einer Programmiersprache nie mit einem Gleichheitszeichen geschehen, das := wie in Pascal ist zwar nicht schön aber weit aus logischer.
An = für Zuweisung ist überhaupt nichts unlogisch.
Es mag für dich nicht stimmig sein, aber das macht es nicht unlogisch.
Deine Logik ist unlogisch.
-
Da zwischen Zuweisung = und Vergleich == unterschieden werden muss und da die Zuweisung häufiger vorkommt, ist die gewählte Konvention sehr sinnvoll und lässt sich mit logischem Denken vereinbaren.
Sind wir hier im Kindergarten?