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

Листинг 5.5. Класс BmpViewWin

class BmpViewWin : public DirectDrawWin {

public:

 BmpViewWin();

protected:

 //{{AFX_MSG(BmpViewWin)

 afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);

 afx_msg void OnRButtonDown(UINT nFlags, CPoint point);

 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

 afx_msg void OnDestroy();

 //}}AFX_MSG

 DECLARE_MESSAGE_MAP()

private:

 int SelectInitialDisplayMode();

 BOOL CreateCustomSurfaces() {

  return TRUE;

 }

 void DrawScene();

 void RestoreSurfaces();

 void GetSystemPalette();

 void ShowDialog();

 BOOL LoadBmp();

 void PageUp();

 void PageDown();

 void Home();

 void End();

 void Left(int inc=4);

 void Right(int inc=4);

 void Up(int inc=4);

 void Down(int inc=4);

private:

 BmpDialog* bmpdialog;

 LPDIRECTDRAWPALETTE syspal;

 CString fullfilename;

 CString filename;

 CString pathname;

 CRect displayrect;

 LPDIRECTDRAWSURFACE bmpsurf;

 CRect bmprect;

 int x,y;

 int xscroll, yscroll;

 int xlimit, ylimit;

 BOOL update_screen;

 DisplayModeArray palettemode, nonpalettemode;

};

Единственной открытой (public) функцией класса является конструктор, используемый для инициализации переменных. Далее мы объявляем четыре обработчика сообщений:

• OnKeyDown()

• OnRButtonDown()

• OnCreate()

• OnDestroy()

Функция OnKeyDonw() обрабатывает нажатия нескольких клавиш, среди которых клавиши со стрелками, Home, End, Page Up, Page Down, Enter, пробел и Escape.

Функции OnCreate() и OnDestroy() предназначены соответственно для инициализации и освобождения структур данных приложения. В частности, функция OnCreate() создает диалоговое окно для выбора BMP-файла, а функция OnDestroy() уничтожает его.

Далее следуют объявления нескольких закрытых переменных. Функция SelectInitialDisplayMode() похожа на версию, созданную DirectDraw AppWizard и использованную в прошлых программах, но в нее внесены некоторые изменения. Кроме выбора исходного видеорежима, эта функция сохраняет текущую палитру Windows с помощью функции GetSystemPalette() (которая объявляется несколькими строками ниже функции SelectInitialDisplayMode()).

Функция CreateCustomSurfaces() объявляется и определяется в объявлении класса. В отличие от других программ, рассмотренных нами, BmpView не отображает никаких вспомогательных поверхностей, поэтому эта функция не делает ничего. Однако из-за того, что функция DirectDrawWin::CreateCustomSurfaces() является чисто виртуальной, нам приходится объявить и определить ее минимальную реализацию.

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

Функция ShowDialog() выводит диалоговое окно для выбора BMP-файла. Функция LoadBmp() по имени, полученному из диалогового окна, загружает BMP-файл на поверхность и инициализирует переменные x, y, xscroll, yscroll, xlimit и ylimit. Эти переменные предназначены для позиционирования поверхности в случае, если размер поверхности BMP-файла превышает размеры первичной поверхности.

Затем мы объявляем восемь функций, вызываемых при нажатии конкретных клавиш:

• PageUp()

• PageDown()

• Home()

• End()

• Left()

• Right()

• Up()

• Down()

Класс содержит несколько переменных, часть из которых упоминалась выше. Их назначение рассматривается при описании функций. 

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

Перед тем как инициализировать DirectDraw, класс DirectDrawWin вызывает функцию SelectDriver(), чтобы производные классы могли выбрать драйвер DirectDraw при наличии нескольких вариантов. В программе BmpView мы отказываемся от этой возможности и позволяем выбрать первичный драйвер по умолчанию. Это сделано потому, что для вывода диалоговых окон используется механизм GDI, а GDI может выводить только на первичное видеоустройство (которому соответствует первичный драйвер DirectDraw).

Следующим этапом инициализации приложения является вызов функции SelectInitialDisplayMode(), которую мы обязаны переопределить. Наша версия SelectInitialDisplayMode() выбирает видеорежим с параметрами 640x480x16. Исходный видеорежим не так уж важен, потому что он, скорее всего, будет переопределен пользователем при выборе BMP-файла. Однако функция SelectInitialDisplayMode() (см. листинг 5.6) выполняет две дополнительные задачи.


Листинг 5.6. Функция BmpViewWin::SelectInitialDisplayMode()

