20120701


#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
}

Комментариев нет:

Отправить комментарий

Не люблю мат и низкий уровень грамотности. Чем конкретнее поставите свой вопрос и чем лучше он будет выглядеть - тем большая вероятность на мой ответ. :)