wclass.lpszMenuName=NULL;
wclass.lpszClassName="InitClass";
wclass.hIconSm=NULL;
//Выходим, если не удалось зарегистрировать класс
if (!RegisterClassEx(&wclass)) return 0;
//Теперь создадим окно и занесем его handle в hWnd
hWnd =
CreateWindow("InitClass", "D3D Init", WS_SYSMENU|WS_OVERLAPPED|WS_MINIMIZEBOX, 100, 100, 420, 300, NULL, NULL, hInst, NULL);
Подробное описание структуры WNDCLASSEX и параметров функции CreateWindow смотри в статье JM'а "Введение в программирование под Windows". Стоит обратить внимание на то, что мы после всех манипуляций будем иметь в hWnd дескриптор окна, в котором затем сможем отображать нашу сцену.
Теперь обратимся к функции инициализации D3D:
Init(hWnd);
Остается только показать на экране наше окно
ShowWindow(hWnd, nCmdShow);
//Рисуем окошко
UpdateWindow(hWnd);
и организовать цикл обработки сообщений окну
while (GetMessage(&msg, NULL, 0, 0)) //Цикл обработки сообщений
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
Теперь, когда у нас есть окно, мы готовы к инициализации объекта Direct3D. Зачем он нужен? Как только будет создан объект Direct3D, мы сможем использовать метод IDirect3D8::CreateDevice для создания устройства Direct3D (предварительно настроив его параметры), т.е. нашего устройства рендеринга. Параметры устройства задаются непосредственно перед его созданием с помощью структуры D3DPRESENT_PARAMETERS, и передаются в метод IDirect3D8::CreateDevice. Рассмотрим этот процесс подробнее. Итак, создаем объект Direct3D:
g_pD3D=Direct3DCreate8(D3D_SDK_VERSION);
Единственным параметром функции Direct3DCreate8 является UINT SDKVersion, который должен быть D3D_SDK_VERSION. Это необходимо для того, чтобы при компиляции программы были использованы правильные заголовочные файлы [*.h] (замечание: если после создания объекта были подключены новые адаптеры, необходимо повторно инициализировать объект Direct3D, чтобы использовать их). Если в процессе инициализации произошла ошибка, то Direct3DCreate8 возвращает NULL (т.е. пустой указатель).
Уже пора определиться, что же будет делать наша программа :).
После запуска она создаст и прорисует окошечко, в заголовке которого будет показано текущее разрешение графического адаптера, а в рабочей области — отрендеренная сцена. В данном примере сцена не будет содержать никаких объектов, поэтому отрендерится только темно-синий фон.
Заголовок окна ("window name" стоило перевести как "имя окна", но тогда как-то несолидно звучит :) ) будет содержаться в строке символов str (т.е. str указывает на первый символ строки). Чтобы сформировать str, необходимо узнать ширину (Width) и высоту (Height) текущего видеорежима, а затем воспользоваться стандартной Си'шной функцией sprintf, которая осуществляет форматированный вывод в строку. Как же узнать ширину и высоту текущего видеорежима? Для этого воспользуемся методом IDirect3D8::GetAdapterDisplayMode, который возвращает текущий режим видеоадаптера в структуру D3DDISPLAYMODE. Затем из структуры "выуживаем" необходимые параметры Width и Height, формируем строку str. Остается только изменить заголовок нашего окна с помощью стандартной WinAPI функции SetWindowText:
D3DDISPLAYMODE dm;
//В переменной dm будет храниться текущий видеорежим
//Заголовок нашего окна. Будет генериться в зависимости от текущего видеорежима
char str[128];
g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &dm);
Width=dm.Width;
Height=dm.Height;
sprintf(str," (D3D Init) Current adapter mode: [%dx%d]", Width, Height);
SetWindowText(hWnd, str);
Наконец, займемся непосредственно инициализацией D3D. Как было сказано выше, нам понадобится переменная-структура типа D3DPRESENT_PARAMETERS. Опишем эту переменную и выделим для нее память:
//Структура понадобится для создания D3DDevice
D3DPRESENT_PARAMETERS p_p;
ZeroMemory(&p_p, sizeof(p_p));