dx相关代码


1、空窗口

#include "stdafx.h"
#include <stdio.h>

//全局变量声明
HINSTANCE hInst;
HBITMAP man[7];
HDC		hdc,mdc;
HWND	hWnd;
DWORD	tPre,tNow,tCheck;                 //声明三个函数来记录时间,tPre记录上一次绘图的时间,tNow记录此次准备绘图的时间,tCheck记录每秒开始的时间
int		num,frame,fps;                    //num用来记录图号,frame用来累加每次画面更新的次数,fps(frame per second)用来记录每秒画面更新的次数

//全局函数的声明
ATOM				MyRegisterClass

(HINSTANCE hInstance);
BOOL				InitInstance

(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, 

LPARAM);
void				MyPaint(HDC hdc);

//***WinMain函数,程序入口点函数**************************************
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	MSG msg;

	MyRegisterClass(hInstance);

	//运行初始化函数
	if (!InitInstance (hInstance, nCmdShow)) 
	{
		return FALSE;
	}

	//游戏循环
	GetMessage(&msg,NULL,NULL,NULL);
    while( msg.message!=WM_QUIT )
    {
        if( PeekMessage( &msg, NULL, 0,0 ,PM_REMOVE) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
		else
		{
			tNow = GetTickCount();
			if(tNow-tPre >= 100)        //当此次循环运行与上次绘图时间相差0.1秒时再进行重绘操作
				MyPaint(hdc);
		}
    }

	return msg.wParam;
}

//****设计一个窗口类,类似填空题,使用窗口结构体*************************
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX); 
	wcex.style			= CS_HREDRAW | 

CS_VREDRAW;
	wcex.lpfnWndProc	= (WNDPROC)WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= NULL;
	wcex.hCursor		= NULL;
	wcex.hCursor		= LoadCursor(NULL, 

IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)

(COLOR_WINDOW+1);
	wcex.lpszMenuName	= NULL;
	wcex.lpszClassName	= "canvas";
	wcex.hIconSm		= NULL;

	return RegisterClassEx(&wcex);
}

//****初始化函数*************************************
// 从文件加载位图
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
	char filename[20] = "";
	int i;

	hInst = hInstance;

	hWnd = CreateWindow("canvas", "动画演示" , 

WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 

NULL, NULL, hInstance, NULL);

	if (!hWnd)
	{
		return FALSE;
	}

	MoveWindow(hWnd,10,10,600,450,true);
	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);

	hdc = GetDC(hWnd);
	mdc = CreateCompatibleDC(hdc);

	//载入各个人物位图
	for(i=0;i<7;i++)
	{
		sprintf(filename,"man%d.bmp",i);
		man[i] = (HBITMAP)LoadImage

(NULL,filename,IMAGE_BITMAP,640,480,LR_LOADFROMFILE);
	}
	
	num = 0;
	frame = 0;

	MyPaint(hdc);

	return TRUE;
}

//****自定义绘图函数*********************************
// 1.计算与显示每秒画面更新次数
// 2.按照图号顺序进行窗口贴图
void MyPaint(HDC hdc)
{
	char str[40] = "";

	if(num == 7)
		num = 0;
	frame++;			       //画面更新次数加1
	if(tNow - tCheck >= 1000)               //判断此次绘图时间由前一秒算起是否已经达到1秒钟的时间间隔。若是,则将目前的'frame'值赋给"fps",表示这一秒内所更新的画面次数,然后将“frame”值回0,并重设下次计算每秒画面数的起始时间"iCheck"。
	{
		fps = frame;
		frame = 0;
		tCheck = tNow;
	}

	SelectObject(mdc,man[num]);         //选用要更新的图案到mdc中,再输出显示每秒画面更新次数的字符串到mdc上,最后将mdc的内容贴到窗口中。
	sprintf(str,"每秒显示 %d个画面",fps);
	TextOut(mdc,0,0,str,strlen(str));
	BitBlt(hdc,0,0,600,450,mdc,0,0,SRCCOPY);

	tPre = GetTickCount();     //记录此次绘图时间,供下次游戏循环中判断是否已经达到画面更新操作设定的时间间隔。
	num++;
}

//******消息处理函数*********************************
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, 

WPARAM wParam, LPARAM lParam)
{
	int i;

	switch (message)
	{
		case WM_DESTROY:			//窗口结束消息
			DeleteDC(mdc);
			for(i=0;i<7;i++)
				DeleteObject(man[i]);
			ReleaseDC(hWnd,hdc);
			PostQuitMessage(0);
			break;
		default:					//其他消息
			return DefWindowProc(hWnd, 

message, wParam, lParam);
   }
   return 0;
}


2、代码段 结构体好习惯

代码段一  Dx11DemoBases类的头文件
 
[cpp] view plaincopyprint?
#ifndef _DEMO_BASE_H_  
#define _DEMO_BASE_H_  
#include<d3d11.h>  
#include<d3dx11.h>  
#include<DxErr.h>  
class Dx11DemoBase  
{  
public:  
   Dx11DemoBase();  
   virtual ~Dx11DemoBase();  
   bool Initialize( HINSTANCE hInstance, HWND hwnd );  
   void Shutdown( );  
   virtual bool LoadContent( );  
   virtual void UnloadContent( );  
   virtual void Update( float dt ) = 0;  
   virtual void Render( ) = 0;  
   protected:  
   HINSTANCE hInstance_;  
   HWND hwnd_;  
   D3D_DRIVER_TYPE driverType_;  
   D3D_FEATURE_LEVEL featureLevel_;  
   ID3D11Device* d3dDevice_;  
   ID3D11DeviceContext* d3dContext_;  
   IDXGISwapChain* swapChain_;  
   ID3D11RenderTargetView* backBufferTarget_;  
};  
#endif  




 
上面这段代码中我们可以看到最精简的D3D对象,以protected类成员的形式存在于类之中。在类体外初始化变量是比较好的编程习惯,而且效率比让先调用拷贝构造函数,再调用默认构造函数要高得多。

3、二维的D3D11_TEXTURE2D_DESC声明形式如下:

二维的D3D11_TEXTURE2D_DESC声明形式如下:

 

  1. typedef struct D3D11_TEXTURE2D_DESC {  
  2.   
  3. UINT Width;  
  4.   
  5. UINT Height;  
  6.   
  7. UINT MipLevels;  
  8.   
  9. UINT ArraySize;  
  10.   
  11. DXGI_FORMAT Format;  
  12.   
  13. DXGI_SAMPLE_DESC SampleDesc;  
  14.   
  15. D3D11_USAGE Usage;  
  16.   
  17. UINT BindFlags;  
  18.   
  19. UINT CPUAccessFlags;  
  20.   
  21. UINT MiscFlags;  
  22.   
  23. } D3D11_TEXTURE2D_DESC

4、  Direct3D初始化四部曲

  1. /*****************************************************************************************  
  2. // Desc: 库文件定义部分    
  3. //*****************************************************************************************   
  4. #pragma comment(lib,"d3d9.lib")  
  5. #pragma comment(lib,"d3dx9.lib")  
  6.   
  7. //*****************************************************************************************  
  8. // Name: Direct3D_Init( )  
  9. // Desc: 初始化Direct3D  
  10. // Point:【Direct3D初始化四部曲】  
  11. //      1.初始化四部曲之一,创建Direct3D接口对象  
  12. //      2.初始化四部曲之二,获取硬件设备信息  
  13. //      3.初始化四部曲之三,填充结构体  
  14. //      4.初始化四部曲之四,创建Direct3D设备接口  
  15. //*****************************************************************************************  
  16.   
  17. HRESULT Direct3D_Init(HWND hwnd)  
  18. {  
  19.   
  20.     //--------------------------------------------------------------------------------------  
  21.     // 【Direct3D初始化四步曲之一,创接口】:创建Direct3D接口对象, 以便用该Direct3D对象创建Direct3D设备对象  
  22.     //--------------------------------------------------------------------------------------  
  23.     LPDIRECT3D9  pD3D = NULL; //Direct3D接口对象的创建  
  24.     if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //初始化Direct3D接口对象,并进行DirectX版本协商  
  25.             return E_FAIL;  
  26.   
  27.     //--------------------------------------------------------------------------------------  
  28.     // 【Direct3D初始化四步曲之二,取信息】:获取硬件设备信息  
  29.     //--------------------------------------------------------------------------------------  
  30.     D3DCAPS9 caps; int vp = 0;  
  31.     if( FAILED( pD3D->GetDeviceCaps( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps ) ) )  
  32.         {  
  33.             return E_FAIL;  
  34.         }  
  35.     if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )  
  36.         vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;   //支持硬件顶点运算,我们就采用硬件顶点运算,妥妥的  
  37.     else  
  38.         vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; //不支持硬件顶点运算,无奈只好采用软件顶点运算  
  39.   
  40.     //--------------------------------------------------------------------------------------  
  41.     // 【Direct3D初始化四步曲之三,填内容】:填充D3DPRESENT_PARAMETERS结构体  
  42.     //--------------------------------------------------------------------------------------  
  43.     D3DPRESENT_PARAMETERS d3dpp;   
  44.     ZeroMemory(&d3dpp, sizeof(d3dpp));  
  45.     d3dpp.BackBufferWidth            = SCREEN_WIDTH;  
  46.     d3dpp.BackBufferHeight           = SCREEN_LEIGHT;  
  47.     d3dpp.BackBufferFormat           = D3DFMT_A8R8G8B8;  
  48.     d3dpp.BackBufferCount            = 1;  
  49.     d3dpp.MultiSampleType            = D3DMULTISAMPLE_NONE;  
  50.     d3dpp.MultiSampleQuality         = 0;  
  51.     d3dpp.SwapEffect                 = D3DSWAPEFFECT_DISCARD;   
  52.     d3dpp.hDeviceWindow              = hwnd;  
  53.     d3dpp.Windowed                   = true;  
  54.     d3dpp.EnableAutoDepthStencil     = true;   
  55.     d3dpp.AutoDepthStencilFormat     = D3DFMT_D24S8;  
  56.     d3dpp.Flags                      = 0;  
  57.     d3dpp.FullScreen_RefreshRateInHz = 0;  
  58.     d3dpp.PresentationInterval       = D3DPRESENT_INTERVAL_IMMEDIATE;  
  59.   
  60.     //--------------------------------------------------------------------------------------  
  61.     // 【Direct3D初始化四步曲之四,创设备】:创建Direct3D设备接口  
  62.     //--------------------------------------------------------------------------------------  
  63.     if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,   
  64.         hwnd, vp, &d3dpp, &g_pd3dDevice)))  
  65.         return E_FAIL;  
  66.   
  67.   
  68.   
  69.     SAFE_RELEASE(pD3D) //LPDIRECT3D9接口对象的使命完成,我们将其释放掉  
  70.   
  71.     return S_OK;  
  72. }  
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值