Суровая правда жизни о 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.!!