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

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

Жанры

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

Трухильо Стэн

Шрифт:

newindex=selectmode-rows;

if (newindex>=0) {

selectmode=newindex;

UpdateModeMenuSurface;

}

break;

 case VK_RIGHT:

if (include_refresh && ratemenu_up) break;

newindex=selectmode+rows;

if (newindex<nmodes) {

selectmode=newindex;

UpdateModeMenuSurface;

}

break;

 case VK_RETURN:

if (include_refresh) {

if (ratemenu_up) {

int rate=refresh_rates[selectmode][selectrate];

ActivateDisplayMode(selectmode, rate);

x=y=0;

ratemenu_up=FALSE;

} else {

CreateRateMenuSurface;

UpdateRateMenuSurface;

ratemenu_up=TRUE;

}

} else {

if (selectmode!=GetCurDisplayMode) {

ActivateDisplayMode(selectmode);

x=y=0;

}

}

break;

 case 'S':

SaveSurface(primsurf, "SuperSwitch.bmp");

break;

 default:

DirectDrawWin::OnKeyDown(nChar, nRepCnt, nFlags);

 }

}

Все case

секции оператора switch были изменены для работы с новым меню. При нажатии клавиши Escape программа по-прежнему завершает работу, если меню частот в данный момент не отображается; тем не менее, если меню присутствует на экране, клавиша Escape просто скрывает его. Действие клавиш со стрелками также зависит от состояния меню. Если меню частот отображается, стрелки ­ и изменяют выделенную частоту, а если нет — выделенный пункт в меню видеорежимов.

Самые существенные различия связаны с обработкой клавиши Enter. Если во время нажатия клавиши Enter меню частот не отображается, мы вызываем функции CreateRateMenuSurface и UpdateRateMenuSurface и присваиваем флагу ratemenu_up значение TRUE. Давайте рассмотрим эти две функции. Функция CreateRateMenuSurface выглядит так:

BOOL SuperSwitchWin::CreateRateMenuSurface {

 if (ratemenusurf) ratemenusurf->Release, ratemenusurf=0;

 int rates=refresh_rates[selectmode].GetSize;

 ratemenusurf=CreateSurface(80, rates*12+22);

 return TRUE;

}

Сначала

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

Функция UpdateRateMenuSurface отвечает за отображение текста меню. Выглядит она так:

BOOL SuperSwitchWin::UpdateRateMenuSurface {

 RECT rect;

 GetSurfaceRect(ratemenusurf, rect);

 rect.left++;

 rect.top++;

 rect.right--;

 rect.bottom--;

 if (!ClearSurface(ratemenusurf, 0, 200, 132)) TRACE("first Clear failed\n");

 if (!ClearSurface(ratemenusurf, 0, 128, 100, &rect)) TRACE("second Clear failed\n");

 HDC hdc;

 ratemenusurf->GetDC(&hdc);

 SelectObject(hdc, smallfont);

 SetBkMode(hdc, TRANSPARENT);

 SetTextColor(hdc, ratetextshadow);

 ExtTextOut(hdc, 6, 4, 0, 0, rateheader, strlen(rateheader), 0);

 SetTextColor(hdc, ratetextcolor);

 ExtTextOut(hdc, 5, 3, 0, 0, rateheader, strlen(rateheader), 0);

 CArray<DWORD,DWORD>& ratelist=refresh_rates[selectmode];

 numrates=ratelist.GetSize;

 for (int i=0; i<numrates; i++) {

char buf[10];

int len=sprintf(buf, "%d hz", ratelist[i]);

SetTextColor(hdc, ratetextshadow);

ExtTextOut(hdc, 11, i*12+18, 0, 0, buf, len, 0);

if (i==selectrate) SetTextColor(hdc, ratehighlightcolor);

else SetTextColor(hdc, ratetextcolor);

ExtTextOut(hdc, 10, i*12+17, 0, 0, buf, len, 0);

 }

 ratemenusurf->ReleaseDC(hdc);

 return TRUE;

}

Прежде всего функция очищает поверхность, вызывая ClearSurface. Затем содержимое массива refresh_rates используется для вывода текстовых строк, связанных с каждым пунктом меню. Вывод текста, как обычно, осуществляется функцией GetDC интерфейса DirectDrawSurface в сочетании с текстовыми функциями Win32. Перед выходом из функции UpdateRateMenuSurface контекст устройства, полученный функцией GetDC, освобождается с помощью функции ReleaseDC

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

1941: Время кровавых псов

Золотько Александр Карлович
1. Всеволод Залесский
Приключения:
исторические приключения
6.36
рейтинг книги
1941: Время кровавых псов

Весь цикл «Десантник на престоле». Шесть книг

Ланцов Михаил Алексеевич
Десантник на престоле
Фантастика:
альтернативная история
8.38
рейтинг книги
Весь цикл «Десантник на престоле». Шесть книг

Попаданка 2

Ахминеева Нина
2. Двойная звезда
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Попаданка 2

Кротовский, не начинайте

Парсиев Дмитрий
2. РОС: Изнанка Империи
Фантастика:
городское фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Кротовский, не начинайте

Вечный. Книга VI

Рокотов Алексей
6. Вечный
Фантастика:
рпг
фэнтези
5.00
рейтинг книги
Вечный. Книга VI

Локки 5. Потомок бога

Решетов Евгений Валерьевич
5. Локки
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Локки 5. Потомок бога

Миф об идеальном мужчине

Устинова Татьяна Витальевна
Детективы:
прочие детективы
9.23
рейтинг книги
Миф об идеальном мужчине

Кровь на эполетах

Дроздов Анатолий Федорович
3. Штуцер и тесак
Фантастика:
альтернативная история
7.60
рейтинг книги
Кровь на эполетах

Темный Лекарь 6

Токсик Саша
6. Темный Лекарь
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Темный Лекарь 6

Опасная любовь командора

Муратова Ульяна
1. Проклятые луной
Фантастика:
фэнтези
5.00
рейтинг книги
Опасная любовь командора

Как я строил магическую империю 4

Зубов Константин
4. Как я строил магическую империю
Фантастика:
боевая фантастика
постапокалипсис
аниме
фантастика: прочее
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 4

Титан империи 8

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

На прицеле

Кронос Александр
6. Лэрн
Фантастика:
фэнтези
боевая фантастика
стимпанк
5.00
рейтинг книги
На прицеле

Вечный. Книга III

Рокотов Алексей
3. Вечный
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга III