My-library.info
Все категории

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

На электронном книжном портале my-library.info можно читать бесплатно книги онлайн без регистрации, в том числе Стэн Трухильо - Графика для Windows средствами DirectDraw. Жанр: Программирование издательство неизвестно, год 2004. В онлайн доступе вы получите полную версию книги с кратким содержанием для ознакомления, сможете читать аннотацию к книге (предисловие), увидеть рецензии тех, кто произведение уже прочитал и их экспертное мнение о прочитанном.
Кроме того, в библиотеке онлайн my-library.info вы найдете много новинок, которые заслуживают вашего внимания.

Название:
Графика для Windows средствами DirectDraw
Издательство:
неизвестно
ISBN:
нет данных
Год:
неизвестен
Дата добавления:
17 сентябрь 2019
Количество просмотров:
155
Читать онлайн
Стэн Трухильо - Графика для Windows средствами DirectDraw

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

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

Графика для Windows средствами DirectDraw читать онлайн бесплатно

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

Теперь давайте рассмотрим новые и изменившиеся переменные класса. Указатель menusurf из программы Switch был переименован в modemenusurf по той же причине, по которой были переименованы функции для работы с поверхностью меню видеорежимов. Далее в классе появились шесть новых переменных. Я снова приведу объявления новых переменных класса из листинга 4.6:

LPDIRECTDRAWSURFACE ratemenusurf;

int selectrate;

int numrates;

BOOL ratemenu_up;

BOOL include_refresh;

CArray<DWORD,DWORD> 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<numrates-1) {

    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();

  }

  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 просто скрывает его. Действие клавиш со стрелками также зависит от состояния меню. Если меню частот отображается, стрелки ­ и изменяют выделенную частоту, а если нет — выделенный пункт в меню видеорежимов.


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

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


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

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

Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*
Все материалы на сайте размещаются его пользователями.
Администратор сайта не несёт ответственности за действия пользователей сайта..
Вы можете направить вашу жалобу на почту librarybook.ru@gmail.com или заполнить форму обратной связи.