У меня есть четыре окна, которые являются одним родительским окном и тремя дочерними окнами. Я хочу сделать два из этих дочерних окон, чтобы рисовать вещи. Первое дочернее окно использует OpenGL, а второе дочернее окно использует GDI. Если я просто нарисую некоторые вещи в моем OpenGL-окне, и все будет хорошо, но когда я пытаюсь рисовать (или просто пытаться обрабатывать сообщение WM_PAINT) что-то еще в моем окне GDI, эти дочерние окна становятся странными. Во-первых, некоторые части (например, кнопки, статика, строка заголовка) моего третьего дочернего окна будут отсутствовать. Во-вторых, если я попытаюсь изменить размер любого из этих окон, будет отсутствовать одно или два дочерних окна. Но как только я нажму эти окна, они вернутся. В-третьих, PeekMessage больше не работает, он всегда возвращает FALSE, MessageBox, похоже, не работает должным образом (я не вижу всплывающее окно, но я также слышу звук).Как я могу заставить OpenGL и GDI работать нормально одновременно?
Мое третье детское окно только что создано.
После этого я щелкнул по нему.
Я думал, что может быть что-то не так с обработкой сообщений, но я не могу понять, что на самом деле происходит. Есть ли у кого-нибудь предложения?
Сообщение Loop:
MSG msg;
DWORD dwLast;
DWORD dwCurrent;
DWORD dwInterval = 20;//50 FPS 1000/50
dwLast = GetTickCount();
while (1) {
while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) == FALSE)
{
dwCurrent = GetTickCount();
if (dwCurrent - dwLast < dwInterval)
continue;
SendMessage(Handle_Child_Demo, WM_PAINT, 0, 0);
dwLast = dwCurrent;
}
if (GetMessage(&msg, NULL, 0, 0) != TRUE) {
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Я не использую MDI создавать свои дочерние окна, я просто использовал CreateWindow, чтобы создать все мои дочерние окна, и я думаю, что должно быть что-то не так с ним, что еще делать Мне нужно сделать, чтобы эти дочерние окна работали правильно?
другое окно - это разные темы ... Таким образом, для каждого окна GL необходимо иметь отдельный контекст OpenGL и использовать 'wglMakeCurrent' для правильного переключения между контекстами (в событиях« Активировать »и« Выйти »). Также GDI и визуальные вызовы WinAPI ДОЛЖНЫ БЫТЬ ВЫЗЫВАНЫ ОТ ОСНОВНОЙ РЕЗЬБЫ ЦЕЛЕВОГО ОКНА (WndProc), иначе странные вещи произойдут даже в несвязанных кодах ... например, случайные ошибки исключения gfx сбой ... BTW вы можете комбинировать GDI и GL в том же окне без каких-либо проблем ... просто убедитесь, что обновления не заставляют перерисовывать в неподходящее время. – Spektre
Реальные проблемы начинают возникать, когда вы получаете устаревшие карты/драйверы Intel gfx. [Что такое правильная инициализация OpenGL на Intel HD 3000?] (Http://stackoverflow.com/q/19099162/2521214) – Spektre
У меня есть только один GL окно, и вся программа использует только один поток. Я использую wglMakeCurrent (DC, GL), когда он начинает рисовать, и используйте wglMakeCurrent (NULL, NULL), когда он останавливается. – markable