Ich brauch hilfe und weis nicht weiter :/



  • Da ich ja wie gesagt n anfänger bin hab ichs mal so versucht

    #include <Windows.h>
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    const LPCWSTR szAppName = L"Fenster";
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {
    	HWND		hWnd;							// Handel
    	MSG			msg;							// wnd nachrichten abholen und bearbeiten
    	WNDCLASS	wndcl;							// typ der fensterklasse
    
    	wndcl.style			= CS_HREDRAW | CS_VREDRAW; //Horizontal Vertikal Zeichnen 
    	wndcl.lpfnWndProc	= WndProc;				   //Zeiger auf Adresse der Fkt die Nachrichtenbearbeitung übernimmt
    	wndcl.cbClsExtra	= 0 ;
    	wndcl.cbWndExtra	= 0;
    	wndcl.hInstance		= hInstance;			// Übergabe des Handels auf unsere Programminstanz das nur unser Programm diese Fensterklasse Nutzen kann
    	wndcl.hCursor		= LoadCursor(NULL,IDC_ARROW);// CursorTyp -> Cursor Laden 
    	wndcl.hIcon			= LoadIcon(NULL,IDI_APPLICATION);// Icon -> Icon Laden
    	wndcl.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); // Hintergrund -> (HBRUSH)ist ein Typecast der in c++ den Rückgabewerttyp ändern muss
    	wndcl.lpszClassName = szAppName;			// Fensterklassenname
    	wndcl.lpszMenuName  = NULL;					// MenÜ -> keins
    
    	ATOM test;
    	RegisterClass(&wndcl);	//registriert bzw. meldet unsere Fensterklasse beim Fenstermanager von Windows an
    	test = RegisterClass(&wndcl);
    
    	if(test == 0)
    	{
    				MessageBox(NULL, L"Fail Registerclass",
                           L"Fail",
                           MB_ICONINFORMATION | MB_OK | MB_DEFBUTTON1);
    	}
    
    	hWnd = CreateWindow(szAppName,			   //Name der Fensterklasse
    						L"abc",				   //Text in Titelleiste
    						WS_OVERLAPPEDWINDOW,   //Stil des Fensters
    						CW_USEDEFAULT,		   //X-Position auf dem Monitor 
    						CW_USEDEFAULT,		   //Y-Position auf dem Monitor 
    						CW_USEDEFAULT,		   //Fensterbreite
    						CW_USEDEFAULT,		   //Fensterhöhe
    						NULL,
    						NULL,
    						hInstance,			   //damit man das Fenster unserem Programm zuordnen kann
    						NULL);
    
    	if(NULL == hWnd)
    	{
    		MessageBox(NULL, L"Fail CreateWindow",
                           L"Fail",
                           MB_ICONINFORMATION | MB_OK | MB_DEFBUTTON1);
    	}
    
    	ShowWindow(hWnd, iCmdShow);			//zeigt Fenster -> 2ter prameter legt fest wie das fenster angezeigt werden soll geht z.B. auch (SW_SHOW)
    	UpdateWindow(hWnd);					//lässt den Anwendungsbereich, also den freien Fensterbereich, sofort nach dem Start neu zeichnen.
    
    										// Schleife -> Warten auf aktivität des benutzers wenn etwas passiert informiert und windows über eine nachricht
    	while(GetMessage(&msg,NULL,0,0))   //GetMessage -> Solange Rückgabewert != NULL -> NULL = Wenn Programm durch den Aufruf von PostQuitMessage beendet werden soll   wenn keine nachricht vorhanden wartet unsere schleife einfach
    	{									//GetMessage -> 1. Parameter Hier wird die nachricht gespeichert 
    										//				2. Parameter ??? Im zweiten Parameter können wir uns auf das Abholen von Nachrichten für nur ein Fenster beschränken. Wenn wir dies wollten, müssten wir hier den Handle des Fensters eintragen. Jedoch würde dann unser Programm nicht korrekt beenden, da zum Beispiel die Nachricht, die PostQuitMessage sendet nicht für unser Fenster bestimmt ist, da dies ja schon zerstört wurde.
    										//				3.u 4. Parameter welche art der nachrichten abgeholt wird Alle nachriten zwischen parameter 3 und 4 auser bei 0 0 da werden alle abgeholt
    	TranslateMessage(&msg);				//	Verarbeitung von Tasterturnachrichten
    	DispatchMessage(&msg);				//	verteilt die Nachrichten an die jeweilige Windows Prozdeur auch WndProc
    	}
    
    	return msg.wParam;  // wParam = die letzte nachricht die GetMessage bearbeitet hat
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message,WPARAM wParam, LPARAM lParam) //bearbeitet alle Nachrichtenfür unsere Fensterklasse
    {
    	switch (message)	// Welche Nachricht hat uns Windows oder ein anderes Fenster geschickt 
    	{
    	case WM_DESTROY:    //Wenn die Nachricht vom Typ WM_DESTROY is 
    		{						// Parameter von PostQuitMessage wird später als Rückgabewert der WinMain Funktion benutzt
    			PostQuitMessage(0);	// senden wir mithilfen von PostQuitMessage die Nachricht WM_QUIT -> GetMessage Funktion Beendet das Programm
    			return 0;	//Wenn wir eine nachricht bearbeitet haben beenden wir die WndProc Fkt mit dem wert 0
    		}
    
    		return DefWindowProc(hWnd, message, wParam, lParam); // alle Nachrichten werden mit einer standard Bearbeitung behandelt übergabe der WndProc Fkt in die DefWindowProc
    	}
    }
    

    Und die RegisterClass gibt den wert null zurück der laut mdsn dort ein fehler ist

    If the function fails, the return value is zero.

    Aber was ich jetzt machen soll weis ich leider immer noch nicht 😕



  • Genau, ruf am besten einfach zwei mal hintereinander RegisterClass auf, das hilft bestimmt!



  • So hab jetzt nochmal die oben drüber weggelassen jetzt wird die RegisterClass Funktion nur noch 1 mal auf gerufen aber jetzt gibts auch keinen fehler mehr

    Funktioniert aber immer noch net *_*



  • Das return DefWindowProc(hWnd, message, wParam, lParam); ganz am Ende muss hinter die Klammer vom switch. Oder sehe ich das was falsch? Eigentlich dürfte das doch nicht einmal kompilieren, weil die Funktion nicht immer einen Wert zurückgibt, die Zeile würde höchstens ausgeführt werden, falls message == WM_DESTROY. Allerdings gibt es vorher ja schon ein anderes return.



  • So da bin ich nochmal ich hab jetzt das return DefWindowProc mal hinter die switch klammern gesetzt und jetzt geht es aber jetzt gibts n anders problem das fenster schlißt sich einfach so nach c.a. 1-2 sekunden 😮



  • phileman schrieb:

    So da bin ich nochmal ich hab jetzt das return DefWindowProc mal hinter die switch klammern gesetzt und jetzt geht es aber jetzt gibts n anders problem das fenster schlißt sich einfach so nach c.a. 1-2 sekunden 😮

    MSG msg;
        while ( PeekMessage(&msg, 0, 0, 0, PM_REMOVE) )
        {
            if (msg.message == WM_QUIT)
                break;
    
           TranslateMessage(&msg);
           DispatchMessage(&msg);        
        }
    

    Probier mal das hier als Message Pumpe.



  • Scorcher24 schrieb:

    MSG msg;
        while ( PeekMessage(&msg, 0, 0, 0, PM_REMOVE) )
        {
            if (msg.message == WM_QUIT)
                break;
    
           TranslateMessage(&msg);
           DispatchMessage(&msg);        
        }
    

    Ohne es getestet zu haben: Ich denke nicht, dass dies funktioniert. PeekMessage liefert 0 zurück, wenn keine Nachricht mehr in der Queue ist, und dies ist nach recht kurzer Zeit das erste Mal der Fall.
    Also entweder sowas wie

    for(;;)
    {
    	while ( PeekMessage(&msg, 0, 0, 0, PM_REMOVE) )
    	{
    		if (msg.message == WM_QUIT)
    			return msg.wParam;
    
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);   
    	} 	
    }
    

    , was die Prozessorlast natürlich unnötig in die Höhe treibt (okay, man könnte auch beim Peeken noch ein WaitMessage einbauen, dies würde aber PeekMessage ad absurdum führen), oder eben GetMessage, was für die meisten Anwendungen besser geeignet ist.

    Ich sehe bei dem Code, sofern der Aufruf von DefWindowProc am Funktionsende steht, auch keinen Fehler. Hast du vielleicht einige Abfragen im switch-Block hinzugefügt und ein break/return vergessen, sodass der Code im WM_DESTROY-Zweig noch ausgeführt wird?



  • yahendrik schrieb:

    Scorcher24 schrieb:

    MSG msg;
        while ( PeekMessage(&msg, 0, 0, 0, PM_REMOVE) )
        {
            if (msg.message == WM_QUIT)
                break;
    
           TranslateMessage(&msg);
           DispatchMessage(&msg);        
        }
    

    Ohne es getestet zu haben: Ich denke nicht, dass dies funktioniert. PeekMessage liefert 0 zurück, wenn keine Nachricht mehr in der Queue ist, und dies ist nach recht kurzer Zeit das erste Mal der Fall.
    Also entweder sowas wie

    for(;;)
    {
    	while ( PeekMessage(&msg, 0, 0, 0, PM_REMOVE) )
    	{
    		if (msg.message == WM_QUIT)
    			return msg.wParam;
    
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);   
    	} 	
    }
    

    , was die Prozessorlast natürlich unnötig in die Höhe treibt (okay, man könnte auch beim Peeken noch ein WaitMessage einbauen, dies würde aber PeekMessage ad absurdum führen), oder eben GetMessage, was für die meisten Anwendungen besser geeignet ist.

    Ich sehe bei dem Code, sofern der Aufruf von DefWindowProc am Funktionsende steht, auch keinen Fehler. Hast du vielleicht einige Abfragen im switch-Block hinzugefügt und ein break/return vergessen, sodass der Code im WM_DESTROY-Zweig noch ausgeführt wird?

    Achso stimmt, ich führ das ja in einer anderen schleife noch aus >>.
    Sorry mein Fehler.
    Hab nicht dran gedacht >
    >.
    Bin a bissl verplant heute scheinbar.



  • Also jetzt hab ichs ... ganz einfach ... Microsoft ist Dähmlich 😃 warum ? 😮 ... ganz einfach ich hab einfach nochnmal ein neues projekt angefangen ... und was passiert 😮 es geht ohne macken ich will ja nix sagen aber für welle die des lernen is das sicher netgeeignet xD

    Aber ich möchte mich trozdem für eure hilfe bedanken 😃



  • Der Fehler sitzt in 99% der Fälle zwischen Tastatur und Stuhllehne, d.h. 1% Warscheinlichkeit dass Microsoft dämlich ist, 99% Wahrscheinlichkeit, dass du dämlich bist.


Anmelden zum Antworten