Verzweiflung



  • Hallo,

    ich sitze jetz schon geschlagene 2std vor meinem Problem.

    Hier mal der Quellcode:

    class Fenstererstellung
    {
    public:
    	 Fenstererstellung ();
    	~Fenstererstellung ();
    
    	HWND Parentwindow ();
    
    	LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, 
    							 WPARAM wParam, LPARAM lParam);
    
    	int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst,
    					LPSTR lpCmdLine, int ncmdshow);
    
    private:
    	HINSTANCE hInst;
    	HWND hWnd;
    	MSG message;
    	WNDCLASSEX wndEx;
    
    };
    
    int WINAPI Fenstererstellung::WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int ncmdshow)
    {
    	hWnd = Parentwindow();
    
    	while (GetMessage (&message, NULL, 0, 0))
    	{
    		TranslateMessage (&message);
    		DispatchMessage (&message);
    	}
    
    	return (int)(message.wParam);
    }
    
    LRESULT CALLBACK Fenstererstellung::WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	switch (message)
    	{
    	case WM_DESTROY:
    		PostQuitMessage (0);
    		return 0;
    		break;
    
    	case WM_COMMAND:
    		switch (wParam)
    		{
    		case ID_BTN_BEENDEN:
    			PostQuitMessage (0);
    			return 0;
    			break;
    
    		case ID_BTN_DATSAVE:
    			return 0;
    			break;
    		}
    	}
    
    	return (DefWindowProc (hWnd, message, wParam, lParam));
    }
    
    HWND Fenstererstellung::Parentwindow(HINSTANCE hInst)
    {
    	wndEx.cbSize = sizeof(WNDCLASSEX);
    
    	wndEx.style = CS_HREDRAW | CS_VREDRAW;
    
    	wndEx.lpfnWndProc = WindowProc;
    
    	wndEx.cbClsExtra = 0;
    	wndEx.cbWndExtra = 0;
    
    	wndEx.hInstance = hInst;
    
    	wndEx.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    	wndEx.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    	wndEx.hCursor = LoadCursor (NULL, IDC_ARROW);
    
    	wndEx.hbrBackground = (HBRUSH)COLOR_BACKGROUND +1;
    
    	wndEx.lpszMenuName = NULL;
    
    	wndEx.lpszClassName = "";
    
    	if(!RegisterClassEx (&wndEx) )
    		return (NULL);
    
    	hWnd = CreateWindowEx (NULL,
    						   "",
    						   "TEST",
    						   WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE,
    						   CW_USEDEFAULT, CW_USEDEFAULT,
    						   500, 509,
    						   NULL,
    						   NULL,
    						   hInst,
    						   NULL);
    
    	return (hWnd);
    
    }
    

    Kompilerfehler:

    ...\fenstererstellung.cpp(56): error C3867: "Fenstererstellung::WindowProc": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&Fenstererstellung::WindowProc", um einen Zeiger auf den Member zu erstellen.
    
    ...\fenstererstellung.cpp(56) : error C2440: '=': 'LRESULT (__stdcall Fenstererstellung::* )(HWND,UINT,WPARAM,LPARAM)' kann nicht in 'WNDPROC' konvertiert werden
    1>        Es gibt keinen Kontext, in dem diese Konvertierung möglich ist
    

    Könntet mir einer sagen was daran falsch ist??? 😕

    Gruß



  • geht

    wndEx.lpfnWndProc = WindowProc;
    

    ?



  • Fenstererstellung::WindowProc
    

    sollte als 'static' deklariert werden. Ansonsten passt die Parameterliste nicht, weil der erste Parameter in Klassenfunktionen immer 'this' ist.



  • @volkard

    geht
    C/C++ Code:
    wndEx.lpfnWndProc = WindowProc;
    C/C++ Code:
    wndEx.lpfnWndProc = WindowProc;
    C/C++ Code:
    wndEx.lpfnWndProc = WindowProc;

    ?

    Hab ich eh gemacht ?!

    @sri

    ich habs mal so gemacht, haut aber nicht hin:

    static LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, 
    							 WPARAM wParam, LPARAM lParam);
    


  • Ist WindowProc ein reservierter Begriff? Hilft das Umbenennen zu MyWindowProc?



  • Es kommt zwar der vorherige Kompilerfehler nicht mehr, aber nun erscheint dieser:

    1>MSVCRTD.lib(crtexew.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_WinMain@16" in Funktion "___tmainCRTStartup".
    
    1>... : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
    

    😕

    ich versteh das nicht, ich hab schon zig Fenster erstellt, nur bei diesem hakts 😕
    kann das was damit zu tun haben, dass ich alles in einer Klasse definiert hab?

    Gruß



  • Mit der WinMain in der Fensterklasse kann der Linker nichts anfangen. Er braucht eine eigenständige WinMain-Funktion.



  • Jetz passts, danke 🙂


Anmelden zum Antworten