CreateWindowEx - Fehlercode 1400 ???



  • Hallo,

    ich wollte mir gerade ebend ein Fenster mit der Winapi erzeugen lassen. Allerdings kriege ich beim Aufruf von CreateWindowEx den Fehlercode 1400 (INVALID_WINDOW_HANDLE). Ich habe damit ein Verständnisproblem: CreateWindowEx oder CreateWindow sollen doch genau den erzeugen oder? Wie kann das denn sein bzw. wie kann ich das lösen?

    hier der Code:

    HWND CreateMainWindow (HINSTANCE hInstance)
    {
    	WNDCLASSEX wnd;
    	(void)memset (&wnd, 0, sizeof (WNDCLASSEX));
    
    	wnd.cbSize			= sizeof (WNDCLASSEX);
    	wnd.hbrBackground	= (HBRUSH) (COLOR_WINDOW + 1);
    	wnd.hCursor			= LoadCursor (hInstance, IDC_ARROW);
    	wnd.hInstance		= hInstance;
    	wnd.hIcon			= LoadIcon (hInstance, IDI_APPLICATION);
    	wnd.hIconSm			= LoadIcon (hInstance, IDI_APPLICATION);
    	wnd.lpfnWndProc		= MessageHandler;
    	wnd.lpszClassName	= "sql";
    	wnd.lpszMenuName	= NULL;
    	wnd.style			= CS_OWNDC | CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
    
    	if (!RegisterClassEx (&wnd))
    	{
    		MessageBox (NULL, ERR_REGISTER, "FATAL ERROR", 64);
    		return NULL;
    	}
    
    	hWindow = CreateWindowEx (NULL,
    							  "sql",
    							  "sql", 
    							  WS_OVERLAPPEDWINDOW,
    							  10,10,
    							  640, 480,
    							  NULL,
    							  NULL,
    							  GetModuleHandle (NULL),
    							  NULL);
    
    	if (!hWindow)
    	{
    		int error = GetLastError ();
    		MessageBox (NULL, ERR_CREATE, "FATAL ERROR", 64);
    		return NULL;
    	}
    
    	return hWindow;
    }
    

    Die Fensterklasse registrieren kann er (RegisterClassEx), allerdings kommt er in den Fall mit GetLastError () rein und liefert 1400 zurück.

    Gruß Sebastian



  • Wie sieht MessageHandler aus?



  • LRESULT CALLBACK MessageHandler (HWND hWindow, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	switch (message)
    	{
    		case WM_CREATE:
    			break;
    		case WM_DESTROY:
    			PostQuitMessage (0);
    			break;
    		case WM_QUIT:
    			PostQuitMessage (0);
    			break;
    		case WM_CLOSE:
    			PostQuitMessage (0);
    			break;
    		default:
    			return DefWindowProc (hWindow, message, wParam, lParam);
    	}	
    
    	return -1;
    }
    


  • Hmmm ich dachte immer, die Callbackfunktion würde erst nach dem Erstellen des Fensters aufgerufen. Es war wohl das -1 am ende meiner Callbackfunktion. Allerdings so ganz nachvollziehen kann ich das nicht.

    Naja es geht auf jedenfall. Danke für den Hinweis.



  • Deine Callback-Funktion ist völlig falsch.

    1.) Auf WM_CREATE reagierst du durch das break mit -1.

    WM_CREATE

    If the application returns –1, the window is destroyed and the CreateWindowEx or CreateWindow function returns a NULL handle.

    2.) Auf WM_QUIT wird nicht in nicht in der Window-Proc ankommen.

    3.) Auf WM_CLOSE reagiert man mit DestroyWindow oder EndDialog (bei modalen Dialogen)



  • 2.) Auf WM_QUIT wird nicht in nicht in der Window-Proc ankommen.

    3.) Auf WM_CLOSE reagiert man mit DestroyWindow oder EndDialog (bei modalen Dialogen)

    Was willst du?



  • Bei 2. hab ich mich wohl ein bisschen verschrieben, aber ich meinte das die WM_QUIT Message nicht in der Window-Proc ankommt.




Anmelden zum Antworten