Графика для 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()