2012-09-26 65 views
0

我从我的应用程序打开OpenGL窗口时遇到了问题。CreateWindowsEx()失败,触发断点

我正在使用一个64位控制台应用程序,并且从该控制台中我想打开另一个窗口供OpenGL绘制。

调用在CreateWindowEx()失败,并且失败,并且“MyApp.exe已触发断点” 以下代码初始化窗口本身。

bool OpenGL_Display::CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag, int posX, int posY) 
{ 
    GLuint  PixelFormat;   // Holds The Results After Searching For A Match 
    WNDCLASS 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 

    hInstance   = GetModuleHandle(NULL);    // Grab An Instance For Our Window 
    wc.style   = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Redraw On Size, And Own DC For Window. 
    wc.lpfnWndProc  = NULL;     // 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 

    if (!RegisterClass(&wc))         // Attempt To Register The Window Class 
    { 
     MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION); 
     return FALSE;           // Return FALSE 
    } 

    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 
    HWND hwndC = GetConsoleWindow(); 
    // Create The Window 
    if (!(hWnd=CreateWindowEx( dwExStyle,       // Extended Style For The Window 
           "OpenGL",       // Class Name 
           title,        // Window Title 
           dwStyle |       // Defined Window Style 
           WS_CLIPSIBLINGS |     // Required Window Style 
           WS_CLIPCHILDREN,     // Required Window Style 
           0, 0,        // Window Position 
           WindowRect.right-WindowRect.left, // Calculate Window Width 
           WindowRect.bottom-WindowRect.top, // Calculate Window Height 
           hwndC,        // No Parent Window 
           NULL,        // No Menu 
           hInstance,       // Instance 
           NULL)))        // Dont Pass Anything To WM_CREATE 
    { 
     KillGLWindow();        // Reset The Display 
     MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION); 
     return FALSE;        // Return FALSE 
    } 
} 

前面的代码导致它:

extern "C" __declspec(dllexport) void OpenGLDisplay_Init(int width, int height, int posX, int posY) 
{ 
    oglDisp.Init_Display(width, height, posX, posY); 
} 

void OpenGL_Display::Init_Display(int width, int height, int posX, int posY) 
{ 
    if (!CreateGLWindow("Ophthametrics Live Display", width, height, 24, false, posX, posY)) 
    { 
     throw; 
    } 
} 

什么是有问题呢?我不知道,我正在使用我用于其他应用程序的代码,它工作得很好。虽然它只是失败了(在原始代码中,它不是控制台应用程序,而是没有控制台的Win32应用程序)。

最终的解决方案将在一个被调用的DLL中,一旦它被调用,它应该创建一个窗口供OpenGL绘制。

+0

'HWND hwndC = GetConsoleWindow();' - 是否返回有效的'HWND'?另外,对于没有父节点的情况,只需在'hwndC'处传递'NULL'即可。 – slugonamission

+0

是的,它返回一个有效的句柄。我也试着用NULL作为父窗口,但它仍然发生同样的错误。 – SinisterMJ

+2

如果您将窗口过程指向实际功能会怎样? – slugonamission

回答

0

“如果你的窗口过程处于真实功能状态,该怎么办?”

作者slugo,做到了。