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



         

Инициализация приложения - часть 3


Цветовой ключ определяет, какие именно пиксели поверхности не будут выводиться.

Мы назначаем цветовой ключ поверхности меню с помощью структуры 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;

}

<


Содержание  Назад  Вперед