WM_SIZE wird vor WM_CREATE aufgerufen?



  • Nee, das funzt wieder nicht.
    Es scheint zu sein, dass:

    controller* pc = get_data<controller*>(hwnd);
    

    nicht 0 zurückgibt. Kann man es im Voraus auf 0 setzen?


  • Mod

    Kann nicht sein:

    Siehe Doku zu GetWindowLong:

    If the function succeeds, the return value is the requested 32-bit value.

    If the function fails, the return value is zero. To get extended error information, call GetLastError.

    If SetWindowLong has not been called previously, GetWindowLong returns zero for values in the extra window or class memory.



  • Kann es sein, dass die WNDCLASS Struktur oder CreateWindow nicht korrekt initializiert werden?

    wc_.cbClsExtra = 0;
    wc_.cbWndExtra = 0;
    
    hwnd_ = CreateWindow(
    		classname_,
    		windowname_,
    		style_,
    		x_, y_, w_, h_,
    		hparent_,
    		hmenu_,
    		hInstance,
    		new controller());
    

  • Mod

    Hat damit nichts zu tun.
    1. Dein Fenster wir dja erzegt, Du bekommst ja Nachrichten.
    2. GWL_USERDATA ist immer vorhanden.

    Laut Doku: Selbst wenn es einen Fehler gibt müsstest Du NULL bekommen!



  • Kann das Problem sein, dass die controller Methoden virtual sind?



  • Also das Problem ist irgendwo hier:

    case WM_SIZE:
    		if (pc)
    			pc->resize(0, 0);
    		return 0;
    

    Die Fehlermeldung ist:

    First-chance exception at 0x00000000 in generic2.exe: 0xC0000005: Access violation reading location 0x00000000.
    Unhandled exception at 0x00000000 in generic2.exe: 0xC0000005: Access violation reading location 0x00000000.

    Das Objekt controller sieht so aus:

    class controller
    	{
    		HWND hwnd_;
    	public:
    		controller();
    		virtual ~controller();
    
    		virtual void command(UINT what) {}
    		virtual void resize(int new_x, int new_y) {}
    		virtual void paint() {}
    
    		void set_hwnd(HWND h)
    		{
    			hwnd_ = h;
    		}
    
    controller::controller()
    :hwnd_(0)
    {
    }
    
    controller::~controller()
    {
    	PostQuitMessage(0);
    }
    

  • Mod

    Zeig mal wie Du Dein Fenster erzeugst!



  • Zdravko schrieb:

    hwnd_ = CreateWindow(
    		classname_,
    		windowname_,
    		style_,
    		x_, y_, w_, h_,
    		hparent_,
    		hmenu_,
    		hInstance,
    		new controller());
    

    Reicht das, oder soll ich das ganzes hier posten?
    Das Fenster wird richtig gezeigt. Aber gleichzeitig kriege ich diese seltsame Fehlermeldung...


  • Mod

    Also so kann ich jetzt auf Anhieb kein Problem sehen.
    Wird denn der Zeiger korrekt gesetzt? Hast Du Den Wert nach WM_CREATE mal geprüft, as Du eingetragen hast?
    Hast Du ein kleines Demo, das Du mir senden kannst?



  • Ich habe das ganze Projekt neu rebuilt und auf ein mal ist alles ok gegangen!
    Vielen Dank!


Anmelden zum Antworten