首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在调整win32窗口大小时绘制OpenGL内容

在调整Win32窗口大小时绘制OpenGL内容,需要遵循以下步骤:

  1. 创建Win32窗口:首先,需要创建一个Win32窗口,并在其中初始化OpenGL上下文。
  2. 初始化OpenGL:在窗口中创建一个OpenGL上下文,并初始化OpenGL。这包括设置OpenGL状态、加载着色器和创建顶点数组对象等。
  3. 设置窗口大小回调:在Win32窗口中设置一个回调函数,以便在窗口大小更改时调用它。
  4. 调整视口:在窗口大小更改回调函数中,调整OpenGL视口以适应新的窗口大小。
  5. 渲染OpenGL内容:在主循环中,使用glClear清除缓冲区,并使用glDrawElements绘制OpenGL内容。
  6. 交换缓冲区:在渲染完OpenGL内容后,使用SwapBuffers函数交换缓冲区,以便在窗口中显示OpenGL内容。

以下是一个简单的示例代码:

代码语言:c
复制
#include<windows.h>
#include <gl/GL.h>
#include <gl/GLU.h>

// 窗口大小更改回调函数
void resizeWindow(int width, int height)
{
    // 设置OpenGL视口
    glViewport(0, 0, width, height);
}

// Win32窗口消息处理函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_SIZE:
        // 获取新的窗口大小
        int width = LOWORD(lParam);
        int height = HIWORD(lParam);
        // 调用窗口大小更改回调函数
        resizeWindow(width, height);
        break;
    case WM_CLOSE:
        DestroyWindow(hWnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    // 注册窗口类
    WNDCLASSEX wc;
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = 0;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "OpenGLWindow";
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

    if (!RegisterClassEx(&wc))
    {
        MessageBox(NULL, "Failed to register window class", "Error", MB_OK | MB_ICONERROR);
        return 0;
    }

    // 创建窗口
    HWND hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, "OpenGLWindow", "OpenGL Window", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInstance, NULL);

    if (!hWnd)
    {
        MessageBox(NULL, "Failed to create window", "Error", MB_OK | MB_ICONERROR);
        return 0;
    }

    // 显示窗口
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    // 创建OpenGL上下文
    HDC hDC = GetDC(hWnd);
    PIXELFORMATDESCRIPTOR pfd;
    ZeroMemory(&pfd, sizeof(pfd));
    pfd.nSize = sizeof(pfd);
    pfd.nVersion = 1;
    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 32;
    pfd.cAlphaBits = 8;
    pfd.cDepthBits = 24;
    pfd.cStencilBits = 8;
    int iFormat = ChoosePixelFormat(hDC, &pfd);
    SetPixelFormat(hDC, iFormat, &pfd);
    HGLRC hRC = wglCreateContext(hDC);
    wglMakeCurrent(hDC, hRC);

    // 初始化OpenGL
    // ...

    // 主循环
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);

        // 渲染OpenGL内容
        // ...

        // 交换缓冲区
        SwapBuffers(hDC);
    }

    // 释放资源
    wglMakeCurrent(NULL, NULL);
    wglDeleteContext(hRC);
    ReleaseDC(hWnd, hDC);
    DestroyWindow(hWnd);

    return msg.wParam;
}

在这个示例代码中,我们创建了一个Win32窗口,并在其中初始化了OpenGL上下文。我们还设置了一个窗口大小更改回调函数,以便在窗口大小更改时调整OpenGL视口。在主循环中,我们使用glClear清除缓冲区,并使用glDrawElements绘制OpenGL内容。最后,我们使用SwapBuffers函数交换缓冲区,以便在窗口中显示OpenGL内容。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券