Fehler schon im Grundgerüst



  • Hallo.

    Ich will grad ein Programm schreiben und habe das Grundgerüst erschaffen und schon da kommt ne Fehlermeldung.
    Ich habe den Code 1 zu 1 aus dem Buch (Petzold) abgeschrieben und aus irgendeinem Grund wird die MessageBox, ausgelöst, die nach dem Registrieren der Fensterklasse bei einem Fehler kommt. Hier der Code

    #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("MessageTest");
    	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.lpszMenuName = NULL;
    	wndclass.lpszClassName = szAppName;
    
    	if(!RegisterClass (&wndclass))
    	{
    		MessageBox(NULL, TEXT("Fehler beim initialisieren."), szAppName, MB_ICONERROR);
    		return 0;
    	}
    
    	hwnd = CreateWindow (szAppName,
    						 szAppName,
    						 WS_OVERLAPPEDWINDOW,
    						 100, 
    						 100,
    						 600,
    						 400,
    						 NULL,
    						 NULL,
    						 hInstance,
    						 NULL);
    
    	ShowWindow(hwnd, iCmdShow);
    	UpdateWindow(hwnd);
    
    	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_COMMAND:
    
    		return 0;
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		return 0;
    	}
    	return DefWindowProc(hwnd, message, wParam, lParam);
    }
    

    Wo ist denn da der Fehler? Oder liegt es eher an meinem PC?

    Grüße
    Max



  • memset(&wndclass,0,sizeof(wndclass)); mal davor machen bzw. wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);



  • Du musst alle Elemente der Struktur 'WNDCLASS' besetzen. Die, die Du nicht explizit initialisierst, musst Du auf 0 setzen. Des weiteren solltest Du beim Element 'hbrBackground' einen Brush angeben, da Dein Fenster sonst keinen eigenen Hintergrund hat, da ist aber auch experimentieren gefragt 😉 .
    So geht es:

    #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("MessageTest");
        HWND hwnd;
        MSG msg;
    	WNDCLASS wndclass = { 0 };
    
        wndclass.style = CS_HREDRAW | CS_VREDRAW;
        wndclass.lpfnWndProc = WndProc;
        wndclass.hInstance = hInstance;
        wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
        wndclass.lpszClassName = szAppName;
    	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    
        if(!RegisterClass (&wndclass))
        {
            MessageBox(NULL, TEXT("Fehler beim initialisieren."), szAppName, MB_ICONERROR);
            return 0;
        }
    
        hwnd = CreateWindow (szAppName,
                             szAppName,
                             WS_OVERLAPPEDWINDOW,
                             100,
                             100,
                             600,
                             400,
                             NULL,
                             NULL,
                             hInstance,
                             NULL);
    
        ShowWindow(hwnd, iCmdShow);
        UpdateWindow(hwnd);
    
        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_COMMAND:
    
            return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        }
        return DefWindowProc(hwnd, message, wParam, lParam);
    }
    


  • CodeFinder du bist zu lahm



  • Na eben.
    🙂
    Danke



  • CodeGrinder schrieb:

    CodeFinder du bist zu lahm

    Meine Erklärungen waren aber ausführlicher :p .


Anmelden zum Antworten