ЖУРНАЛ ХАКЕР

Суровая правда жизни о Direct3D

Спецвыпуск Хакер, номер #004, стр. 004-098-10


Удалим-с все DirectDraw, Direct3D и т.д. return lpDD->Release() (происки COM) в специально созданной для этого функции Release. Тривиально, но теперь будем обрабатывать мессаги и создавать окна и начинать и завершать работу нашей проги. Мессаги обрабатываются функцией WndProc. Но мы же люди ленивые, пусть все обрабатывается по умолчанию функцией DefWindowProc. Так туда и запишем: return DefWindowProc(hWnd, uMsg, wParam, lParam);. Вот. И самое главное: функция WinMain. Именно с нее начинается выполнение проги. Создадим и зарегистрируем WNDCLASS, как я это покажу в листинге. Таким же образом создадим окно. После всего этого проверим на глючность инициализацию D3D. if(FAILED(InitializeD3D())) return 1;. Вот, а затем пошли шпарить в цикле рендрить - получать мессаги - рендрить - получать мессаги - рендрить - получать мессаги... И так 500 раз. Да-да-да-да... Чуть не забыл (старческий склероз, мать его), надо же курсор удалить, а то он мешает. SetCursor(NULL); перед циклом. После 500-кратного прохода цикла зарелизим (Release) и return 0;.

Листинг №10 - Main.cpp, мессаги, окна и релиз

в HRESULT Release()

{

//Деинициализируем все

return lpDD->Release();

}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

return DefWindowProc(hWnd, uMsg, wParam, lParam);

}

INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd)

{

WNDCLASS wndClass = { 0, WndProc, 0, 0, hInst, //WndProc - процедура обработки сообщений

NULL,

LoadCursor(hInst, IDC_ARROW),

(HBRUSH)GetStockObject(WHITE_BRUSH), NULL, _T("Render Window")};

// таким образом мы создали некий wndclass, описывающий наше приложение

// Все про этот класс нам знать не надо. Поэтому я и не дал конкретного объяснения

RegisterClass(&wndClass); //Зарегистрируем наш класс

hWnd = CreateWindow(_T("Render Window"), // Создадим окно

_T("XAKEP3D"), // Заголовок окна

WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, // Некие стили окна

CW_USEDEFAULT, 1280, 1024, 0L, 0L, hInst, 0L); //Цифры - размеры окна

ShowWindow(hWnd, SW_SHOWNORMAL); //Нарисуем нашу паршивость

UpdateWindow(hWnd); //Обновим ее же

if(FAILED(InitializeD3D())) return 1;

MSG msg;

int i = 0;

SetCursor(NULL);

while(i < 500) //Если не было 500 кадров, то

{

PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);//Берем мессагу

if(FAILED(Render())) return 1;//Рисуем

i++; //Прибавляем 1 кадр

}

Release(); //Деинициализируем все

return 0; //Выходим

}

Конец листинга 10.

Пытка №6 - а что это будет, если мы обрежем ту странную веревку под потолком (см пытку №1)

Ты думаешь, я, ламер паршивый, не мог сделать нормального выхода через ескейп или еще какую-нибудь шнягу. Я вот что скажу, это ты сделаешь сам - маленькое домашнее задание, а то я за тебя и так основную массу фекалек схавал. А пока ты нажми F5. И любуйся зрелищем. Вот. Нда... Ну, вроде и все... Будем надеяться, это так. Счастливо тебе, перец! & Happy rendering 4u.!!

Назад на стр. 004-098-9  Содержание  Вперед на стр. 004-098-11