Стэн Трухильо - Графика для Windows средствами DirectDraw

Тут можно читать онлайн Стэн Трухильо - Графика для Windows средствами DirectDraw - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Графика для Windows средствами DirectDraw
  • Автор:
  • Жанр:
  • Издательство:
    неизвестно
  • Год:
    неизвестен
  • ISBN:
    нет данных
  • Рейтинг:
    4.88/5. Голосов: 81
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 100
    • 1
    • 2
    • 3
    • 4
    • 5

Стэн Трухильо - Графика для Windows средствами DirectDraw краткое содержание

Графика для Windows средствами DirectDraw - описание и краткое содержание, автор Стэн Трухильо, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Графика для Windows средствами DirectDraw - читать онлайн бесплатно полную версию (весь текст целиком)

Графика для Windows средствами DirectDraw - читать книгу онлайн бесплатно, автор Стэн Трухильо
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

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

fpsrect.left=0;

fpsrect.top=0;

fpsrect.right=size.cx+1;

fpsrect.bottom=size.cy+1;

fpssurf=CreateSurface(fpsrect.right, fpsrect.bottom);

DDCOLORKEY ddck;

ddck.dwColorSpaceLowValue = 0;

ddck.dwColorSpaceHighValue = 0;

fpssurf->SetColorKey(DDCKEY_SRCBLT, &ddck);

framecount=0;

displayfps=FALSE;

return TRUE;

}

Работа CreateFPSSurface()начинается с определения размера поверхности функцией GetTextExtentPoint(). Фиктивная строка (с текстом, который занимает максимальную возможную площадь) передается в качестве аргумента функции GetTextExtentPoint(), вычисляющей размеры области (в пикселях) для вывода заданного текста. По размерам, полученным от GetTextExtentPoint(), мы определяем размеры поверхности, добавляя один пиксель для смещения тени. Такой подход отличается от использованного в функции CreateMenuSurface(), потому что этот код автоматически регулирует размеры поверхности при изменении размера шрифта. Поверхность меню, напротив, обладает фиксированными размерами, не зависящими от размера шрифта.

По аналогии с menusurfмы обеспечиваем прозрачность, назначая поверхности нулевой цветовой ключ (с помощью функции SetColorKey()интерфейса DirectDrawSurface). Наконец, переменная framecount(предназначенная для подсчета кадров за текущий интервал хронометража) обнуляется, а логической переменной displayfpsприсваивается значение FALSE, согласно которому поверхность FPS пока не должна отображаться на экране.

Хотя мы создали поверхность fpssurf, она осталась неинициализированной. В отличие от поверхности menusurf, инициализируемой функцией UpdateMenuSurface(), мы пока не можем инициализировать поверхность FPS, потому что у нас еще нет выводимого значения. Приложение только что было запущено (или только что перешло в другой видеорежим), так что вывод любого значения FPS был бы необоснованным.

К этому моменту инициализация программы Switch завершается. Наши поверхности (три вспомогательные, плюс первичная поверхность со вторичным буфером) были созданы и подготовлены к работе. Давайте посмотрим, как они отображаются на экране.

Графический вывод

Графическим выводом в программе Switch занимается функция SwitchWin::DrawScene(). Она отвечает за подготовку кадра во вторичном буфере и переключение страниц, благодаря которому новый кадр отображается на экране. Код функции DrawScene()содержится в листинге 4.4.

Листинг 4.4.Функция SwitchWin::DrawScene()

void SwitchWin::DrawScene() {

ClearSurface(backsurf, 0);

BltSurface(backsurf, bmpsurf, x, y);

x+=xinc;

y+=yinc;

const CRect& displayrect=GetDisplayRect();

if (x<-160 || x>displayrect.right-160) {

xinc=-xinc;

x+=xinc;

}

if (y<-100 || y>displayrect.bottom-100) {

yinc=-yinc;

y+=yinc;

}

backsurf->BltFast(0, 0, menusurf, 0, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);

UpdateFPSSurface();

if (displayfps) {

int x=displayrect.right-fpsrect.right-1;

int y=displayrect.bottom-fpsrect.bottom-1;

backsurf->BltFast(x, y, fpssurf, 0, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT );

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Стэн Трухильо читать все книги автора по порядку

Стэн Трухильо - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




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


Отзывы читателей о книге Графика для Windows средствами DirectDraw, автор: Стэн Трухильо. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x