【发布时间】:2016-05-24 18:21:40
【问题描述】:
我正在尝试制作 *.obj 加载器。当我认为一切都已解决时,我无法启动 GLEW 来使用我的装载机。
问题是我的应用程序初始化如下所示:
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASSEX wc;
MSG msg;
HWND hWnd;
ZeroMemory(&wc, sizeof(WNDCLASSEX));
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.lpszClassName = L"Projekt";
RegisterClassEx(&wc);
hWnd = CreateWindowEx( NULL,
L"Projekt",
L"Symulator lodzi",
WS_OVERLAPPEDWINDOW,
100, 50,
SCREEN_WIDTH, SCREEN_HEIGHT,
NULL, NULL, hInstance, NULL);
if (!hWnd)
return 0;
ShowWindow(hWnd, nCmdShow); //wyswietlanie okna
glewExperimental = GL_TRUE;
GLenum err = glewInit();
if (err != GLEW_OK)
{
const GLubyte* error = glGetString(GL_VERSION);
const GLubyte* error2 = glewGetErrorString(err);
exit(1);
}
while (TRUE)
{
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if (msg.message == WM_QUIT)
break;
}
return msg.wParam;
}
在 CreateWindowEx 被调用后,它全部转到 WndProc 函数中的 WM_CREATE 消息,如下所示:
case WM_CREATE:
{
SetTimer(hWnd, 1, 1000, (TIMERPROC)NULL);
if (oGL == NULL)
oGL = new OpenGL(hWnd);
hDC = GetDC(hWnd);
} break;
oGL 构造函数代码在这里:
OpenGL::OpenGL(HWND hWnd)
{
static PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
32,
0, 0, 0,
0, 0, 0,
0, 0,
0, 0, 0, 0, 0,
32,
0,
0,
PFD_MAIN_PLANE,
0,
0,
0,
0
};
int pixelFormatID;
HDC hDC;
hDC = GetDC(hWnd);
pixelFormatID = ChoosePixelFormat(hDC, &pfd);
SetPixelFormat(hDC, pixelFormatID, &pfd);
hRC = wglCreateContext(hDC);
wglMakeCurrent(hDC, hRC);
ReleaseDC(hWnd, hDC);
}
所以我认为 OpenGL 已正确初始化,但随后我收到了这些错误:
我不明白为什么应用程序认为 OpenGL 尚未初始化(我一直在逐步调试它,并且肯定首先创建了窗口,然后创建了 oGL 对象)。
【问题讨论】:
-
是什么让您认为您的消息处理程序在您的代码到达消息泵之前已被调用?
-
我一直在调试模式下跟踪代码,在到达 CreateWindowsEx 后,调用的下一行在 WM_CREATE 消息中。即使我在 WM_CREATE 中放置断点并在第一个错误行中设置断点时,该代码也停止了。是 WM_CREATE
标签: opengl windows-applications