Problem mit Klasse zur Fensteranzeige



  • Ich habe mir eine Klasse Programmiert, mit der man ein Fenster erstellen kann.
    Es gibt beim Linken und Compillieren keinerlei Fehlermeldungen. Das Fenster wird allerdings nicht angezeigt!!
    Ich weiß allerdings nicht woran es liegt. Was soll ich jetzt machen soll ich den ganzen Quelltext posten oder wie könnte ich dieses Problem lösen?



  • Eventuell hast du ein ShowWindow vergessen, aber um genaue Aussagen zu treffen,
    wäre der Quellcode sinnvoll.



  • OK
    Hier kommt der Code:

    main.cpp

    #include <windows.h>
    #include "cWindowMain.hpp"
    #include "WndProc.hpp"
    
    int WINAPI WinMain(HINSTANCE  hInstance, HINSTANCE hPRrevInstance, LPSTR lpCmdLine, int iShowCmd)
    {
    	MSG msg;
    	WNDCLASS wndclass;
    
    	wndclass.style  =CS_HREDRAW | CS_VREDRAW;
    	wndclass.cbClsExtra=0;
    	wndclass.cbWndExtra=0;
    	wndclass.hInstance = hInstance;
    	wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    	wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
    	wndclass.hbrBackground=(HBRUSH) GetStockObject (WHITE_BRUSH);
    	wndclass.lpszMenuName=NULL;
    	wndclass.lpszClassName = TEXT("new");
    
    	cWindowMain *Form;
    	Form = new cWindowMain (hInstance,wndclass);
    	if(Form->createWindow())
    	{
    		Form->show();
    	};
    	while(GetMessage (&msg, NULL, 0, 0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    	return msg.wParam;
    };
    

    cWindow.hpp

    #include <windows.h>
    
    class cWindow
    {
    protected:
    	LPCWSTR szAppName;
    	HWND hWnd;
    	HINSTANCE  hInst;
    	int iShowCmd;
    };
    

    cWindowMain.hpp

    #include "cWindow.hpp"
    
    class cWindowMain:public cWindow
    {
    private:
    	WNDCLASS wndclass;
    public:
    	cWindowMain::cWindowMain(HINSTANCE hInstance,WNDCLASS windowclass, int ishowcmd);
    	bool createWindow();
    	void show();
    };
    

    cWindowMain.cpp

    #include "cWindowMain.hpp"
    #include "WndProc.hpp"
    
    cWindowMain::cWindowMain(HINSTANCE hInstance,WNDCLASS windowclass, int ishowcmd)
    {
    	hInst=hInstance;
    	wndclass=windowclass;
    	wndclass.lpfnWndProc=WndProc;
            iShowCmd=ishwocmd;
    };
    
    bool cWindowMain::createWindow()
    {
    	if(!RegisterClass(&wndclass))
    	{
    		MessageBox (NULL, TEXT("Programm arbeitet mit Unicode und setzt Windows NT voraus!"),
    					TEXT("Fenster"), MB_ICONERROR);
    		return 0;
    	};
    	hWnd = CreateWindowEx(NULL,
    						TEXT("new"),
    						TEXT("Das erste Fenster"),
    						WS_OVERLAPPEDWINDOW|WS_VSCROLL,
    						CW_USEDEFAULT,
    						CW_USEDEFAULT,
    						CW_USEDEFAULT,
    						CW_USEDEFAULT,
    						NULL,
    						NULL,
    						hInst,
    						NULL);
    	if(hWnd)
    	{
    		return 0;
    	}
    	else
    	{
    		return 1;
    	};
    };
    
    void cWindowMain::show()
    {
    	ShowWindow(hWnd, iShowCmd);
    	UpdateWindow(hWnd);
    };
    

    und dann hab ich noch 2 extra Dateien mit der Windows-Procedur:

    WndProc.hpp

    #include <windows.h>
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
    

    WndProc.cpp

    #include "WndProc.hpp"
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	HDC hdc;
    	PAINTSTRUCT ps;
    	RECT rect;
    	TEXTMETRIC tm;
    	static int cxChar, cxCaps, cyChar, cxClient, cyClient, iMaxWidth;
    
    	switch(message)
    	{
    	case WM_CREATE:
    		{
    			hdc=GetDC(hwnd);
    			GetTextMetrics(hdc,&tm);
    			cxChar = tm.tmAveCharWidth;
    			cxCaps = (tm.tmPitchAndFamily & 1 ? 3:2)+cxChar/2;
    			cyChar = tm.tmHeight+tm.tmExternalLeading;
    			ReleaseDC(hwnd, hdc);
    			return 0;
    		}
    	case WM_PAINT:
    		{
    			hdc=BeginPaint(hwnd, &ps);
    			GetClientRect(hwnd, &rect);
    
    			TextOut(hdc, 50,10, TEXT("Hi"),2);
    
    			EndPaint(hwnd, &ps);
    			return 0;
    		}
    	case WM_DESTROY:
    		{
    			PostQuitMessage(0);
    			return 0;
    		}
    	default:
    		{
    			return DefWindowProc(hwnd, message, wParam, lParam);
    		}
    	}
    };
    

    Falls jemand so viel Langweile hat das er sich das alles ankucken kann und mir helfen kann wäre das super!
    😉



  • 1. Deine registrierte Fensterklasse heißt weder "Schei**e" noch "KACke" oder "Kake", sondern "new".

    2. Member "iShowCmd" wird nirgendwo initialisiert. Ein "schlauer" Compiler setzt ihn deshalb meistens auf 0. Was heißt (lt. winuser.h) SW_HIDE.

    3. "if (hWnd) { return 0; } else { return 1; }" bedeutet : Falls "hWnd" gültig ist, wird "FALSE" (also schiefgegangen oder ungültig) zurückgeliefert.



  • -1-2-3- schrieb:

    2. Member "iShowCmd" wird nirgendwo initialisiert. Ein "schlauer" Compiler setzt ihn deshalb meistens auf 0. Was heißt (lt. winuser.h) SW_HIDE.

    Nein, der C++-Standard besagt, dass iShowCmd in uninitialisiertem Zustand verbleibt. Es könnte sein, dass hier eine Null entsteht, aber schlau ist der Compiler deswegen nicht.

    MfG,

    Probe-Nutzer



  • Ach genau das hatte ich eigentlich schon versucht bei der Basis Klasse zu übergeben das hab ich dann aber vergessen!

    Thx



  • OK es funktioniert!



  • Noch 2 Anmerkungen.

    cWindowMain *Form;
    	Form = new cWindowMain (hInstance,wndclass);
    

    Halte dich möglichst immer an RAII. Auch wenn der Compiler im Beispiel idR keinen unterschiedlichen Code erzeugt, an anderer Stelle kann das durchaus passieren, und zwar nachteilig. Besser:

    cWindowMain *Form = new cWindowMain (hInstance,wndclass);
    

    Und noch einfacher, du verzichtest auf die dynamische Instantiierung, da du sowieso delete vergessen hast. Das sind einfache und vermeidbare Fehler.

    cWindowMain Form(hInstance,wndclass);
    
    if(hWnd)
    	{
    		return 0;
    	}
    	else
    	{
    		return 1;
    	};
    

    Mal abgesehen vom angesprochen Fehler in der Logik, wenn du bool verwendest, solltest du auch die dazugehörigen Literale verwenden, also true und false. Noch einfacher ist es, du nutzt gleich boolsche Logik.

    return hWnd != NULL;
    


  • Vielen Dank groovemaster 👍
    Das mit dem Initialiesieren hätte ich eigentlich wissen müssen.
    Warum ich 0 und 1 genommen habe weiß ich auch nicht so genau!


Anmelden zum Antworten