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_NCCREATEIch finds trotzdem nicht.
(GetLastError() gibt übrigens 0 zurück -??)
-
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.aspxGrü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.
-
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 helfenGrü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..)