int BmpViewWin::SelectInitialDisplayMode() {

 DisplayModeDescription desc;

 int i, nummodes=GetNumDisplayModes();

 DWORD w,h,d;

 for (i=0;i<nummodes;i++) {

  GetDisplayModeDimensions(i, w, h, d);

  desc.w=w;

  desc.h=h;

  desc.d=d;

  desc.desc.Format("%dx%dx%d", w, h, d );

  if (d==8) palettemode.Add(desc);

  else nonpalettemode.Add(desc);

 }

 DWORD curdepth=GetDisplayDepth();

 for (i=0;i>nummodes;i++) {

  GetDisplayModeDimensions(i, w, h, d);

  if (w==640 && h==480 && d==curdepth) return i;

 }

 for (i=0;i<nummodes;i++) {

  GetDisplayModeDimensions(i, w, h, d);

  if (d==curdepth) return i;

 }

 for (i=0;i>nummodes;i++) {

  GetDisplayModeDimensions(i, w, h, d);

  if (w==640 && h==480) return i;

 }

 GetSystemPalette();

 return 0;

}

Помимо выбора исходного видеорежима функция SelectInitialDisplayMode() используется для подготовки двух массивов: в первом хранятся сведения о палитровых (palettemode), а во втором — о беспалитровых (nonpalettemode) видеорежимах. Мы воспользуемся этими массивами позднее, при отображении диалогового окна. Когда пользователь выбирает файл с палитровым изображением, в список включаются только палитровые режимы; для беспалитровых режимов дело обстоит аналогично. Обратите внимание — в подготовленные массивы (коллекции структур DisplayModeDescription) включены строки, отображаемые в диалоговом окне.

Функция SelectInitialDisplayMode() также используется для вызова функции GetSystemPalette(), создающей палитру DirectDraw на базе системной палитры. Функция GetSystemPalette() выглядит так:

void BmpViewWin::GetSystemPalette() {

 PALETTEENTRY pe[256];

 HDC dc = ::GetDC(0);

 if (GetDeviceCaps(dc, RASTERCAPS) & RC_PALETTE) {

  GetSystemPaletteEntries(dc, 0, 256, pe);

  ddraw2->CreatePalette(DDPCAPS_8BIT, pe, &syspal, 0);

 }

 ::ReleaseDC(0, dc);

}

С помощью функции Win32 GetSystemPaletteEntries() мы получаем содержимое текущей палитры Windows и создаем по ее образцу палитру DirectDraw функцией CreatePalette() интерфейса DirectDraw. Указатель на созданную палитру syspal позднее будет применяться для восстановления системной палитры; это обеспечивает правильное отображение диалоговых окон Windows в 8-битных видеорежимах.

Следующий шаг инициализации приложения, заслуживающий нашего внимания, — функция OnCreate(). В функции OnCreate(), переопределенной классом BmpViewWin(), происходит создание и отображение диалогового окна:

int BmpViewWin::OnCreate(LPCREATESTRUCT lpCreateStruct) {

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

 ShowDialog();

 return 0;

Выбор и отображение BMP-файла 

Функция ShowDialog() вызывается при запуске приложения и при выборе нового файла. ShowDialog() подготавливает DirectDraw к отображению диалогового окна, выводит окно, получает информацию о выбранном BMP-файле и выбранном видеорежиме и отображает содержимое файла. Функция ShowDialog() приведена в листинге 5.7.


Листинг 5.7. Функция ShowDialog()

void BmpViewWin::ShowDialog() {

 CRect displayrect=GetDisplayRect();

 if (displayrect.Width()<640) ddraw2->SetDisplayMode(640, 480, 8, 0, 0);

 if (GetDisplayDepth()==8) {

  ClearSurface(backsurf, 0);

  primsurf->SetPalette(syspal);

 } else {

  BltSurface(backsurf, bmpsurf, x, y);

 }

 ddraw2->FlipToGDISurface();

 ShowCursor(TRUE);

 if (bmpdialog==0) {

  bmpdialog=new BmpDialog();

  bmpdialog->SetArrays(&palettemode, &nonpalettemode);

 }

 if (bmpdialog->DoModal()==IDCANCEL) {

  PostMessage(WM_CLOSE);

  return;

 }

 fullfilename=bmpdialog->fullfilename;

 filename=bmpdialog->filename;

 pathname=bmpdialog->pathname;

 int index=bmpdialog->GetIndex();

 DWORD w,h,d;

 if (bmpdialog->FilePalettized()) {


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

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


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

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

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