DirectX创建Windows窗口

过程:

WinMain

  1. 窗口类 -> 注册窗口类
  2. 创建窗口 -> 显示和更新窗口
  3. 消息循环 -> 窗口过程

#include <Windows.h>

#define WINDOW_CLASS "UGPDX"
#define WINDOW_TITLE "Demo Window"

LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch(msg)
	{
	case WM_DESTROY:
		PostQuitMessage(9);
		return 0;
		break;
	case WM_KEYUP:
		if(wParam == VK_ESCAPE) PostQuitMessage(0);
		break;
	}
	
	return DefWindowProc(hWnd,msg,wParam,lParam);
}

int WINAPI WinMain ( HINSTANCE hInst, HINSTANCE prevInst,
						LPTSTR cmdLine, int show )
{
	//定义窗口类
	WNDCLASSEX wc = { sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0,0,
		hInst,NULL,NULL,(HBRUSH)GetStockObject(WHITE_BRUSH),NULL,WINDOW_CLASS,NULL };
	RegisterClassEx(&wc);
	HWND hWnd = CreateWindow(WINDOW_CLASS,WINDOW_TITLE,WS_OVERLAPPEDWINDOW,
			100,100,640,480,GetDesktopWindow(),NULL,hInst,NULL);

	ShowWindow( hWnd,SW_SHOWDEFAULT );
	UpdateWindow( hWnd );

	MSG msg;
	ZeroMemory(&msg,sizeof(msg));
	
	while(msg.message != WM_QUIT)
	{
		if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	UnregisterClass(WINDOW_CLASS,hInst);

}	

	

 

创建Direct3D窗口

  1. D3D对象  -> IDirect3D9
  2. D3D设备对象 -> IDirect3DDevice9
    1. Clear()
    2. BeginScene()
    3. EndScene()
    4. Present()//显示
      
      #include <Windows.h>
      #include <d3d9.h>
      
      #pragma comment(lib,"d3d9.lib")
      #pragma comment(lib,"d3dx9.lib")
      
      #define WINDOW_CLASS "UGPDX"
      #define WINDOW_TITLE "Demo Window"
      
      LPDIRECT3D9 gd3d = NULL;
      LPDIRECT3DDEVICE9 gd3ddevice = NULL;
      
      bool InitializeD3D(HWND hWnd);
      void RenderScene();
      void Shutdown();
      
      LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
      {
      	switch(msg)
      	{
      	case WM_DESTROY:
      		PostQuitMessage(9);
      		return 0;
      		break;
      	case WM_KEYUP:
      		if(wParam == VK_ESCAPE) PostQuitMessage(0);
      		break;
      	}
      	
      	return DefWindowProc(hWnd,msg,wParam,lParam);
      }
      
      int WINAPI WinMain ( HINSTANCE hInst, HINSTANCE prevInst,
      						LPTSTR cmdLine, int show )
      {
      	//定义窗口类
      	WNDCLASSEX wc = { sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0,0,
      		hInst,NULL,NULL,NULL,NULL,WINDOW_CLASS,NULL };
      	RegisterClassEx(&wc);
      	HWND hWnd = CreateWindow(WINDOW_CLASS,WINDOW_TITLE,WS_OVERLAPPEDWINDOW,
      			100,100,640,480,GetDesktopWindow(),NULL,hInst,NULL);
      
      	if(InitializeD3D(hWnd))
      	{
      
      		ShowWindow( hWnd,SW_SHOWDEFAULT );
      		UpdateWindow( hWnd );
      
      		MSG msg;
      		ZeroMemory(&msg,sizeof(msg));
      	
      		while(msg.message != WM_QUIT)
      		{
      			if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
      			{
      				TranslateMessage(&msg);
      				DispatchMessage(&msg);
      			}
      			else
      			{
      				//没有消息处理时,做其他工作(常用做游戏开发)
      				RenderScene();
      			}
      		}
      	}
      
      	Shutdown();
      
      	UnregisterClass(WINDOW_CLASS,hInst);
      }	
      
      bool InitializeD3D(HWND hWnd)
      {
      	D3DDISPLAYMODE displayMode;
      
      	gd3d = Direct3DCreate9(D3D_SDK_VERSION);
      	if(gd3d == NULL) return false;
      	
      	if(FAILED(gd3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&displayMode)))
      	{
      		return false;
      	}
      
      	//创建D3D设备对象
      	D3DPRESENT_PARAMETERS d3dpp;
      	ZeroMemory(&d3dpp,sizeof(d3dpp));
      	d3dpp.Windowed = TRUE;
      	d3dpp.BackBufferFormat = displayMode.Format;
      	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
      
      	if(FAILED(gd3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
      		D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3dpp,&gd3ddevice)))
      	{
      		return false;
      	}
      	
      	return true;
      
      }
      
      void Shutdown()
      {
      	if(gd3ddevice != NULL) gd3ddevice->Release();
      	if(gd3d != NULL) gd3d->Release();
      }
      
      void RenderScene()
      {
      	gd3ddevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),
      		1.0f,0);
      	gd3ddevice->BeginScene();
      	//输出显示3D图形
      	
      
      	gd3ddevice->EndScene();
      	//显示
      	gd3ddevice->Present(NULL,NULL,NULL,NULL);
      }
      

       

