none
WINAPI Einstieg - Form öffnet sich nicht RRS feed

  • Frage

  • Hallo,

    Ich habe heute damit angefangen, mir die WINAPI ein bisschen näher anzuschauen.
    Die Erstellung einer MessageBox lief noch ohne Probleme ab, jedoch öffnet sich bei meiner nächsten Aufgabe keine Form und ich weiß leider nicht wo das Problem liegt.

    Hier ist der Code:

    #define STRICT
    
    #include <windows.h>
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    const char szAppName[] = "Textausgabe im Anwendungsbereich";
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    	PSTR szCmdLine, int iCmdShow)
    {
    	MSG        msg;
    	HWND       hWnd;
    	WNDCLASS   wc;
    
    	wc.style = CS_HREDRAW | CS_VREDRAW;
    	wc.lpfnWndProc = WndProc;
    	wc.cbClsExtra = 0;
    	wc.cbWndExtra = 0;
    	wc.hInstance = hInstance;
    	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    	wc.lpszClassName = TEXT("mfkads");
    	wc.lpszMenuName = NULL;
    
    	RegisterClass(&wc);
    
    	hWnd = CreateWindow(TEXT("HAH"),
    		TEXT("JDASD"),
    		WS_OVERLAPPEDWINDOW,
    		CW_USEDEFAULT,
    		CW_USEDEFAULT,
    		CW_USEDEFAULT,
    		CW_USEDEFAULT,
    		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_DESTROY:
    			PostQuitMessage(0);
    			return 0;
    		}
    
    		return DefWindowProc(hWnd, message, wParam, lParam);
    	}
    
    
    	
    

    Ich hoffe ihr könnt mir helfen ^^
    Vielen Dank schonmal im Vorraus!

    MfG
    TyingToCode

    Sonntag, 18. Januar 2015 13:14

Antworten

  • Hi!

    Gewöhne Dir an, Rückgabewerte zu prüfen. Im Fehlerfall liefert CreateWindow nämlich kein HWND, sondern NULL. Und wenn Du NULL erhälst, kannst Du mit GetLastError erfahren, was genau geklemmt hat. Des weiteren solltest Du im Fehlerfall gar nicht erst Deine Message-Pump laufen lassen, da diese sonst nicht beendet wird.

    In Deinem speziellen Fall: CreateWindow erwartet als ersten Parameter den Namen einer registrierten Fensterklasse. Allerdings ist "HAH" keine solche. Versuch's stattdessen mal so:

       hWnd = CreateWindow(wc.lpszClassName,
            TEXT("JDASD"),
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            NULL,
            NULL,
            hInstance,
            NULL);
    

    Sonntag, 18. Januar 2015 14:49

Alle Antworten

  • Hallo,

    vielleicht kann dir dieser Artikel weiterhelfen. Er erklärt das erstellen eines Fensters und gibt sogar Beispielcode: Erstellen von Win32-Anwendungen (C++)


    © 2015 Thomas Roskop

    Germany // Deutschland

    Sonntag, 18. Januar 2015 13:52
  • Hi!

    Gewöhne Dir an, Rückgabewerte zu prüfen. Im Fehlerfall liefert CreateWindow nämlich kein HWND, sondern NULL. Und wenn Du NULL erhälst, kannst Du mit GetLastError erfahren, was genau geklemmt hat. Des weiteren solltest Du im Fehlerfall gar nicht erst Deine Message-Pump laufen lassen, da diese sonst nicht beendet wird.

    In Deinem speziellen Fall: CreateWindow erwartet als ersten Parameter den Namen einer registrierten Fensterklasse. Allerdings ist "HAH" keine solche. Versuch's stattdessen mal so:

       hWnd = CreateWindow(wc.lpszClassName,
            TEXT("JDASD"),
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            NULL,
            NULL,
            hInstance,
            NULL);
    

    Sonntag, 18. Januar 2015 14:49