前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >我的第一个DirectX程序界面及三角形的绘制

我的第一个DirectX程序界面及三角形的绘制

作者头像
ccf19881030
发布2019-04-23 15:00:23
8570
发布2019-04-23 15:00:23
举报
文章被收录于专栏:ccf19881030的博客ccf19881030的博客

一下是我的第一个DirecX界面程序,

有点像MFC、和Win32的程序。

可以新建一个Win32 Application工程文件,命名为test

再新建一个cpp文件test.cpp

代码如下:

代码语言:javascript
复制
#include <d3d9.h>

#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"winmm.lib")

//D3D Object and D3D Device Object
LPDIRECT3D9			g_pD3D = NULL;
LPDIRECT3DDEVICE9	g_pD3DDevice = NULL;


LRESULT CALLBACK MsgProc(
							HWND hwnd,      // handle to window
							UINT uMsg,      // message identifier
							WPARAM wParam,  // first message parameter
							LPARAM lParam   // second message parameter
							);
HRESULT InitD3D(HWND hwnd);
VOID Cleanup();
VOID Render();

// the entrance of program
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
	// register window class
	WNDCLASS wndclass;
	wndclass.style = 0; 
	wndclass.lpfnWndProc = MsgProc;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hInstance = hInstance;
	wndclass.hIcon = NULL;
	wndclass.hCursor = NULL;
	wndclass.hbrBackground = NULL;
	wndclass.lpszMenuName = NULL;
	wndclass.lpszClassName = "MyD3D";

	RegisterClass(&wndclass);

	//Create the application's window
	HWND hwnd = CreateWindow("MyD3D","My first Direct3D Program",WS_OVERLAPPEDWINDOW,100,100,600,400,
		GetDesktopWindow(),NULL,wndclass.hInstance,NULL);

	if (SUCCEEDED(InitD3D(hwnd)))
	{
		//Show Window
		ShowWindow(hwnd,SW_SHOWDEFAULT);
		UpdateWindow(hwnd);

		MSG msg;
		while (GetMessage(&msg,NULL,0,0))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	// 
	Cleanup();
	UnregisterClass("MyD3D",wndclass.hInstance);
	return 0;
}

LRESULT CALLBACK MsgProc(
						 HWND hwnd,      // handle to window
						 UINT uMsg,      // message identifier
						 WPARAM wParam,  // first message parameter
						 LPARAM lParam   // second message parameter
							)
{
	switch (uMsg)
	{
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_PAINT:
		Render();
		ValidateRect(hwnd,NULL);
		return 0;
	}
	return DefWindowProc(hwnd,uMsg,wParam,lParam);

}

HRESULT InitD3D(HWND hwnd)
{
	if (NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
	{
		return E_FAIL;
	}

	//display Mode
	D3DDISPLAYMODE d3ddm;
	if (FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)))
	{
		return E_FAIL;
	}

	// parameters of D3D
	D3DPRESENT_PARAMETERS d3dpp;
	ZeroMemory(&d3dpp,sizeof(d3dpp));
	d3dpp.Windowed = true;
	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
	d3dpp.BackBufferFormat = d3ddm.Format;

	if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pD3DDevice)))
	{
		return E_FAIL;
	}

	return S_OK;
}

VOID Cleanup()
{
	if(g_pD3DDevice != NULL)
		g_pD3DDevice->Release();
	if(g_pD3D != NULL)
		g_pD3D->Release();
}

VOID Render()
{
	if(NULL == g_pD3DDevice)
		return ;

	g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0f,0);

	g_pD3DDevice->BeginScene();

	g_pD3DDevice->EndScene();

	g_pD3DDevice->Present(NULL,NULL,NULL,NULL);
}

 运行之后会弹出一个深蓝色的窗口。

下面是在上面代码的基础上,在界面绘制的三角形。

步骤如下:

1)创建顶点缓存

2)访问顶点缓存

3)绘制三角形

代码如下:

代码语言:javascript
复制
#include <d3d9.h>

#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"winmm.lib")

//D3D Object and D3D Device Object
LPDIRECT3D9			g_pD3D = NULL;
LPDIRECT3DDEVICE9	g_pD3DDevice = NULL;
/*******************************************/
LPDIRECT3DVERTEXBUFFER9	g_pVB = NULL;

