ПРОГРАМИРУЕМ 3D ГРАФИКУ ИСПОЛЬЗУЯ DirectX


цитрамон форте

Клипы - часть 10


}

// Найти текущий кадр POSITION pos = m_Take.FindIndex(m_iCurFrame);

if (!pos) {

m_bIsPlaying = FALSE;

return FALSE;

}

CMovieFrame* pFrame = m_Take.GetAt(pos);

ASSERT(pFrame) ;

// Получить текущий контекст устройства (DC) ASSERT(m_p3dWnd) ;

CDC* pdc = m_p3dWnd-»GetDC() ;

// Задать палитру 262 ЩЦ1 Глава 11. Клипы

CPalette* pOldPal ° NULL;

CPalette* pPal = m_Take.GetPalette();

if (pPal) {

pOldPal = pdc-»SelectPalette(pPal, FALSE);

pdc-»RealizePalette () ;

}

// Создать совместимый DC для растра CDC dcMem;

dcMem.CreateCompatibleDC(pdc);

// Выбрать палитру в совместимом DC CPalette* pOldMemPal = NULL;

if (pPal) {

pOldMemPal = dcMem.SelectPalette(pPal, FALSE);

dcMem.RealizePalette() ;

}

// Выбрать растр в совместимом DC

HBITMAP hOldBmp = (HBITMAP) ::SelectObject(dcMem, pFrame-»m hBmp) ;

// Скопировать растр в окно pdc-»BitBlt (0, О,

m_Take.GetWidth(), m_Take.GetHeight(),

SidcMem,

0, 0,

SRCCOPY) ;

// Восстановить прежнее состояние DC if (pOldMemPal) {

dcMem.SelectPalette(pOldMemPal, FALSE) ;

} ::SelectObject(dcMem, hOldBmp);

if (pOldPal) (

pdc-»SelectPalette (pOldPal, FALSE) ;

} m_p3dWnd-»ReleaseDC(pdc) ;

m_iCurFrame++;

return TRUE; // Остальные кадры

}

Покадровая съемка ''''Щ 263

Последовательность действий в приведенном выше фрагменте такова:

1. Найти следующий выводимый кадр.

2. Получить контекст устройства (DC) для окна.

3. Выбрать палитру в DC окна.

4. Создать в памяти совместимый DC.

5. Выбрать палитру в совместимом DC.

6. Выбрать логический номер растра в объекте CMovieFrame и поместить его в совместимый DC.

7. Вызвать функцию BitBIt для копирования изображения из совместимого в оконный DC.

8. Восстановить состояние DC и освободить их.

Ветераны программирования для Windows немедленно узнают в этом чудовищном списке необходимую последовательность действий для вывода растра в окне.

На первый взгляд может показаться, что многократный выбор и реализация палитры должны быть чрезвычайно медленными. Однако Windows знает, что при выполнении этих действий с одной и той же палитрой делать ничего не нужно, поэтому все издержки связаны только с вызовом BitBIt.




Содержание  Назад  Вперед