Графика для Windows средствами DirectDraw | страница 90
>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
> 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, как переключение видеорежимов и частот смены кадров, а также применили цветовые ключи. Для переключения видеорежимов и частот использовалась функция