D3D模版

#include <Windows.h>
#include <d3d9.h>
#include <d3dx9.h>

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

#define WINDOW_CLASS "UGPDX"
#define WINDOW_TITLE "Demo Window"
#define WINDOW_WIDTH  640
#define WINDOW_HEIGHT 480

bool InitializeD3D(HWND hWnd, bool fullscreen);
bool InitializeObjects();
void RenderScene();
void Shutdown();

LPDIRECT3D9 gd3d = NULL;
LPDIRECT3DDEVICE9 gd3ddevice = NULL;

D3DXMATRIX g_projection; //投影变换
D3DXMATRIX g_ViewMatrix;  //视图变换
D3DXMATRIX g_WorldMatrix;  //世界变换


LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch(msg)
	{
	case WM_DESTROY:
		PostQuitMessage(9);
		return 0;
		break;
	case WM_KEYUP:
		if(wParam == VK_ESCAPE) PostQuitMessage(0);
		break;
	}
	
	return DefWindowProc(hWnd,msg,wParam,lParam);
}

int WINAPI WinMain ( HINSTANCE hInst, HINSTANCE prevInst,
						LPTSTR cmdLine, int show )
{
	//定义窗口类

	WNDCLASSEX wc = { sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0,0,
		hInst,NULL,NULL,NULL,NULL,WINDOW_CLASS,NULL };

	RegisterClassEx(&wc);

	HWND hWnd = CreateWindow(WINDOW_CLASS,WINDOW_TITLE,WS_OVERLAPPEDWINDOW,
			100,100,640,480,GetDesktopWindow(),NULL,hInst,NULL);

	if(InitializeD3D(hWnd,false))//false表示不是全屏
	{
		ShowWindow( hWnd,SW_SHOWDEFAULT );
		UpdateWindow( hWnd );

		MSG msg;
		ZeroMemory(&msg,sizeof(msg));
	
		while(msg.message != WM_QUIT)
		{
			if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
			else
			{		//没有消息处理时,做其他工作(常用做游戏开发)
				RenderScene();
			}
		}
	}

	Shutdown();

	UnregisterClass(WINDOW_CLASS,hInst);

	return 0;
}	

bool InitializeD3D(HWND hWnd,bool fullscreen)
{
	D3DDISPLAYMODE displayMode;

	gd3d = Direct3DCreate9(D3D_SDK_VERSION);
	if(gd3d == NULL) return false;
	
	if(FAILED(gd3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&displayMode)))
	{
		return false;
	}
	//创建D3D设备对象
	D3DPRESENT_PARAMETERS d3dpp;
	ZeroMemory(&d3dpp,sizeof(d3dpp));

	if(fullscreen)
	{
		d3dpp.Windowed = FALSE;
		d3dpp.BackBufferWidth = WINDOW_WIDTH;
		d3dpp.BackBufferHeight = WINDOW_HEIGHT;
	}else
		d3dpp.Windowed = TRUE;

	d3dpp.BackBufferFormat = displayMode.Format;
	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

	if(FAILED(gd3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
		D3DCREATE_HARDWARE_VERTEXPROCESSING,&d3dpp,&gd3ddevice)))
	{
		return false;}
	
	if(!InitializeObjects())
		return false;

	return true;
}

bool InitializeObjects()
{   //D3DXMatrixOrthoLH(&g_ortho,WINDOW_WIDTH,WINDOW_HEIGHT,0.1f,1000.0f),
	D3DXMatrixPerspectiveFovLH(&g_projection,45.0f,WINDOW_WIDTH/WINDOW_HEIGHT,0.1f,100.0f),
		gd3ddevice->SetTransform(D3DTS_PROJECTION,&g_projection);	
		gd3ddevice->SetRenderState(D3DRS_LIGHTING,FALSE);//光照
		//gd3ddevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);//背面削影

		D3DXVECTOR3 cameraPos(0.0f,0.0f,-1.0f);
		D3DXVECTOR3 lookAtPos(0.0f,0.0f,0.0f);
		D3DXVECTOR3 upDir(0.0f,1.0f,0.0f);

		D3DXMatrixLookAtLH(&g_ViewMatrix, &cameraPos, &lookAtPos, &upDir);

		return true;
}

void RenderScene()
{
	gd3ddevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
	gd3ddevice->BeginScene();

	gd3ddevice->SetTransform(D3DTS_VIEW, &g_ViewMatrix);

	//输出显示3D图形
	gd3ddevice->EndScene();
	//显示
	gd3ddevice->Present(NULL,NULL,NULL,NULL);
}

void Shutdown()
{
	if(gd3ddevice != NULL) gd3ddevice->Release();
	if(gd3d != NULL) gd3d->Release();

	gd3ddevice = NULL;
	gd3d = NULL;
}

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值