Вход/Регистрация
Графика для Windows средствами DirectDraw
вернуться

Трухильо Стэн

Шрифт:

Затем происходит инициализация самой поверхности и переменных, связанных с видеорежимом. Переменной selectmode присваивается значение, зависящее от текущего видеорежима. Это значение используется для выделения активного видеорежима в меню. Указатель на поверхность меню видеорежимов (menusurf) инициализируется вызовами функций CreateMenuSurface и UpdateMenuSurface.

Наконец, переменные поверхности FPS инициализируются функцией Create FPSSurface. Мы рассмотрим ее позднее, после функций CreateMenuSurface и UpdateMenuSurface.

Функция CreateMenuSurface выглядит так:

BOOL SwitchWin::CreateMenuSurface {

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

 menusurf=CreateSurface(menuwidth, menuheight);

 if (menusurf==0) Fatal("SwitchWin::CreateMenuSurface failed\n");

 DDCOLORKEY ddck;

 ddck.dwColorSpaceLowValue = 0;

 ddck.dwColorSpaceHighValue = 0;

 menusurf->SetColorKey(DDCKEY_SRCBLT, &ddck);

 return TRUE;

}

Прежде всего CreateMenuSurface освобождает любые поверхности, созданные ранее. Новая поверхность создается функцией CreateSurface. Доступ к ней осуществляется через переменную menusurf. Затем мы назначаем новой поверхности цветовой ключ с помощью структуры DDCOLORKEY и функции SetColorKey интерфейса DirectDrawSurface.

Если вы не знаете, для чего нужны цветовые ключи, попробуйте запустить программу Switch и понаблюдать за поведением меню видеорежимов. Обратите внимание — когда перемещающийся растр оказывается в верхней части экрана, он проходит как бы позади меню, но при этом остается видимым. Текст меню непрозрачен, однако те части меню, в которых текста нет, прозрачны. Дело в том, что пиксели пустых участков меню не выводятся DirectDraw и потому не заслоняют растр. Цветовой ключ определяет, какие именно пиксели поверхности не будут выводиться.

Мы назначаем цветовой ключ поверхности меню с помощью структуры DDCOLORKEY и функции SetColorKey. Оба поля DDCOLORKEY обнуляются (некоторые видеокарты позволяют задавать интервалы цветовых ключей, но в нашем случае используется всего один цвет). Это означает, что пиксели поверхности, равные нулю, не будут копироваться при блит-операциях с активным цветовым ключом.

После того как поверхность меню будет создана функцией CreateMenuSurface, она заполняется с помощью функции UpdateMenuSurface. Внутри последней для вывода текста на поверхность используются функция GetDC интерфейса DirectDrawSurface и текстовые функции Win32. Функция UpdateMenuSurface приведена в листинге 4.3.

Листинг 4.3. Функция SwitchWin::UpdateMenuSurface

BOOL SwitchWin::UpdateMenuSurface {

 char buf[40];

 int len;

 int hdrlen=strlen(headertext);

 ClearSurface(menusurf, 0);

 HDC hdc;

 menusurf->GetDC(&hdc);

 SelectObject(hdc, largefont);

 SetBkMode(hdc, TRANSPARENT);

 SetTextColor(hdc, textshadow);

 TextOut(hdc, 1, 1, headertext, hdrlen);

 SetTextColor(hdc, textcolor);

 TextOut(hdc, 0, 0, headertext, hdrlen);

 SelectObject(hdc, smallfont);

 int nmodes=GetNumDisplayModes;

 if (nmodes>maxmodes) nmodes=maxmodes;

 int rows=nmodes/menucols;

 if (nmodes%menucols) rows++;

 for (int i=0; i<nmodes; i++) {

int x=(i/rows)*colwidth+2;

int y=(i%rows)*rowheight+reservedspace;

DWORD w,h,d;

GetDisplayModeDimensions(i, w, h, d);

len=sprintf(buf, "%dx%dx%d", w, h, d);

SetTextColor(hdc, textshadow);

TextOut(hdc, x+1, y+1, buf, len);

if (i==selectmode) SetTextColor(hdc, brighttextcolor);

else SetTextColor(hdc, textcolor);

TextOut(hdc, x, y, buf, len);

 }

 len=sprintf(buf, "[Arrows] [Enter] [Escape]");

 SetTextColor(hdc, textshadow);

 TextOut(hdc, 3, 186, buf, len);

 SetTextColor(hdc, textcolor);

 TextOut(hdc, 2, 185, buf, len);

 menusurf->ReleaseDC(hdc);

 return TRUE;

}

Функция UpdateMenuSurface вызывает ClearSurface и передает ей в качестве аргументов указатель menusurf и 0. В результате все пиксели поверхности обнуляются. Так как ноль является цветовым ключом для данной поверхности, вся поверхность становится прозрачной.

  • Читать дальше
  • 1
  • ...
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: