DirectDraw и MFC
1.
Особености встраивания объектов DirectDraw в МFС
2. Поддержка оконного интерфейса при использовании DirectDraw в МFС
3. Прямое рисование (минуя GDI)
· переписан метод OnPaint() в котором создается указатель на CDC за экранной поверхности , вызывается метод OnDraw(CDC* pDC ), по окончании которого производится копирование содержимого за экранной поверхности в область текущего окна
· переписан метод OnSize - при изменении размеров окна производится уничтожение старой за экранной поверхности и инициализация новой.
· переписан метод OnEraseBackgraund()
Я думаю, для выяснения деталей лучше просто посмотреть исходники.
3 .Прямое рисование (минуя GDI)
Что такое мистические видео поверхности в DirectDraw. Войдите в панель управления Windows 95 , откройте панель ресурсов Вашего видеоадаптера и Вы увидите, что он использует значительного размера кусок памяти . Т.е. вся видеопамять как бы спроецирована на Ваше ОЗУ. DirectDraw - это механизм позволяющий Вам буквально напрямую использовать данное ОЗУ , при этом напрямую используя возможности видео ускорителя Вашего видеоадаптера. Все эти LPDIRECTDRAWSURFACE есть просто указатели на видеопамять отведенную вашему изображению. А отсюда зная его структуру можно напрямую в нем рисовать - просто записывая в него необходимые Вам значения. Ниже приведен участок кода для поддержки рисования точки (Примечание код взят из ответа на одной из конференций qiz@algonet.se).
Рисование точки для видеорежима 640x480x8 UINT SetPixel( UINT x, UINT y, UINT colorValue ) { UINT PointOffset; UINT RetColorValue=0; DDSURFACEDESC DDSDesc; __int8* lpDstBits; HRESULT ddrval; DDSDesc.dwSize = sizeof(DDSDesc); // Захват видеопамяти для записи while(1) { ddrval = lpDDSBack->Lock(NULL, &DDSDesc, 0, NULL); if(ddrval == DD_OK) break; if(ddrval != DDERR_WASSTILLDRAWING) return 0; } // set the destination pixel // in this case resolution is 640 * 480 * 8 lpDstBits = (LPSTR) DDSDesc.lpSurface; PointOffset = (640 * y) + x; // если Вам нужен возврат цвета точки RetColorValue=lpDstBits[Pointoffset]; // нарисуем точку lpDstBits[Pointoffset] = (__int8) colorValue; // now ulock the surface lpDDSBack->Unlock(NULL); return RetColorValue; } |