struct CUSTOMVERTEX
{
	float x,y,z,thw;
	DWORD color;
};

#define D3DFVF_CUSTOMVERTEX D3DFVF_XYZRHW | D3DFVF_DIFFUSE
/*******************************************/
LRESULT CALLBACK MsgProc(
							HWND hwnd,      // handle to window
							UINT uMsg,      // message identifier
							WPARAM wParam,  // first message parameter
							LPARAM lParam   // second message parameter
							);
HRESULT InitD3D(HWND hwnd);
VOID Cleanup();
VOID Render();
//////////////////////////////////
HRESULT InitVB();
////////////////////////////////

// the entrance of program
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
	// register window class
	WNDCLASS wndclass;
	wndclass.style = 0; 
	wndclass.lpfnWndProc = MsgProc;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hInstance = hInstance;
	wndclass.hIcon = NULL;
	wndclass.hCursor = NULL;
	wndclass.hbrBackground = NULL;
	wndclass.lpszMenuName = NULL;
	wndclass.lpszClassName = "MyD3D";

	RegisterClass(&wndclass);

	//Create the application's window
	HWND hwnd = CreateWindow("MyD3D","My first Direct3D Program",WS_OVERLAPPEDWINDOW,100,100,600,400,
		GetDesktopWindow(),NULL,wndclass.hInstance,NULL);

	if (SUCCEEDED(InitD3D(hwnd)))
	{
		if(SUCCEEDED(InitVB()))
		{
			//Show Window
			ShowWindow(hwnd,SW_SHOWDEFAULT);
			UpdateWindow(hwnd);

			MSG msg;
			while (GetMessage(&msg,NULL,0,0))
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
		}
	}

	// 
	Cleanup();
	UnregisterClass("MyD3D",wndclass.hInstance);
	return 0;
}

LRESULT CALLBACK MsgProc(
						 HWND hwnd,      // handle to window
						 UINT uMsg,      // message identifier
						 WPARAM wParam,  // first message parameter
						 LPARAM lParam   // second message parameter
							)
{
	switch (uMsg)
	{
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_PAINT:
		Render();
		ValidateRect(hwnd,NULL);
		return 0;
	}
	return DefWindowProc(hwnd,uMsg,wParam,lParam);

}

HRESULT InitD3D(HWND hwnd)
{
	if (NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
	{
		return E_FAIL;
	}

	//display Mode
	D3DDISPLAYMODE d3ddm;
	if (FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)))
	{
		return E_FAIL;
	}

	// parameters of D3D
	D3DPRESENT_PARAMETERS d3dpp;
	ZeroMemory(&d3dpp,sizeof(d3dpp));
	d3dpp.Windowed = true;
	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
	d3dpp.BackBufferFormat = d3ddm.Format;

	if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pD3DDevice)))
	{
		return E_FAIL;
	}

	return S_OK;
}

VOID Cleanup()
{
	if(g_pVB !=NULL)
		g_pVB->Release();
	if(g_pD3DDevice != NULL)
		g_pD3DDevice->Release();
	if(g_pD3D != NULL)
		g_pD3D->Release();
}

VOID Render()
{
	if(NULL == g_pD3DDevice)
		return ;
	
	g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0f,0);
	
	g_pD3DDevice->BeginScene();
	////////////////////////
	g_pD3DDevice->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX));
	g_pD3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
	g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);
	//////////////////////////
	g_pD3DDevice->EndScene();
	
	g_pD3DDevice->Present(NULL,NULL,NULL,NULL);
}

HRESULT InitVB()
{
	CUSTOMVERTEX g_vertex[]={
		{150.0f,50.0f,0.5f,1.0f,0xffff0000},
		{250.0f,250.0f,0.5f,1.0f,0xff00ff00},
		{50.0f,250.0f,0.5f,1.0f,0xff0000ff}};
		
		if(FAILED(g_pD3DDevice->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),0,
			D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,&g_pVB,NULL)))
		{
			return E_FAIL;
		}
		
		VOID *pvertex;
		if(FAILED(g_pVB->Lock(0,sizeof(g_vertex),(void **)&pvertex,0)))
		{
			return E_FAIL;
		}
		memcpy(pvertex,g_vertex,sizeof(g_vertex));
		g_pVB->Unlock();
		
		return S_OK;
		
		
		
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2010年09月17日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档