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声明形式如下:
- typedef struct D3D11_TEXTURE2D_DESC {
- UINT Width;
- UINT Height;
- UINT MipLevels;
- UINT ArraySize;
- DXGI_FORMAT Format;
- DXGI_SAMPLE_DESC SampleDesc;
- D3D11_USAGE Usage;
- UINT BindFlags;
- UINT CPUAccessFlags;
- UINT MiscFlags;
- } D3D11_TEXTURE2D_DESC
4、 Direct3D初始化四部曲
- /*****************************************************************************************
- // Desc: 库文件定义部分
- //*****************************************************************************************
- #pragma comment(lib,"d3d9.lib")
- #pragma comment(lib,"d3dx9.lib")
- //*****************************************************************************************
- // Name: Direct3D_Init( )
- // Desc: 初始化Direct3D
- // Point:【Direct3D初始化四部曲】
- // 1.初始化四部曲之一,创建Direct3D接口对象
- // 2.初始化四部曲之二,获取硬件设备信息
- // 3.初始化四部曲之三,填充结构体
- // 4.初始化四部曲之四,创建Direct3D设备接口
- //*****************************************************************************************
- HRESULT Direct3D_Init(HWND hwnd)
- {
- //--------------------------------------------------------------------------------------
- // 【Direct3D初始化四步曲之一,创接口】:创建Direct3D接口对象, 以便用该Direct3D对象创建Direct3D设备对象
- //--------------------------------------------------------------------------------------
- LPDIRECT3D9 pD3D = NULL; //Direct3D接口对象的创建
- if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) //初始化Direct3D接口对象,并进行DirectX版本协商
- return E_FAIL;
- //--------------------------------------------------------------------------------------
- // 【Direct3D初始化四步曲之二,取信息】:获取硬件设备信息
- //--------------------------------------------------------------------------------------
- D3DCAPS9 caps; int vp = 0;
- if( FAILED( pD3D->GetDeviceCaps( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps ) ) )
- {
- return E_FAIL;
- }
- if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
- vp = D3DCREATE_HARDWARE_VERTEXPROCESSING; //支持硬件顶点运算,我们就采用硬件顶点运算,妥妥的
- else
- vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; //不支持硬件顶点运算,无奈只好采用软件顶点运算
- //--------------------------------------------------------------------------------------
- // 【Direct3D初始化四步曲之三,填内容】:填充D3DPRESENT_PARAMETERS结构体
- //--------------------------------------------------------------------------------------
- D3DPRESENT_PARAMETERS d3dpp;
- ZeroMemory(&d3dpp, sizeof(d3dpp));
- d3dpp.BackBufferWidth = SCREEN_WIDTH;
- d3dpp.BackBufferHeight = SCREEN_LEIGHT;
- d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
- d3dpp.BackBufferCount = 1;
- d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
- d3dpp.MultiSampleQuality = 0;
- d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
- d3dpp.hDeviceWindow = hwnd;
- d3dpp.Windowed = true;
- d3dpp.EnableAutoDepthStencil = true;
- d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
- d3dpp.Flags = 0;
- d3dpp.FullScreen_RefreshRateInHz = 0;
- d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
- //--------------------------------------------------------------------------------------
- // 【Direct3D初始化四步曲之四,创设备】:创建Direct3D设备接口
- //--------------------------------------------------------------------------------------
- if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
- hwnd, vp, &d3dpp, &g_pd3dDevice)))
- return E_FAIL;
- SAFE_RELEASE(pD3D) //LPDIRECT3D9接口对象的使命完成,我们将其释放掉
- return S_OK;
- }