Чтение онлайн

на главную - закладки

Жанры

Графика для 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. В результате все пиксели поверхности обнуляются. Так как ноль является цветовым ключом для данной поверхности, вся поверхность становится прозрачной.

Теперь все готово к выводу текста. Обратите внимание на функцию SetBkMode, которая указывает, что текст должен выводиться в прозрачном режиме. Это значит, что функция TextOut будет выводить только сам текст, без фона, благодаря чему наш прозрачный фон останется в неприкосновенности. Цвет текста задается функцией Win32 SetTextColor. В этой программе используются три цвета: первый — для обычного текста, второй — для затененного текста, и третий — для текста, выделенного подсветкой. Каждая текстовая строка выводится дважды — сначала затемненным, а потом обычным цветом; затененный текст смещен на один пиксель по отношению к обычному. После завершения вывода текста вызывается функция ReleaseDC интерфейса DirectDrawSurface.

Инициализация приложения завершается вызовом функции CreateFPSSurface, которая создает поверхность для вывода FPS. Она выглядит так:

BOOL SwitchWin::CreateFPSSurface {

 static const char dummystr[]="000 FPS";

 HDC hdc = ::GetDC(0);

 SelectObject(hdc, smallfont);

 SIZE size;

 GetTextExtentPoint(hdc, dummystr, strlen(dummystr), &size);

 ::ReleaseDC(0, hdc);

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

Отмороженный 8.0

Гарцевич Евгений Александрович
8. Отмороженный
Фантастика:
постапокалипсис
рпг
аниме
5.00
рейтинг книги
Отмороженный 8.0

Газлайтер. Том 14

Володин Григорий Григорьевич
14. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 14

Ермак. Телохранитель

Валериев Игорь
2. Ермак
Фантастика:
альтернативная история
7.00
рейтинг книги
Ермак. Телохранитель

Матабар IV

Клеванский Кирилл Сергеевич
4. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар IV

Сборник коротких эротических рассказов

Коллектив авторов
Любовные романы:
эро литература
love action
7.25
рейтинг книги
Сборник коротких эротических рассказов

Идеальный мир для Лекаря 19

Сапфир Олег
19. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 19

Дочь моего друга

Тоцка Тала
2. Айдаровы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Дочь моего друга

Свет Черной Звезды

Звездная Елена
6. Катриона
Любовные романы:
любовно-фантастические романы
5.50
рейтинг книги
Свет Черной Звезды

Кодекс Крови. Книга IV

Борзых М.
4. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IV

Идеальный мир для Лекаря 22

Сапфир Олег
22. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 22

Попаданка в академии драконов 4

Свадьбина Любовь
4. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.47
рейтинг книги
Попаданка в академии драконов 4

Сердце Дракона. Том 12

Клеванский Кирилл Сергеевич
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Сердце Дракона. Том 12

Лолита

Набоков Владимир Владимирович
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Лолита

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад