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



.

Если вы не знаете, для чего нужны цветовые ключи, попробуйте запустить программу 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

>  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()