Модальные диалоги, открываемые полноэкранным окном OpenGL в Windows 7, не отображаются - PullRequest
0 голосов
/ 04 марта 2010

Похоже, что моя проблема может быть такой же, как и вопрос без ответа ( OpenGL с GLUT в Windows 7, в полноэкранном режиме не отображается окно сообщения ).

Поскольку я перешел на Win7 в качестве среды разработки и возможной целевой платформы для своих приложений, я заметил регресс в их поведении.

Всякий раз, когда у меня есть полноэкранное окно, содержащее полноэкранный контекст OpenGL, у приложений возникают проблемы с отображением модальных диалоговых окон (таких как окна сообщений, диалог открытия файла и т. Д.)

Окно просто создано в стиле WS_POPUP. В контексте GL нет ничего особенного. И все хорошо с Windows XP.

Проблема в Windows 7 заключается в том, что модальные диалоговые окна не видны при их открытии (возможно, они появляются за полноэкранным окном). Вы должны Alt-Tab приложения, чтобы диалоговые окна появлялись.

Это серьезная проблема, поскольку приложение кажется замороженным, хотя оно фактически ожидает ввода данных пользователем.

Кто-нибудь сталкивался с таким поведением? Кто-нибудь знает обходной путь?

Я быстро составил пример тестового приложения; его исходный код можно найти по адресу http://pastebin.com/K4v2NNDs. Простой проект MSVC8 можно найти здесь .

PS. Я также разместил сообщения на форумах opengl.org, извините за тех, кто следит за обоими.

EDIT

Благодаря комментарию Криса я протестировал модальное диалоговое окно для различных событий, таких как WM_TIMER или WM_RBUTTONUP, но проблема все еще там.

Я также вызвал 'DwmEnableComposition' с 'DWM_EC_DISABLECOMPOSITION' просто чтобы проверить: проблема все еще существует.

Я также протестировал приложение, заменив биты OpenGL на DirectX, и таким образом все работает как положено ... Это действительно OpenGL, вызывающий проблему.

(обновленная пастина http://pastebin.com/Rq1Ehm3w и мой блокнот)

EDIT

Проблема также существует в Windows 8.

Ответы [ 4 ]

1 голос
/ 08 марта 2010

Обходной путь был опубликован на opengl.org Джозефом Стилом, поэтому для справки я также поместил его здесь:

Решение, которое я нашел для этой проблемы, состояло в том, чтобы гарантировать, что формат пикселя для окна использует метод обмена WGL_SWAP_COPY_ARB, а не WGL_SWAP_EXCHANGE_ARB.

Я заметил, что для получения формата пикселей нужно использовать wglChoosePixelFormatARB.

Я пытался с классическим «ChoosePixelFormat» с флагом «PFD_SWAP_COPY», но он не работает в моей системе (Win7 x64 + NVidia GeFo 9600GT v196.21), поскольку вместо этого мне всегда возвращается формат пикселя с PFD_SWAP_EXCHANGE .

Я доволен результатами лишь наполовину, поскольку на моем дисплее появляются разрывы, но как минимум это работает!

Для справки, я обновил мой исходный код теста .

РЕДАКТ., Дек. 2013

Этот обходной путь больше не работает, по крайней мере, на моей системе (ноутбук, Optimus GeForce 650M). WGL_SWAP_COPY_ARB настроен, но модальное диалоговое окно не отображается. Пока что кажется, что создание окна с границей в 1 пиксель (добавление WS_BORDER к стилю WS_POPUP) делает свое дело и предотвращает переход в полноэкранный режим.

0 голосов
/ 07 января 2016

когда я хочу, например, открыть диалог с файлами в полноэкранном режиме OpenGL (Windows10 или каждый Windows раньше), я звоню

RedrawWindow (hwnd, 0, 0, RDW_INTERNALPAINT);

(это приводит к тому, что сообщение WM_PAINT отправляется в окно независимо от того, является ли какая-либо часть окна недействительной)

и сразу после этого я вызываю filedialog. Диалог файла теперь будет отображаться в полноэкранном режиме OpenGL.

В WndProc внутри корпуса WM_PAINT: я делаю SwapBuffers (hdc)

RedrawWindow(hwnd, 0, 0, RDW_INTERNALPAINT);
// important when fullscreen; forces a WM_PAINT message,
GLwin->Fileselect(s_fname); // or whatever dialog

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lparam)
{
  switch(message)
  {
    case WM_PAINT:
    SwapBuffers(hdc);  // (same as in the render-loop)
    break;
0 голосов
/ 04 декабря 2013

У меня была такая же проблема с OpenGL под Win7 64 бит. Модальные диалоговые окна и модальные окна не отображаются, также они активны в фоновом режиме. В моем проекте используется стерео дисплей (четырехъядерные буферы). В моем случае проблема была из-за неправильной настройки на панели управления адаптера дисплея (Nvidia Quadro FX3800). Параметр был «Stereo Enabled», который был неправильно включен «выключен». Включение решило проблему.

0 голосов
/ 10 сентября 2013

Решение в моей системе было довольно простым: - НЕ указывайте стиль WS_POPUP во время создания окна. - Сразу после того, как вы получите hwnd, переустановите ваши стили окон на то, что вы хотите (но без WS_POPUP), используя SetWindowLong (hwnd, GWL_STYLE, yr_styles);

...