Графика для Windows средствами DirectDraw | страница 81
> backsurf->BltFast(x, y, fpssurf, 0, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);
>}
>primsurf->Flip(0, DDFLIP_WAIT);
Если флаг displayfps равен TRUE, поверхность FPS следует вывести на экран. Однако сначала мы рассчитываем ее положение по известным размерам видеорежима и поверхности. Затем мы копируем поверхность fpssurf функцией BltFast(), после чего выводим на экран вторичный буфер функцией Flip() интерфейса DirectDrawSurface.
Задача функции DrawScene() выполнена — все три поверхности программы Switch выведены на экран. Тем не менее изучение приложения еще не закончено. Мы должны рассмотреть обработку пользовательского ввода.
Но перед тем как продолжить, я должен сделать одно замечание относительно программы Switch. Как мы видели во время рассмотрения ее кода, две из трех поверхностей программы имеют цветовые ключи для отображения прозрачных пикселей. Однако при запуске программы кажется, что анимационная поверхность (не имеющая цветового ключа) тоже является прозрачной. Почему? Потому что цвет фона растра (черный) совпадает с цветом вторичного буфера. Если изменить значение для заливки вторичного буфера, станет ясно, что анимационная поверхность на самом деле непрозрачна.
Обработка пользовательского ввода
При запуске программы Switch текст в нижней части меню подсказывает, какие клавиши управляют работой приложения. Клавиши со стрелками изменяют текущий выделенный видеорежим, клавиша Enter активизирует его (если он не является текущим), а клавиша Escape завершает работу программы. Все эти клавиши обрабатываются функцией OnKeyDown(), создаваемой ClassWizard. Ее код приведен в листинге 4.5.
Листинг 4.5. Функция SwitchWin::OnKeyDown()
>void SwitchWin::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {
> int newindex;
> int nmodes=GetNumDisplayModes();
> if (nmodes>maxmodes) nmodes=maxmodes;
> int rows=nmodes/menucols;
> if (nmodes%menucols) rows++;
> switch (nChar) {
> case VK_ESCAPE:
> PostMessage(WM_CLOSE);
> break;
> case VK_UP:
> newindex=selectmode-1;
> if (newindex>=0) {
> selectmode=newindex;
> UpdateMenuSurface();
> }
> break;
> case VK_DOWN:
> newindex=selectmode+1;
> if (newindex
> selectmode=newindex;
> UpdateMenuSurface();
> }
> break;
> case VK_LEFT:
> newindex=selectmode-rows;
> if (newindex>=0) {
> selectmode=newindex;
> UpdateMenuSurface();
> }
> break;
> case VK_RIGHT:
> newindex=selectmode+rows;
> if (newindex
> selectmode=newindex;
> UpdateMenuSurface();
> }
> break;
> case VK_RETURN: