Найти текущий кадр POSITION pos
}
// Найти текущий кадр 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.
Содержание Назад Вперед