#include
#include
#include
#pragma comment (lib, "d3d9.lib") //И библиотеки
//Аж две глобальных переменных!
LPDIRECT3D9 d3d; //Указатель на интерфейс Direct3D
LPDIRECT3DDEVICE9 d3ddev; //Указатель на устройство
//Прототипы функций
void initD3D(HWND hWnd); //Вот эта - инициализирует Direct3D
void render_frame(void); //Эта - рисует кадр
void cleanD3D(void); //А вот эта - завершает работу Direct3D и чистит за ней весь мусор
//Прототип функции главного окна программы
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
//Точка входа - отсюда начинается выполнение всего и вся
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
HWND hWnd; //Переменная для хэндла главного окна
WNDCLASSEX wc;
ZeroMemory(&wc, sizeof(WNDCLASSEX));
wc.cbSize = sizeof(WNDCLASSEX); //Вот отсюда и ниже - инициализируем окно, ничего интересного
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
wc.lpszClassName = L"WindowClass";
RegisterClassEx(&wc); //Регистрируем новое окно в системе
//Создаём его, получаем его хэндл
hWnd = CreateWindowEx(NULL, L"WindowClass", L"Our First Direct3D Program", WS_OVERLAPPEDWINDOW, 300, 300, 800, 600, NULL, NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow); //Показываем его (окно)
initD3D(hWnd); //Инициализируем Direct3D
MSG msg;
while(TRUE) { //Создаём и инициалириуем очередь сообщений для нашего окна
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { //Которая будет крутиться в цикле
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if(msg.message == WM_QUIT) break; //Пока мы не попытаемся окно закрыть
render_frame(); //А пока крутится - рисуем!
}
cleanD3D(); //Как закрыли окно - отключаем всю графику
return msg.wParam; //И выходим
}
//Бесполезная и никчёмная процедура обработки нашего окна
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch(message) {
case WM_DESTROY: { //Которая умеет только лишь выходить
PostQuitMessage(0);
return 0;
} break;
}
return DefWindowProc (hWnd, message, wParam, lParam);
}
//Та самая функция инициализации Direct3D
void initD3D(HWND hWnd) {
d3d = Direct3DCreate9(D3D_SDK_VERSION); //Тут комментов нет, поэтому я чуть ниже остановлюсь на этом поподробней
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hWnd;
d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3ddev);
}
//Функция, рисующая кадр
void render_frame(void) {
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0); //Берём и очищаем всё окно синим цветом!
d3ddev->BeginScene(); //При желании - начинаем рисовать что-то
d3ddev->EndScene(); //И заканчиваем
d3ddev->Present(NULL, NULL, NULL, NULL); //Показываем всё это безобразие на экран
}
//Функция, завершающая работу с графикой
void cleanD3D(void) {
d3ddev->Release(); //Говорим устройству, давай до свидания!
d3d->Release(); //Говорим то же самое интерфейсу Direct3D
}
Комментариев нет:
Отправить комментарий
Не люблю мат и низкий уровень грамотности. Чем конкретнее поставите свой вопрос и чем лучше он будет выглядеть - тем большая вероятность на мой ответ. :)