Краткое описание по работе с Direct Draw

         

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;

}


Содержание раздела