- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 Windows 中创建一个非常简单的 openGL 窗口。问题是,当使用 WS_OVERLAPPEDWINDOW 创建窗口时,openGL 渲染工作正常,但是当我将其更改为全屏 WS_POPUP 时,它只显示全屏白色/空白窗口。
这里是主要的:
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;
}
这里是创建窗口:
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;
}
有人知道为什么将 WS_OVERLAPPEDWINDOW 更改为 WS_POPUP 会破坏它吗?
编辑:这是请求的 windowProc:
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;
}
最佳答案
您没有显示您的 WindowProc
,但是如果您的窗口根据 WS_POPUP
和 WS_OVERLAPPENDWINDOW
显示不同的行为,首先要检查的是如果您的代码依赖于 WM_SIZE
进行 View 重新配置(glViewport
、gluPerspective
等)。如果是这种情况,也请在初始化窗口后立即调用此代码。
关于c++ - openGL 渲染在 WS_OVERLAPPEDWINDOW 中工作,但在 WS_POPUP 中不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46630268/
我有主窗口,然后用户可以在应用程序中“弹出”其中一个框架,使其 float 而不是包含在主窗口中。可以弹出多个框架,因此在给定时间内可能有三个 WS_POPUP 窗口。 问题是当我想显示模态对话框时,
我正在尝试创建一个无边框的控制台窗口。 我能够将 windowstyle 设置为 WS_POPUP,它删除了边框,但是有一些小故障; 似乎控制台窗口上有一些部分没有被重绘,或者类似的东西,但我已经尝试
我正在使用该代码在 C++ 中创建一个窗口: HWnd = CreateWindow(wc.lpszClassName, "myapp", WS_POPUP |WS_VISIBLE,
我试图找出为什么我的应用程序有一个小的、很少像素的边框。 我的理解是 WS_POPUP 应该解决这个问题; DWORD wndExStyle = WS_EX_OVERLAPPEDWINDOW; DWO
我正在尝试使用 "WS_POPUP" 样式创建一个没有标题栏的窗口,我还需要在边框上进行一些绘制。 当我收到"WM_PAINT" 消息时,我正在"WndProc" 中实现我的绘图逻辑。但是,它从未交付
我正在尝试在 Windows 中创建一个非常简单的 openGL 窗口。问题是,当使用 WS_OVERLAPPEDWINDOW 创建窗口时,openGL 渲染工作正常,但是当我将其更改为全屏 WS_P
我是一名优秀的程序员,十分优秀!