Шаг 12 - Рисуем треугольник при помощи MFC

Раз мы взялись за MFC, то и дальше пойдем по этому пути. Остановите фон, чтобы он не моргал, см. "Шаг 4 - Рисуем треугольник", установив его в черный цвет.

p_d3d_Device->Clear (0, NULL, D3DCLEAR_TARGET,    D3DCOLOR_XRGB (0, 0, 0), 0.0f, 0);

Далее после всех #include расположим:

#define D3DFVF_CUSTOMVERTEX ( D3DFVF_XYZRHW | D3DFVF_DIFFUSE )

struct CUSTOMVERTEX { FLOAT x, y, z, rhw; DWORD color; };

В класс главного окна (CMainWnd) в private добавим:

LPDIRECT3DVERTEXBUFFER8 p_VertexBuffer;	// наш буфер вершин

В конструктор главного окна CMainWnd::CMainWnd() нужно добавить в самое начало:

p_VertexBuffer = NULL;

И, конечно, этот указатель удалить перед закрытием окна, добавьте его в самое начало деструктора:

CMainWnd::~CMainWnd(void)
{
	_RELEASE_(p_VertexBuffer);
	_DELETE_(p_VertexBuffer);
	_RELEASE_(p_d3d_Device);
	_DELETE_(p_d3d_Device);
	_RELEASE_(p_d3d);
	_DELETE_(p_d3d);
}

Добавляем в конструктор перед созданием главного окна приложения:

CUSTOMVERTEX g_Vertices[] =
{
	{  60.0f,  60.0f, 0.5f, 1.0f, 0xffff0000, },
	{ 200.0f,  60.0f, 0.5f, 1.0f, 0xff00ff00, },
	{  60.0f, 200.0f, 0.5f, 1.0f, 0xff0000ff, },
};

И после создания устройства Direct3D:

p_d3d_Device->CreateVertexBuffer (3*sizeof(CUSTOMVERTEX), 
	0, 
	D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, 
	&p_VertexBuffer);

VOID* pVertices;
p_VertexBuffer->Lock (0, sizeof(g_Vertices), (BYTE**)&pVertices, 0);
memcpy (pVertices, g_Vertices, sizeof(g_Vertices));
p_VertexBuffer->Unlock();

Переходим в функцию OnPaint() и между строками BeginScene() и EndScene() добавляем:

p_d3d_Device->SetVertexShader (D3DFVF_CUSTOMVERTEX);
p_d3d_Device->SetStreamSource (0, p_VertexBuffer, sizeof(CUSTOMVERTEX));
p_d3d_Device->DrawPrimitive (D3DPT_TRIANGLELIST, 0, 1);

Для более подробной информации смотрите "Шаг 4 - Рисуем треугольник".

Чтобы устройства не терялись при нажатий клавиш Alt+TAB, добавьте в OnPaint() в самое начало:

HRESULT hr;
hr=p_d3d_Device->TestCooperativeLevel();
if(hr==D3DERR_DEVICELOST) return;
if(hr==D3DERR_DEVICENOTRESET) p_d3d_Device->Reset(&d3dpp);

D3DPOOL_DEFAULT замените на D3DPOOL_MANAGED в конструкторе окна при создании буфера вершин CreateVertexBuffer, более подробно см. "Шаг 8 - Потеря устройств при нажатии клавиш Alt+TAB". А также

D3DPRESENT_PARAMETERS d3dpp;

перенесите в класс CMainWnd, чтобы все могли иметь к нему доступ внутри класса (private).

Запускаем, смотрим, пока ничего нового, но зато при помощи MFC :)


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Хавов Евгений Валерьевич - 10.08.2002