Подготовка окна
Вы помните, что подготовку контекста передачи OpenGL надо рассматривать как некий обязательный ритуал, в котором порядок действий определен. В этой процедуре выделяют следующие шаги:
- установка стиля окна;
- обработка сообщения WM_ERASEBACKGROUND и отказ от стирания фона;
- установка pixel-формата;
- создание контекста устройства (HDC) и контекста передачи (HGLRC);
- специфическая обработка сообщения WM_SIZE;
- обработка сообщения WM_PAINT;
- освобождение контекстов при закрытии окна.
Как было отмечено ранее, окнам, которые в своей клиентской области используют контекст передачи OpenGL, при создании следует задать биты стиля WS_CLIPCHILDREN и ws_CLiPSiBLiNGS. Сделайте это внутри существующего тела функции PreCreateWindow класса cocview, добавив нужные биты стиля к тем, что устанавливаются в заготовке:
BOOL COGView::PreCreateWindow(CREATESTRUCT& cs) { //====== Добавляем биты стиля, нужные OpenGL cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN; return CView::PreCreateWindow(cs); }
Вы помните, что окно OpenGL не должно позволять Windows стирать свой фон, так как данная операция сильно тормозит работу конвейера. В связи с этим введите в функцию обработки WM_ERASEBKGND код, сообщающий системе, что сообщение уже обработано:
BOOL COGView::OnEraseBkgnd(CDC* pDC) { return TRUE; }
Окно OpenGL имеет свой собственный формат пикселов. Нам следует выбрать и установить подходящий формат экранной поверхности в контексте устройства HDC, а затем создать контекст передачи изображения (HGLRC). Для описания формата пикселов экранной поверхности используется структура PIXELFORMATDESCRIPTOR. Выбор формата зависит от возможностей карты и намерений разработчика. Мы зададим в полях этой структуры такие настройки:
- глубину цвета – 24;
- тип буферизации – двойной;
- схему образования цвета RGBA;
- количество бит для буфера глубины – 32;
- поддержку регулировки прозрачностью и другие специфические настройки выключим.
В функцию OnCreate введите код подготовки окна OpenGL. Работа здесь ведется со структурой PIXELFORMATDESCRIPTOR. Кроме того, в ней создается контекст m_hRC и устанавливается в качестве текущего:
int COGView::OnCreate(LPCREATESTROCT IpCreateStruct) { if (CView::OnCreate(IpCreateStruct) == -1) return -1; PIXELFORMATDESCRIPTOR pfd = // Описатель формата { sizeof(PIXELFORMATDESCRIPTOR), // Размер структуры 1, // Номер версии PFD_DRAW_TO_WINDOW | // Поддержка GDI PFD_SUPPORT_OPENGL | // Поддержка OpenGL PFD_DOUBLEBUFFER, // Двойная буферизация PFD_TYPE_RGBA, // Формат RGBA, не палитра 24, // Количество плоскостей //в каждом буфере цвета 24, 0, // Для компонента Red 24, 0, // Для компонента Green 24, 0, // Для компонента Blue 24, 0, // Для компонента Alpha 0, // Количество плоскостей // буфера Accumulation 0, // То же для компонента Red 0, // для компонента Green 0, // для компонента Blue 0, // для компонента Alpha 32, // Глубина 2-буфера 0, // Глубина буфера Stencil 0, // Глубина буфера Auxiliary 0, // Теперь игнорируется 0, // Количество плоскостей 0, // Теперь игнорируется 0, // Цвет прозрачной маски 0 // Теперь игнорируется };