C++ openGL渲染可以在WS\u重叠窗口中工作,但不能在WS\u弹出窗口中工作

C++ openGL渲染可以在WS\u重叠窗口中工作,但不能在WS\u弹出窗口中工作,c++,winapi,opengl,C++,Winapi,Opengl,我试图在windows中创建一个非常简单的openGL窗口。 问题是,当使用WS_OVERLAPPEDWINDOW创建窗口时,openGL渲染可以工作,但当我将其更改为全屏WS_弹出窗口时,它只显示一个全屏白色/空白窗口 主要内容如下: int main(int argc, char **argv) { hInstance = GetModuleHandle(NULL); if (hInstance == NULL) { return 1; }

我试图在windows中创建一个非常简单的openGL窗口。 问题是,当使用WS_OVERLAPPEDWINDOW创建窗口时,openGL渲染可以工作,但当我将其更改为全屏WS_弹出窗口时,它只显示一个全屏白色/空白窗口

主要内容如下:

int main(int argc, char **argv)
{
    hInstance = GetModuleHandle(NULL);
    if (hInstance == NULL)
    {
        return 1;
    }

    int retCode = createWindow(hInstance);
    if (retCode != 0)
    {
        printf("Window Creation Failed!\n");
        std::cin.ignore();
        return -1;
    }

    retCode = createOpenGLContext(hWindow);
    if (retCode != 0)
    {
        printf("GLRenderContext creation failed!\n");
        std::cin.ignore();
        return -1;
    }

    printf("Initialization Complete!\n");

    MSG message;
    while (true)
    {
        if (hWindow == NULL)
        {
            printf("hWindow is null, skipping!\n");
            continue;
        }

        PeekMessage(&message, NULL, 0, 0, PM_REMOVE);
        TranslateMessage(&message);
        DispatchMessage(&message);
    }

    return 0;
}
以下是createWindow:

int createWindow(HINSTANCE hInstance)
{
////////////////CREATE THE CLASS
WNDCLASS windowClass = {};
windowClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
windowClass.lpfnWndProc = windowProc;
windowClass.hCursor = LoadCursor(NULL, IDC_CROSS);
windowClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
windowClass.hInstance = hInstance;
windowClass.lpszClassName = WINDOW_CLASSNAME;

////////////////REGISTER THE CLASS
RegisterClass(&windowClass);

////////////////CREATE THE WINDOW
hWindow = CreateWindowA(WINDOW_CLASSNAME, WINDOW_NAME, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 
    0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN),
    nullptr, nullptr, hInstance, nullptr);

ShowWindow(hWindow, SW_SHOW);
UpdateWindow(hWindow);

if (hWindow != NULL)
{
    printf("hWindow is Created!\n");
    return 0;
}
else
{
    printf("hWindow creation failed!\n");
    return -1;
}
}
最后,创建OpenGLContext:

int createOpenGLContext(HWND hWindow)
{
hDeviceContext = GetDC(hWindow);
if (hDeviceContext == NULL)
{
    printf("Device context is null!\n");
    return -1;
}

///////////////////SET PIXEL FORMAT
PIXELFORMATDESCRIPTOR pfd;
memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
pfd.nSize = sizeof(pfd);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.iLayerType = PFD_MAIN_PLANE;

int chosenFormat = ChoosePixelFormat(hDeviceContext, &pfd);
if (SetPixelFormat(hDeviceContext, chosenFormat, &pfd) == TRUE)
{
    printf("PixelFormat set!\n");
}
else
{
    printf("PixelFormat couldn't be set!\n");
    return -1;
}

hGLRenderContext = wglCreateContext(hDeviceContext);
if (hGLRenderContext == NULL)
{
    char errorString[256];
    FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), 0, errorString, 255, NULL);

    printf("RenderContext is null!\n");
    std::cout << errorString << "\n";
    return -1;
}

wglMakeCurrent(hDeviceContext, hGLRenderContext);

return 0;
}

您没有显示您的
WindowProc
,但是如果您的窗口根据
WS\u POPUP
vs
WS\u OVERLAPPENDWINDOW
显示不同的行为,首先要检查的是您的代码是否依赖于视图重新配置的
WM\u大小
glViewport
等。如果是这种情况,请在初始化窗口后也调用此代码。

是否尝试使用WS_POPUPWINDOW?天哪。。。它确实起作用了…能解释一下它为什么会这样吗?或者是关于它的文档?我想是WS_PopupWondow的WS_系统菜单。这使它起作用。您也可以尝试使用WS_POPUP和WS_EX_APPWINDOW作为扩展样式(CreateWindowEx)。正是WS_BORDER让它发挥了作用。当窗口是无边界样式时,openGL不会进行渲染。这是一个注释而不是答案。
LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
int x;
int y;

switch (uMsg)
{
case WM_MOUSEMOVE:
    x = LOWORD(lParam);
    y = HIWORD(lParam);

    //printf("Mouse Movement: %d, %d\n", x, y);
    break;

case WM_COMMAND:
{
    int wmId = LOWORD(wParam);
    // Parse the menu selections:
    switch (wmId)
    {
    case 105:
        DestroyWindow(hWnd);
        break;
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
}
break;
case WM_PAINT:
{
    printf("WM_PAINT message!\n");
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hWnd, &ps);
    // TODO: Add any drawing code that uses hdc here...
    EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
    PostQuitMessage(0);
    break;
default:
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}