Fehler bei CreateWindowEx()



  • Hi,

    ich versuche mich gerade dabei, mir ein OpenGL-Fenster zu erstellen.
    Das klappt allerdings nicht so ganz wie ich mir das vorstelle.
    Erstmal mein Code:

    OpenGlWindow::OpenGlWindow(char* title, bool fullscreenflag, int height,int width,int bits)
    {
    	unsigned int	PixelFormat;						// Holds The Results After Searching For A Match
    	WNDCLASSEX		wc;							// Windows Class Structure
    	DWORD			dwExStyle;						// Window Extended Style
    	DWORD			dwStyle;						// Window Style
    	RECT WindowRect;							// Grabs Rectangle Upper Left / Lower Right Values
    	WindowRect.left=(long)0;						// Set Left Value To 0
    	WindowRect.right=(long)width;						// Set Right Value To Requested Width
    	WindowRect.top=(long)0;							// Set Top Value To 0
    	WindowRect.bottom=(long)height;						// Set Bottom Value To Requested Height
    	fullscreen=fullscreenflag;						// Set The Global Fullscreen Flag
    	hInstance		= GetModuleHandle(NULL);			// Grab An Instance For Our Window
    	wc.style		= CS_OWNDC;		// Redraw On Move, And Own DC For Window
    	wc.lpfnWndProc		= (WNDPROC) WndProc;				// WndProc Handles Messages
    	wc.cbClsExtra		= 0;						// No Extra Window Data
    	wc.cbWndExtra		= 0;						// No Extra Window Data
    	wc.hInstance		= hInstance;					// Set The Instance
    	wc.hIcon		= LoadIcon(NULL, IDI_WINLOGO);			// Load The Default Icon
    	wc.hCursor		= LoadCursor(NULL, IDC_ARROW);			// Load The Arrow Pointer
    	wc.hbrBackground	= NULL;						// No Background Required For GL
    	wc.lpszMenuName		= NULL;						// We Don't Want A Menu
    	wc.lpszClassName	= "OpenGL";					// Set The Class Name
    	wc.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
    	wc.cbSize			= sizeof(WNDCLASSEX);
    	hDC=NULL;
    	hRC=NULL;
    	hInstance = (HINSTANCE)GetModuleHandle(NULL);
    	if (!RegisterClassEx(&wc)){					// Attempt To Register The Window Class
    		MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    		wasSuccessfull = false;
    		return;							// Exit And Return FALSE
    	}
    	if (fullscreen){								// Attempt Fullscreen Mode?
    		DEVMODE dmScreenSettings;					// Device Mode
    		memset(&dmScreenSettings,0,sizeof(dmScreenSettings));		// Makes Sure Memory's Cleared
    		dmScreenSettings.dmSize=sizeof(dmScreenSettings);		// Size Of The Devmode Structure
    		dmScreenSettings.dmPelsWidth	= width;			// Selected Screen Width
    		dmScreenSettings.dmPelsHeight	= height;			// Selected Screen Height
    		dmScreenSettings.dmBitsPerPel	= bits;				// Selected Bits Per Pixel
    		dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;// Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
    		if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL){
    			// If The Mode Fails.
    			MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By Your Video Card.",title ,MB_OK|MB_ICONSTOP);
    			wasSuccessfull = false;
    			return;					// Exit And Return FALSE
    		}
    		dwExStyle=WS_EX_APPWINDOW;					// Window Extended Style
    		dwStyle=WS_POPUP;						// Windows Style
    	}else{  //kein fullscreen
    		dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;			// Window Extended Style
    		dwStyle=WS_OVERLAPPEDWINDOW;					// Windows Style
    	}
    	AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);		// Adjust Window To True Requested Size
    	if (!(hWnd=CreateWindowEx(	dwExStyle,				// Extended Style For The Window
    					"OpenGL",				// Class Name
    					title,					// Window Title
    					WS_CLIPSIBLINGS |			// Required Window Style
    					WS_CLIPCHILDREN |			// Required Window Style
    					dwStyle,				// Selected Window Style
    					0, 0,					// Window Position
    					WindowRect.right-WindowRect.left,	// Calculate Adjusted Window Width
    					WindowRect.bottom-WindowRect.top,	// Calculate Adjusted Window Height
    					NULL,					// No Parent Window
    					NULL,					// No Menu
    					hInstance,				// Instance
    					NULL))){				// Don't Pass Anything To WM_CREATE
    		MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);			
    		KillGLWindow();							// Reset The Display		
    		wasSuccessfull = false;
    		return;							// Return FALSE
    	}
    ....
    

    Die Parameter zum Aufruf sind:

    ("bla", false, 800,1200,32)
    

    Problem ist, dass ich als Ausgabe immer "Window Creation Error." bekomme.
    Nach der Spezifikation auf microsoft.com sind die häufigste Fehler:
    an invalid parameter value
    the system class was registered by a different module
    The WH_CBT hook is installed and returns a failure code
    if one of the controls in the dialog template is not registered, or its window window procedure fails WM_CREATE or WM_NCCREATE

    Ich finds trotzdem nicht.
    (GetLastError() gibt übrigens 0 zurück -??)


  • Administrator

    1. Falsches Forum, das ist WinAPI und gehört daher ins WinAPI Forum. Sobald ein Moderator mit entsprechender Befugnis hier vorbeikommt, wird er dich dorthin verschieben.
    2. Könntest du den Code einheitlich einrücken, damit man dies auch sinnvoll lesen kann?
    3. Könntest du sagen, wo genau der Fehler im Code auftaucht?
    4. http://msdn.microsoft.com/en-us/library/ms633575.aspx

    Grüssli



  • Oki, sorry wegen falschem Forum.
    Eingerückt ist der Code bei mir jedoch bereits(?)
    Der Fehler tritt nicht beim Compilieren auf, der Fehler ist, dass
    CreateWindowEx() NULL zuückgibt. (Also kurz die Nachricht "Windows Creation Error!" ausgegeben wird.
    Den link kenne ich schon, daher habe ich ja auch die Liste der häufigsten Fehler.
    Mfg.



  • Dein Code ist zum Kotzen.


  • Administrator

    Mathews schrieb:

    Eingerückt ist der Code bei mir jedoch bereits(?)

    Aber völlig uneinheitlich. Kommentare sind weiter vorne, weiter hinten, mal hat es Leerzeichen zwischen den Operatoren oder Parametern, mal nicht, usw. usf. Das ist wahnsinnig mühsam zu lesender Code.

    Zudem hast du eben nicht klar gesagt, wo der Fehler auftaucht, wodurch man sich durch alles durchlesen müsste ... urgs ... keine Motivation dazu vorhanden bei mir 😉

    Mathews schrieb:

    Der Fehler tritt nicht beim Compilieren auf, der Fehler ist, dass
    CreateWindowEx() NULL zuückgibt. (Also kurz die Nachricht "Windows Creation Error!" ausgegeben wird.

    Ah! Der Fehler taucht beim CreateWindowEx Aufruf auf. Das hattest du nicht gesagt. Jetzt kann ich die Stelle im Code anschauen gehen 😉
    Und wenn ich das nun mache, wird mir auch klar, was du mit der Ausgabe von "Window Creation Error" gemeint hast. Das ist eine von dir erstellte Fehlermeldung. Damit kommt man schon deutlich weiter und du erhöhst die Chance, dass jemand die Motivation aufbringt, dir zu helfen 😉

    Grüssli



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Auf den ersten Blick sehe ich jetzt nichts falsches, außer dass deine Formatierung echt mies ist... Es gibt eine Taste die nennt sich Enter mit der kann man Leerzeilen machen! Auch solltest du nicht ,wie in C, die Variablen ganz oben in der Funktion, sondern nahe an der Verwendung deklarieren/initialisieren und dann verwenden.

    Es gibt noch eine Möglichkeit warum hwnd == NULL ist, nämlich wenn deine WndProc einen Fehler enthält, z. B. lparam und wparam werden vertaucht an DefWinProc weitergeleitet etc...



  • Hey, ja, der Fehler war tatsächlich in der WndProc.
    Funktioniert jetzt.
    Sorry wegen der Formatierung, dass mit den Leerzeichen stimmt auf jedenfall,
    zu meiner Verteidigung kann ich allerdings sagen, dass der Tabulator in meinem VisualC++ anders ist.
    (Da stehen zumindest Kommentare usw. in einer Reihe..)


Anmelden zum Antworten