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 😃
    mit

    if (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 😃
    mit

    if (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 😃
    mit

    if (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? 😕


Log in to reply