Здравствуйте! Делаю все по книжке, но не получается перейти в полноэкранный режим: при запуске приложения оно сразу выключается. Что я делаю не так?
Код:
#include <Windows.h>
#include <d3d9.h>
#include <d3dx9.h>
#define WIDTH 512
#define HEIGHT 512
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)
struct CUSTOMVERTEX{
FLOAT x, y, z;
DWORD color;
};
VOID *pVertices = NULL;
IDirect3DVertexBuffer9 *vBuf;
//Треугольник
CUSTOMVERTEX vertices[3] = {
{150.0f, 50.0f, 0.5f, D3DCOLOR_XRGB(255, 0, 255)},
{250.0f, 250.0f, 0.5f, D3DCOLOR_XRGB(0, 255, 0)},
{50.0f, 250.0f, 0.5f, D3DCOLOR_XRGB(255, 255, 0)}
};
void Render(IDirect3DDevice9 *g_pd3dDevice, IDirect3DSurface9 *mySurface);
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdLine, INT nCmdShow)
{
//Регистрация класса окна
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
TEXT("WindowClass"), NULL};
RegisterClassEx(&wc);
//Создание окна приложения
HWND hWnd = CreateWindow(TEXT("WindowClass"), TEXT("Test"), WS_OVERLAPPEDWINDOW,
100, 100, WIDTH, HEIGHT, GetDesktopWindow(), NULL, wc.hInstance, NULL);
ShowWindow(hWnd, nCmdShow);
//Создание объекта Direct3D
IDirect3D9 *g_pD3D = NULL;
if(NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION))){
return E_FAIL;
}
//Указатель на Direct3Ddevice
IDirect3DDevice9 *g_pd3dDevice = NULL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = FALSE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
//Создать Direct3DDevice
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice))){
return E_FAIL;
}
//Создаем поверхность для рисования
D3DXIMAGE_INFO info;
D3DXGetImageInfoFromFile(L"C:\lab.jpg", &info);
IDirect3DSurface9 *mySurface = NULL;
g_pd3dDevice->CreateOffscreenPlainSurface(WIDTH, HEIGHT, info.Format,D3DPOOL_SYSTEMMEM, &mySurface, NULL);
D3DXLoadSurfaceFromFile(mySurface, NULL, NULL, L"C:\lab.jpg", NULL, D3DX_FILTER_NONE, 0, NULL);
//Создаем буффер вершин
g_pd3dDevice->CreateVertexBuffer(sizeof(CUSTOMVERTEX)*3, 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_SYSTEMMEM,
&vBuf, NULL);
vBuf->Lock(0, sizeof(vertices), (void**)&pVertices, 0);
memcpy(pVertices, vertices, sizeof(vertices));
vBuf->Unlock();
MSG msg;
PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
while(msg.message != WM_QUIT){
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
//Обработать и уничтожить сообщение
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else{
//Если нет сообщений для обработки, то выполняем код игры
Render(g_pd3dDevice, mySurface);
}
}
g_pD3D->Release();
g_pd3dDevice->Release();
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_CREATE:
break;
/*case WM_PAINT:
break;*/
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}
void Render(IDirect3DDevice9 *g_pd3dDevice, IDirect3DSurface9 *mySurface)
{
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0);
D3DXMATRIX g_Transform;
D3DXMatrixIdentity(&g_Transform);
D3DXMatrixTranslation(&g_Transform, 0.0f, 0.0f, 0.0f);
g_pd3dDevice->SetTransform(D3DTS_WORLD, &g_Transform);
//Создаем матрицу камеры
D3DXMATRIX g_View;
D3DXVECTOR3 Eye(0.0f, -5.0f, 0.0f);
D3DXVECTOR3 LookAt(0.0f, -5.0f, 0.0f);
D3DXVECTOR3 Up(0.0f, 1.0f, 0.0f);
D3DXMatrixLookAtLH(&g_View, &Eye, &LookAt, &Up);
g_pd3dDevice->SetTransform(D3DTS_VIEW, &g_View);
//Создаем матрицу проекций
D3DXMATRIX Projection;
FLOAT FOV = D3DX_PI / 4;
FLOAT Aspect = WIDTH/HEIGHT;
D3DXMatrixPerspectiveFovLH(&Projection, FOV, Aspect, 1.0f, 500.0f);
g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &Projection);
//Начать сцену
if(SUCCEEDED(g_pd3dDevice->BeginScene())){
//Рисуем что-нибудь
/*IDirect3DSurface9 *BackBuffer = NULL;
g_pd3dDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &BackBuffer);
g_pd3dDevice->UpdateSurface(mySurface, NULL, BackBuffer, NULL);*/
g_pd3dDevice->SetStreamSource(0, vBuf, 0, sizeof(CUSTOMVERTEX));
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
//Заканчиваем сцену
g_pd3dDevice->EndScene();
}
//Представить содержимое back-буфера на экране
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}