Стэн Трухильо - Графика для 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 - читать книгу онлайн бесплатно, автор Стэн Трухильо
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

LPDIRECTDRAWSURFACE ratemenusurf;

int selectrate;

int numrates;

BOOL ratemenu_up;

BOOL include_refresh;

CArray refresh_rates[MAXDISPLAYMODES];

Переменная ratemenusurfпредставляет собой указатель на интерфейс DirectDrawSurfaceи используется для работы с поверхностью меню частот. В целых переменных selectrateи numratesхранятся соответственно текущая выделенная частота и общее количество отображаемых частот. Логическая переменная ratemenu_upпоказывает, отображается ли меню частот в данный момент.

Значение логической переменной include_refreshопределяется выбором пользователя, сделанным в окне диалога при старте программы. Если эта переменная равна TRUE, программа создает и выводит меню со списком частот для каждого выделенного видеорежима. Если переменная равна FALSE, частоты не отображаются. Наконец, массив refresh_ratesпредназначен для хранения возможных частот каждого видеорежима. Содержимое массива определяется с помощью косвенно вызываемой функции StoreModeInfo()и используется функцией UpdateRateMenusurface().

Инициализация приложения

Как упоминалось выше, перед инициализацией DirectDraw программа SuperSwitch выводит в функции SuperSwitchWin::OnCreate()диалоговое окно. После вывода диалогового окна функция вызывает версию OnCreate()класса DirectDrawWin. Код функции SuperSwitchWin::OnCreate()выглядит так:

int SuperSwitchWin::OnCreate(LPCREATESTRUCT lpCreateStruct) {

IntroDialog introdialog;

if (introdialog.DoModal()!=IDOK) return -1;

include_refresh=introdialog.include_refresh;

if (DirectDrawWin::OnCreate(lpCreateStruct)==-1) return -1;

if (include_refresh) ddraw2->EnumDisplayModes(DDEDM_REFRESHRATES, 0, this, StoreModeInfo);

return 0;

}

Сначала мы создаем объект класса IntroDialog — этот класс-оболочка был сгенерирован ClassWizard. Диалоговое окно отображается функцией CDialog::DoModal(), которая возвращает код IDOKв случае нажатия пользователем кнопки OK. Если пользователь закрывает диалоговое окно другим способом (например, нажимая кнопку Cancel), функция OnCreate()возвращает код –1, что для MFC является признаком завершения приложения. Если была нажата кнопка OK, переменной include_refreshприсваивается значение в зависимости от состояния флажка в диалоговом окне.

Теперь мы вызываем версию OnCreate()класса DirectDrawWin, где и происходит инициализация DirectDraw. Функция составляет список видеорежимов, активизирует исходный режим и создает поверхности приложения. Если вызов функции OnCreate()завершается неудачей, мы завершаем приложение, возвращая код –1.

Следующий шаг — повторное составление списка видеорежимов. На этот раз при вызове функции EnumDisplayModes()в первом аргументе передается флаг DDEDM_REFRESHRATES, согласно которому каждый видеорежим должен быть включен в список по одному разу для каждой поддерживаемой частоты. В результате мы сможем построить список частот для каждого видеорежима. Четвертый аргумент EnumDisplayModes()— функция косвенного вызова StoreModeInfo(), которая выглядит так:

HRESULT WINAPI SuperSwitchWin::StoreModeInfo(LPDDSURFACEDESC desc, LPVOID p) {

DWORD w=desc->dwWidth;

DWORD h=desc->dwHeight;

DWORD d=desc->ddpfPixelFormat.dwRGBBitCount;

DWORD r=desc->dwRefreshRate;

SuperSwitchWin* win=(SuperSwitchWin*)p;

int index=win->GetDisplayModeIndex(w, h, d);

win->refresh_rates[index].Add(r);

return DDENUMRET_OK;

}

Функции StoreModeInfo()>передается указатель на структуру DDSURFACEDESCс описанием очередного видеорежима. В описание входит частота смены кадров (поле dwRefreshRate), а также размеры, по которым определяется индекс режима. Затем этот индекс используется для сохранения частоты видеорежима в массиве.

После выхода из функции OnCreate()класс DirectDrawWinвызывает функцию CreateCustomSurfaces(). По сравнению с программой Switch эта функция не изменилась; она по-прежнему создает три поверхности, потому что новая поверхность ( ratemenusurface) создается только в случае необходимости.

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

Давайте посмотрим, как в программе SuperSwitch реализована функция DrawScene(). Она похожа на одноименную функцию из программы Switch, за исключением того, что при выборе видеорежима новая версия должна отображать поверхность со списком частот. Функция DrawScene()выглядит так:

void SuperSwitchWin::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, modemenusurf, 0, DDBLTFAST_SRCCOLORKEY | DDBLTFAST_WAIT);

if (ratemenu_up) {

DWORD w,h;

GetSurfaceDimensions(ratemenusurf, w, h);

backsurf->BltFast((320-w)/2, (200-h)/2, ratemenusurf, 0, DDBLTFAST_WAIT);

}

UpdateFPSSurface();

if (displayfps) {

int x=displayrect.right-fpsrect.right;

int y=displayrect.bottom-fpsrect.bottom;

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

}

primsurf->Flip(0, DDFLIP_WAIT);

}

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

Обработка пользовательского ввода

Теперь в программу необходимо включить код для обработки пользовательского ввода при работе с меню частот. Мы воспользуемся функцией OnKeyDown()(листинг 4.7).

Листинг 4.7. Функция SuperSwitch::OnKeyDown()

void SuperSwitchWin::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {

int newindex;

int nmodes=GetNumDisplayModes();

if (nmodes>maxmodes) nmodes=maxmodes;

int rows=nmodes/menucols;

if (nmodes%menucols) rows++;

switch (nChar) {

case VK_ESCAPE:

if (!include_refresh || !ratemenu_up) {

PostMessage(WM_CLOSE);

break;

}

if (ratemenu_up) {

ratemenu_up=FALSE;

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

}

break;

case VK_UP:

if (include_refresh && ratemenu_up) {

if (selectrate>0) {

selectrate--;

UpdateRateMenuSurface();

}

} else {

newindex=selectmode-1;

if (newindex>=0) {

selectmode=newindex;

UpdateModeMenuSurface();

}

}

break;

case VK_DOWN:

if (include_refresh && ratemenu_up) {

if (selectrate

selectrate++;

UpdateRateMenuSurface();

}

} else {

newindex=selectmode+1;

if (newindex>nmodes) {

selectmode=newindex;

UpdateModeMenuSurface();

}

}

break;

case VK_LEFT:

if (include_refresh && ratemenu_up) break;

newindex=selectmode-rows;

if (newindex>=0) {

selectmode=newindex;

UpdateModeMenuSurface();

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

Интервал:

Закладка:

Сделать


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

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




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


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


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

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