OpenGL с MFC - PullRequest
       20

OpenGL с MFC

0 голосов
/ 20 октября 2011

Я пытаюсь создать 4 окна просмотра OpenGL внутри CSplitterWnd, но у меня возникают некоторые проблемы.

Сначала у меня возникали проблемы с мерцанием и рисованием, пока я не добавил флаг PFD_SUPPORT_GDI в пиксельный формат, что делало всехорошо работать вместе.Но когда я использую PFD_SUPPORT_GDI, я могу получить только контекст 1.1 OpenGL.

Можно ли использовать PFD_SUPPORT_GDI с версией OpenGL выше 1.1, чтобы я мог использовать VBO?или есть другой способ заставить OpenGL работать должным образом без PFD_SUPPORT_GDI?

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

Ответы [ 3 ]

3 голосов
/ 20 октября 2011

PFD_SUPPORT_GDI означает, что вы хотите иметь возможность рисовать с использованием вызовов GDI, что заставит вас использовать программное средство визуализации.

В большинстве случаев проблемы с мерцанием, особенно с MFC, связаны с неправильной настройкой / выбором параметров WNDCLASS (EX). Что наиболее важно, флаг CS_OWNDC должен быть установлен, а кисть фона должна быть NULL. Также вам следует перезаписать обработчик OnEraseBackground и реализовать обработчик OnPaint, который сообщает проверенный прямоугольник.

2 голосов
/ 20 октября 2011

PFD_SUPPORT_GDI означает, что вы можете рисовать GDI в окне.Это форсирует программную реализацию OpenGL, поскольку вы не можете использовать чертеж GDI (который является программным обеспечением) с аппаратным чертежом OpenGL.

Так что нет, вы не можете иметь как аппаратное ускорение OpenGL (или D3D), так и поддержку GDI длято же самое окноЕсли у вас возникают проблемы с тем, что происходит с содержимым таких окон, это то, что вы должны решить другим способом.Возможно, вы могли бы просто перерисовать вид, когда его размер изменился или что-то в этом роде.

0 голосов
/ 22 октября 2011

Я решил, что лучший способ сделать это - использовать буфер кадров. Обработка OnEraseBackground () помогла с мерцанием, но MFC по-прежнему просто не хочет хорошо играть с OpenGL, поэтому мне пришлось пойти с решением GDI.

Каждый видовой экран сначала рисуется в свой собственный буфер кадров, а затем перетаскивается в соответствующее окно.

void FrameBuffer::Blit(HDC hDC, int width, int height)
{
    glReadPixels(0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, blitBuffer);
    SetDIBitsToDevice(hDC, 0, 0, width, height, 0, 0, 0, height, blitBuffer, &blitInfo, DIB_RGB_COLORS);    
}

Похоже, что это решение не оказывает заметного влияния на производительность.

...