我创建了一个在Windows上运行的简单OpenGL渲染器。我没有创建窗口和设置渲染上下文的问题。窗口设置后会出现此问题。
我根本无法与Window交互。如果我将鼠标移到窗口的任何位置,我的光标将显示为加载光标。这是我用来创建Window的函数。为什么会这样?
bool BroGLWin::B_CreateWindow(int width, int height, int colorBits) {
if (!classRegistered) {
WNDCLASS wc;
memset(&wc, 0, sizeof(wc));
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc = (WNDPROC)wndproc;
wc.cbClsExtra = 0;
wc.cbWndExtra = sizeof(void*) + sizeof(int);
wc.hInstance = GetModuleHandle(NULL);
//wc.hIcon = LoadIcon(hinstOpenGL, MAKEINTRESOURCE(IDI_ICON1));
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = 0;
wc.lpszClassName = WINDOW_CLASS_NAME;
if (!RegisterClass(&wc)) {
// TODO: Add safe error here
// unable to register class
}
classRegistered = true;
}
// create HWND
if (!hWnd) {
hWnd = CreateWindowEx(
WS_EX_APPWINDOW | WS_EX_WINDOWEDGE,
WINDOW_CLASS_NAME,
"BroGL",
WS_VISIBLE | WS_OVERLAPPEDWINDOW,
0,
0,
width,
height,
NULL,
NULL,
hinstOpenGL,
this
);
if (!hWnd) {
// error creating the window
}
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
}
if (!(hDC = GetDC(hWnd))) {
ShowWindow(hWnd, SW_HIDE);
DestroyWindow(hWnd);
hWnd = NULL;
return false;
}
// Create OpenGL Context
if (!MakeContext()) {
ShowWindow(hWnd, SW_HIDE);
DestroyWindow(hWnd);
hWnd = NULL;
return false;
}
SetForegroundWindow(hWnd);
SetFocus(hWnd);
return true;
}
如果需要更多信息,请与我们联系。
编辑:这是消息循环。
LONG WINAPI BroGLWin::MainWndProc(HWND n_hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_CREATE:
{
LPCREATESTRUCT cs = reinterpret_cast<LPCREATESTRUCT>(lParam);
void * lpCreateParam = cs->lpCreateParams;
BroGLWin *win = reinterpret_cast<BroGLWin *>(lpCreateParam);
assert(win == this);
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}
编辑2:我通过正确实现消息循环解决了我的问题。添加的代码允许正确读取新消息。感谢那些回答并留下建设性意见的人。我还发现以下网站在这个例子中非常有用:http://www.winprog.org/tutorial/message_loop.html
这是我添加到WinMain
main.cpp
功能的代码
// pump the message loop
while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {
if (GetMessage(&msg, NULL, 0, 0) < 0) {
// Some error checking
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
答案 0 :(得分:2)
您报告的行为是无法响应邮件的应用程序的症状。因此,您似乎很可能只是无法实现消息循环,或者实现了一个损坏的消息循环。
答案 1 :(得分:1)
听起来像是丢失或错误实现的消息循环。请注意,当指针进入窗口时要更新光标图像,您必须调用SetCursor
以响应窗口中的鼠标输入或鼠标移动事件,或者在窗口类中设置光标并且如果您不自行处理这些消息,请致电DefWindowProc
。将所有消息传递给&#39; DefWindowProc`总是一个好主意,并且只排除那些您自己处理的消息和不要想要被默认的Windows行为解释。