在调整Win32窗口大小时绘制OpenGL内容,需要遵循以下步骤:
以下是一个简单的示例代码:
#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内容。
领取专属 10元无门槛券
手把手带您无忧上云