Kürzester Code zur Fenstererzeugung?



  • Hey!

    Würde dieser Code ausreichen, um ein Fenster sauber zu erstellen und wieder freizugeben? Habe insbesondere HINSTANCE weggelassen, wann wäre das wichtig? Scheint ohne Probleme zu funktionieren:

    int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
    	WNDCLASS windowClass;
    
    	memset(&windowClass, 0, sizeof(windowClass));
    
    	windowClass.lpfnWndProc = MsgProc;
        windowClass.lpszClassName = "Main";
    
    	RegisterClass(&windowClass);
    
    	CreateWindow("Main", "Test", WS_SYSMENU | WS_VISIBLE, 100, 100, 200, 200, 0, 0, 0, 0);
    
    	MSG message = { 0 };
    
    	while(message.message != WM_QUIT)
        {
            if(PeekMessage(&message, 0, 0, 0, PM_REMOVE))
            {
                TranslateMessage(&message); 
                DispatchMessage(&message); 
            }
        }
    
    	UnregisterClass("Main", 0);
    }
    
    LRESULT WINAPI MsgProc(HWND windowHandle, UINT message, WPARAM wParam, LPARAM lParam) 
    {
    	switch(message)
    	{
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		break;
    	default:
    		return DefWindowProc(windowHandle, message, wParam, lParam);
    	}
    
    	return 0L;
    }
    

    MfG



  • wieso benutzt du bei der WNDCLASS memset, und bei der MSG die {0} initialisation?

    das spart 2 zeilen ein!!

    Und die auslastung sollte auch auf 100% sein, du musst bei peek message schon ein else einbauen und dort etwas machen(kann auch nur ein sleep sein)


  • Mod

    1. MSG muss nicht initialisiert werden.
    2.

    while(!GetMessage(&message, 0, 0, 0))
    {
        TranslateMessage(&message); 
        DispatchMessage(&message); 
    }
    

    Ist noch kürzer und erspart die 100% Prozessorlast!
    3. UnregisterClass kannst Du Dir bei Prozessende sparen.
    4. Es fehlt ein

    return msg.wParam;
    

    in WinMain



  • hmm

    #include <windows.h>
    
    LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    	if (message == WM_DESTROY) 
    	{ 
            PostQuitMessage(0);
    		return S_OK;
    	}
    	return DefWindowProc(hWnd, msg, wParam, lParam);
    } 	
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
    {
    	::WNDCLASSEX wcex = { 0 };
    	wcex.lpfnWndProc = MsgProc;
        wcex.lpszClassName = TEXT("wnd");
    	if (RegisterClassEx(&wcex) == 0 || CreateWindowEx(0, TEXT("wnd"), TEXT("Test"), WS_SYSMENU | WS_VISIBLE, -1, -1, 400, 400, NULL, NULL, hInstance, NULL) == NULL)
    		return -1;
    
    	MSG msg;
    	while (GetMessage(&msg, NULL, 0, 0) == FALSE)
        {
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
        }
    }
    

    solltest schon die Ex-Funktionen nutzen ... und ansonsten sollte nicht viel kürzer gehen ...


  • Mod

    @(D)Evil:
    1. Warum sollte man die Ex Funktionen verwenden, wenn man diese nicht benötigt? Sie sind ja nicht deprecated!
    2. Warum der return in WM_DESTROY.
    3. Warum S_OK, der hat hier gar nichts zu suchen. S_OK ist ein HRESULT returncode bzw. dem Standard Error Handling. Eher müsste hier 1 returniert werden oder irgendwas !=0. S_OK ist 0. Die Doku sagt aber:
    If an application processes this message, it should return zero.
    Dann kann man aber auch gleich in die DefWindowProc weiterlaufen.
    4. Auch bei Dir fehlt ein return aus dem WinMain. Diese Funktion returniert ein int.
    5. ==FALSE ist sicher, aber in meinen Augen verwirrend. !GetMessage ist in meinen Augen klarer.



  • Meine gelesen zu haben, man solle eher PeekMessage verwenden.
    In main() oder WinMain() wird ein return doch impliziert? Ansonsten, wozu? Gibt ja nichtmal ne Warnung wenn ichs weglass.

    Und bei while(!GetMessage(&message, 0, 0, 0)) schließt das Programm sofort wieder. Der Negationsoperator muss doch weggelassen werden.

    Und... muss man hInstance nun überhaupt verwenden oder kann man es gleich weglassen, sowohl für die windowClass als auch bei CreateWindow?

    MfG


  • Mod

    ceplusplus@loggedoff schrieb:

    Meine gelesen zu haben, man solle eher PeekMessage verwenden.

    Falsch. Das benötigt man nur, wenn man noch anderes zwischen drin braucht!

    ceplusplus@loggedoff schrieb:

    In main() oder WinMain() wird ein return doch impliziert? Ansonsten, wozu? Gibt ja nichtmal ne Warnung wenn ichs weglass.

    Ich bekomme sofort eine Compiler Warnung. Implizit ist hier nichts!

    ceplusplus@loggedoff schrieb:

    Und bei while(!GetMessage(&message, 0, 0, 0)) schließt das Programm sofort wieder. Der Negationsoperator muss doch weggelassen werden.

    Korrekt. Da habe ich mich vertan. Also wird es noch kürzer.

    ceplusplus@loggedoff schrieb:

    Und... muss man hInstance nun überhaupt verwenden oder kann man es gleich weglassen, sowohl für die windowClass als auch bei CreateWindow?

    Müsste IMHO definiert sein. Weil eine Fensterklasse als auch ein Fenster mit einem Modul zusammen definiert wird. Ist aber evtl. auch ein Relikt aus alten 16bit Zeiten. Da weder ein Menu noch sonstige Ressourcen im Spiel sind, würde ich sagen es geht auch ohne hInstance, aber gemäß Doku (wenn man es richtig machen will) müsste man hInstance schon setzen.


Anmelden zum Antworten