Графика для Windows средствами DirectDraw | страница 90



и UpdateRateMenuSurface() и присваиваем флагу ratemenu_up значение TRUE. Давайте рассмотрим эти две функции. Функция CreateRateMenuSurface() выглядит так:

>BOOL SuperSwitchWin::CreateRateMenuSurface() {

> if (ratemenusurf) ratemenusurf->Release(), ratemenusurf=0;

> int rates=refresh_rates[selectmode].GetSize();

> ratemenusurf=CreateSurface(80, rates*12+22);

> return TRUE;

>}

Сначала эта функция освобождает существующую поверхность (если таковая была создана ранее). Затем она определяет количество частот для выделенного в меню видеорежима и рассчитывает по ним размеры поверхности меню частот. Поверхность создается версией CreateSurface(), которой передаются ширина и высота новой поверхности.

Функция UpdateRateMenuSurface() отвечает за отображение текста меню. Выглядит она так:

>BOOL SuperSwitchWin::UpdateRateMenuSurface() {

> RECT rect;

> GetSurfaceRect(ratemenusurf, rect);

> rect.left++;

> rect.top++;

> rect.right--;

> rect.bottom--;

> if (!ClearSurface(ratemenusurf, 0, 200, 132)) TRACE("first Clear failed\n");

> if (!ClearSurface(ratemenusurf, 0, 128, 100, &rect)) TRACE("second Clear failed\n");

> HDC hdc;

> ratemenusurf->GetDC(&hdc);

> SelectObject(hdc, smallfont);

> SetBkMode(hdc, TRANSPARENT);

> SetTextColor(hdc, ratetextshadow);

> ExtTextOut(hdc, 6, 4, 0, 0, rateheader, strlen(rateheader), 0);

> SetTextColor(hdc, ratetextcolor);

> ExtTextOut(hdc, 5, 3, 0, 0, rateheader, strlen(rateheader), 0);

> CArray& ratelist=refresh_rates[selectmode];

> numrates=ratelist.GetSize();

> for (int i=0; i

>  char buf[10];

>  int len=sprintf(buf, "%d hz", ratelist[i]);

>  SetTextColor(hdc, ratetextshadow);

>  ExtTextOut(hdc, 11, i*12+18, 0, 0, buf, len, 0);

>  if (i==selectrate) SetTextColor(hdc, ratehighlightcolor);

>  else SetTextColor(hdc, ratetextcolor);

>  ExtTextOut(hdc, 10, i*12+17, 0, 0, buf, len, 0);

> }

> ratemenusurf->ReleaseDC(hdc);

> return TRUE;

>}

Прежде всего функция очищает поверхность, вызывая ClearSurface(). Затем содержимое массива refresh_rates используется для вывода текстовых строк, связанных с каждым пунктом меню. Вывод текста, как обычно, осуществляется функцией GetDC() интерфейса DirectDrawSurface в сочетании с текстовыми функциями Win32. Перед выходом из функции UpdateRateMenuSurface() контекст устройства, полученный функцией GetDC(), освобождается с помощью функции ReleaseDC()

Заключение

В этой главе мы рассмотрели две демонстрационные программы и воспользовались такими возможностями DirectDraw, как переключение видеорежимов и частот смены кадров, а также применили цветовые ключи. Для переключения видеорежимов и частот использовалась функция