Kein Fenstertitel bei CreateWindowEx()?



  • Hallo,

    ich bin ein bisschen am Verzweifeln. Ich versuche ein Fenster zu erzeugen mit Hilfe von CreateWindowEx(). Das Fenster erscheint, inkl. aller Schaltflächen. Aber der Fenstertitel wird nicht angezeigt.

    Eine Suche im Netz hat nichts ergeben, ich konnte meinen Fehler bisher nicht identifizieren. Kann irgendjemand helfen?

    Vielen Dank im Voraus

    Hier ist mal ein einfacher Quelltext:

    #include <Windows.h>
    
    #include <exception>
    
    #define classname "MainWindow"
    
    LRESULT CALLBACK windowProcedure(HWND _handle, UINT _message, WPARAM _wParam, LPARAM _lParam);
    
    int WINAPI WinMain(HINSTANCE _handle, HINSTANCE /*_handle*/, PSTR /*_szCmdLine*/, int /*_iCmdShow*/)
    {
    	WNDCLASSEX _windowClass = { 0 };
    	MSG _windowMessage = { 0 };
    
    	_windowClass.cbSize = sizeof(WNDCLASSEX);
    	_windowClass.style = (CS_HREDRAW | CS_VREDRAW);
    	_windowClass.lpfnWndProc = windowProcedure;
    	_windowClass.cbClsExtra = 0;
    	_windowClass.cbWndExtra = 0;
    	_windowClass.hInstance = _handle;
    	_windowClass.hIcon = LoadIcon(_handle, IDI_APPLICATION);
    	_windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    	_windowClass.hbrBackground = (HBRUSH)(COLOR_WINDOWFRAME);
    	_windowClass.lpszMenuName = NULL;
    	_windowClass.lpszClassName = classname;
    	_windowClass.hIconSm = LoadIcon(_handle, IDI_APPLICATION);
    
    	if (!RegisterClassEx(&_windowClass))
    	{
    		MessageBox(NULL, "Window Registration Failed!", "Error!", (MB_ICONEXCLAMATION | MB_OK));
    	}
    	else
    	{
    		HWND _windowHandle = CreateWindowEx(WS_EX_WINDOWEDGE, classname, "Fenstertitel",
    			WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
    			NULL, NULL, _handle, NULL);
    
    		if (_windowHandle)
    		{
    			ShowWindow(_windowHandle, SW_SHOW);
    		}
    	}
    
    	while (GetMessage(&_windowMessage, NULL, 0, 0))
    	{
    		TranslateMessage(&_windowMessage);
    		DispatchMessage(&_windowMessage);
    	}
    
    	return 0;
    }
    
    LRESULT CALLBACK windowProcedure(HWND _handle, UINT _message, WPARAM _wParam, LPARAM _lParam)
    {
    	switch (_message)
    	{
    		case WM_CREATE:
    		{
    			return false;
    		}
    		case WM_DESTROY:
    		{
    			PostQuitMessage(0);
    			return false;
    		}
    		case WM_NCCREATE:
    		{
    			SetWindowLongPtr(_handle, GWLP_USERDATA, (LONG_PTR)((CREATESTRUCT *)_lParam)->lpCreateParams);
    
    			return true;
    		}
    	}
    
    	return DefWindowProc(_handle, _message, _wParam, _lParam);
    }
    

    lg Torsten



  • Entferne einfach das "return true;" aus Deinem WM_NCCREATE-Handler. DefWindowProc sorgt dann dafür, dass Dein Titel wieder sichtbar wird.



  • In WM_NCCREATE musst du DefWindowProc aufrufen. Ersetze den return-Wert auf

    return DefWindowProc(_handle, _message, _wParam, _lParam);
    

    Du solltest außerdem dringend in der MSDN nachschlagen, welche Rückgabewerte welche Bedeutung in den Windows-Messages haben. Bei WM_CREATE false zurückzugeben ist zumindest abstrus, denn es wird z.B. 0 oder -1 erwartet.



  • Oh super,

    vielen Dank euch beiden. Ich werde die Doku mal genauer studieren.

    lg Torsten


Log in to reply