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

Интервал:

Закладка:

Сделать
Завершение

Как бы ни была хороша программа Bounce, рано или поздно вам захочется убрать ее с экрана. Нажатие клавиши Escapeзавершает работу программы. Это происходит в обработчике OnKeyDown():

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

if (nChar==VK_ESCAPE) PostMessage(WM_CLOSE);

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

}

Приложение завершает работу, отправляя сообщение WM_CLOSE. В нашем приложении на это сообщение реагирует и класс окна, и класс приложения. Класс окна отвечает сообщением WM_DESTROY, для которого в DirectDrawWinпредусмотрен обработчик OnDestroy(). Класс DirectDrawWinв данном обработчике освобождает объекты DirectDraw и всю память, занимаемую приложением. Функция OnDestroy()выглядит так:

void DirectDrawWin::OnDestroy() {

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

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

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

for (int i=0;i

if (driver[i].guid) delete[] driver[i].guid;

free(driver[i].desc);

free(driver[i].name);

}

}

}

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

Класс приложения обрабатывает завершение в функции ExitInstance(), в которой удаляется класс окна:

int DirectDrawApp::ExitInstance() {

delete ddwin;

return CWinApp::ExitInstance();

}

На этом наше знакомство с программой Bounce заканчивается. Однако до сих пор речь шла только о полноэкранных приложениях. Оставшаяся часть этой главы посвящена оконным приложениям.

Оконные приложения

Наверное, вы уже поняли, что полноэкранным приложениям в этой книге уделяется особое внимание. Все программы на CD-ROM работают в полноэкранном режиме, и в этой главе до настоящего момента все внимание было сосредоточено исключительно на полноэкранных приложениях.

Дело в том, что книга посвящена быстродействующим графическим Windows-приложениям, а оконные приложения не обеспечивают оптимального быстродействия. Для полноты картины мы рассмотрим оконные приложения, но не так подробно, как полноэкранные. Впрочем, если вы захотите поддерживать оконный режим в своих приложениях, не все потеряно. Многие описанные приемы, реализованные в полноэкранных приложениях, в равной степени относятся и к оконным.

В начале этой главы мы воспользовались DirectDraw AppWizard и создали приложение Bounce. При этом мы указали, что создаваемая программа должна быть полноэкранной. Чтобы получить рассматриваемый ниже код, следует снова запустить AppWizard и выбрать оконное приложение.

Структура приложения

По своей структуре оконная версия приложения Bounce почти не отличается от полноэкранной. Как и прежде, классы DirectDrawWinи DirectDrawAppорганизуют поддержку DirectDraw и используются в качестве базовых для классов, относящихся к конкретным приложениям.

Инициализация

В полноэкранном варианте класса DirectDrawWinфункция OnCreate()инициализирует DirectDraw за несколько этапов. Оконный вариант выглядит проще, потому что ему не приходится перечислять драйверы DirectDraw или видеорежимы. Оконная версия функции OnCreate()выглядит так:

int DirectDrawWin::OnCreate(LPCREATESTRUCT) {

LPDIRECTDRAW ddraw1;

DirectDrawCreate(0, &ddraw1, 0);

ddraw1->QueryInterface(IID_IDirectDraw2, (void**)&ddraw2); ddraw1->Release(), ddraw1=0; ddraw2->SetCooperativeLevel(GetSafeHwnd(), DDSCL_NORMAL);

DetectDisplayMode();

if (CreateFlippingSurfaces()==FALSE) {

AfxMessageBox("CreateFlippingSurfaces() failed");

return FALSE;

}

if (CreateCustomSurfaces()==FALSE) {

AfxMessageBox("CreateCustomSurfaces() failed");

return FALSE;

}

return 0;

}

Сначала указатель на интерфейс DirectDraw(ddraw1)инициализируется функцией DirectDrawCreate(). Указатель ddraw1, как и в полноэкранной версии, используется только для получения указателя на интерфейс DirectDraw2, после чего освобождается.

Затем функция OnCreate()вызывает функцию SetCooperativeLevel(). В полноэкранном приложении уровень кооперации определялся тремя флагами: DDSCL_EXCLUSIVE, DDSCL_FULLSCREENи DDSCL_ALLOWMODEX. В данном случае используется только флаг DDSCL_NORMAL.

Функция DetectDisplayMode()инициализирует некоторые переменные класса DirectDrawWin. Она выглядит так:

BOOL DirectDrawWin::DetectDisplayMode() {

DDSURFACEDESC desc;

ZeroMemory(&desc, sizeof(desc));

desc.dwSize=sizeof(desc);

if (ddraw2->GetDisplayMode(&desc)!=DD_OK) {

TRACE("GetDisplayMode() failed\n");

return FALSE;

}

displayrect.left=0;

displayrect.top=0;

displayrect.right=desc.dwWidth;

displayrect.bottom=desc.dwHeight;

displaydepth=desc.ddpfPixelFormat.dwRGBBitCount;

return TRUE;

}

Функция DetectDisplayMode()с помощью функции GetDisplayMode()интерфейса DirectDrawполучает информацию о текущем видеорежиме Windows. Говоря точнее, разрешение экрана и глубина пикселей текущего видеорежима сохраняются в переменных displayrectи displaydepth.

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

Листинг 3.4. Функция CreateFlippingSurfaces() в оконном приложении

BOOL DirectDrawWin::CreateFlippingSurfaces() {

HRESULT r;

DDSURFACEDESC desc;

desc.dwSize = sizeof(desc);

desc.dwFlags = DDSD_CAPS;

desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;

r=ddraw2->CreateSurface(&desc, &primsurf, 0);

if (r!=DD_OK) {

TRACE("FAILED to create 'primsurf'\n");

return FALSE;

}

r=ddraw2->CreateClipper(0, &clipper, 0);

if (r!=DD_OK) {

TRACE("CreateClipper() failed\n");

return FALSE;

}

r=clipper->SetHWnd(0, GetSafeHwnd());

if (r!=DD_OK) {

TRACE("SetHWnd() failed\n");

return FALSE;

}

r=primsurf->SetClipper(clipper);

if (r!=DD_OK) {

TRACE("SetClipper() failed\n");

return FALSE;

}

ZeroMemory(&desc, sizeof(desc));

desc.dwSize = sizeof(desc);

desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;

desc.dwWidth = displayrect.Width();

desc.dwHeight = displayrect.Height();

desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY;

r=ddraw2->CreateSurface(&desc, &backsurf, 0);

if (r!=DD_OK) {

TRACE("failed to create 'backsurf' in video\n");

videobacksurf=FALSE;

} else {

TRACE("Created backsurf in video\n");

videobacksurf=TRUE;

}

return TRUE;

}

Сначала мы создаем первичную поверхность. В полноэкранном варианте код выглядит по-другому, потому что здесь создается обычная, несоставная первичная поверхность. В структуре DDSURFACEDESCмы описываем первичную поверхность, используя только флаг DDSCAPS_PRIMARYSURFACE. Затем описанная поверхность создается функцией CreateSurface()интерфейса DirectDraw.

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

Интервал:

Закладка:

Сделать


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

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




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


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


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

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