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;
}
|