//////////////////////////////////////////////////////////////////////////
//D3D全注释例子// 25期 翟勇// [1/7/2009 Administrator]
//////////////////////////////////////////////////////////////////////////
#include <d3dx9.h>
#include <d3d9.h>
//////////////////////////////////////////////////////////////////////////
//全局变量
//////////////////////////////////////////////////////////////////////////
LPDIRECT3D9 g_D3D = NULL; //Direct3D对象
LPDIRECT3DDEVICE9 g_d3dDevice = NULL; //Direct3D设备对象
HWND hWnd; // 窗口句柄
WNDCLASSEX g_wc; // 向系统声明窗口类
HINSTANCE hInst; // 窗口实例句柄.Windows设置这个参数的值并把它传递给应用程序,很多Windows函数都要用它
//////////////////////////////////////////////////////////////////////////
//声明
//////////////////////////////////////////////////////////////////////////
ATOM RegisterWndClass(HINSTANCE hInstance); //注册窗口类
BOOL InitWnd(HINSTANCE hInstance,INT nCmdL); // 创建窗口、显示窗口、更新窗口
LRESULT WINAPI MagProc(HWND,UINT,WPARAM,LPARAM); //消息处理函数
HRESULT InitialD3D( HWND hWnd ); //初始化D3DVOID Clean(); //释放创建对象
VOID Rend(); //绘制方法
VOID Msgg(); //消息处理
//////////////////////////////////////////////////////////////////////////
//程序入口
//////////////////////////////////////////////////////////////////////////
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{ if(!hPrevInstance) // 判断是否有同一个应用程序正在运行
{ RegisterWndClass(hInstance); }
if(!InitWnd(hInstance,nCmdShow)) // 初始化窗口
{ return FALSE; } InitialD3D(hWnd ); // 初始化
D3D Msgg(); // 调用 游戏循环的方法
Clean(); // 调用 释放资源的方法
UnregisterClass( L"D3D", //注销的类名字符串指针
hInstance );//应用程序句柄 // 注销窗口类函数
return 0; // 程序结束}
//////////////////////////////////////////////////////////////////////////
//实现定义声明方法
//注册窗口
//////////////////////////////////////////////////////////////////////////
ATOM RegisterWndClass(HINSTANCE hInstance)
{ g_wc.cbSize=sizeof(WNDCLASSEX); // 说明WNDCLASSEX结构体的大小,单位为字节
g_wc.style = CS_CLASSDC; // 指定窗口的风格
g_wc.lpfnWndProc=(WNDPROC)MagProc; // 指向消息处理函数的指针
g_wc.cbClsExtra= 0L; // 额外参数一般初始化为0
g_wc.cbWndExtra=0L; // 额外参数一般初始化为0
g_wc.hInstance=hInstance; // 说明该窗口类的窗口实例句柄
g_wc.hIcon=NULL; // 窗口左上角的图标(第二个参数为图标的名称或者图标的资源ID)
g_wc.hCursor=NULL; // 设置窗口内所显示的光标句柄
g_wc.hbrBackground=NULL; // 设置窗口的背景色,这里设置成空
g_wc.lpszMenuName=NULL; // 指定窗口菜单资源的指针
g_wc.lpszClassName=L"ClassName"; // 设定窗口类的名字
g_wc.hIconSm=NULL; // 任务栏图标
RegisterClassEx(&g_wc);
return S_OK; }
//////////////////////////////////////////////////////////////////////////
//创建窗口//////////////////////////////////////////////////////////////
////////////
BOOL InitWnd(HINSTANCE hInstance,INT nCmdL)
{ hWnd = CreateWindow(L"ClassName", // 注册窗口类名字
L"小试牛刀", // 窗口的名称
WS_OVERLAPPEDWINDOW , // 窗口的风格
100, // 窗口左上角的X方向
200, // 窗口左上角的Y方向
500, // 窗口的宽度
500, // 窗口的高度
NULL, // 父窗口的 句柄
NULL, // 菜单句柄
hInstance, // 当前应用程序的实例句柄
NULL); // 窗口的附加参数
if(!hWnd) // 如果窗口创建失败,则此函数返回值为FALSE
{ return FALSE; }
ShowWindow(hWnd,nCmdL); // 显示窗口
UpdateWindow(hWnd); // 更新窗口
return TRUE;}
//////////////////////////////////////////////////////////////////////////
//消息处理函数//////////////////////////////////////////////////////////
////////////////
LRESULT WINAPI MagProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage(0);
break; }
return DefWindowProc(hWnd, message, wParam, lParam);
}
///////////////////////////////////////////////////////////////////////////
//初始化D3D/////////////////////////////////////////////////////////////
/////////////
HRESULT InitialD3D( HWND hWnd )
{ g_D3D =Direct3DCreate9(D3D_SDK_VERSION);//记住背过每次都这样写的
if (g_D3D == NULL) { //消息盒子
MessageBox(NULL,//把消息装入盒子 一般为NULL
L"failed d3d",//指定终结的名字
L"aa",//指定终结对话筐名字
0); //指定内容到对话筐
MB_*** return E_FAIL; }
/*typedef struct D3DPRESENT_PARAMETERS { UINT BackBufferWidth, BackBufferHeight; D3DFORMAT BackBufferFormat; UINT BackBufferCount; D3DMULTISAMPLE_TYPE MultiSampleType; DWORD MultiSampleQuality; D3DSWAPEFFECT SwapEffect; HWND hDeviceWindow; BOOL Windowed; BOOL EnableAutoDepthStencil; D3DFORMAT AutoDepthStencilFormat; DWORD Flags; UINT FullScreen_RefreshRateInHz; UINT PresentationInterval; } D3DPRESENT_PARAMETERS, *LPD3DPRESENT_PARAMETERS; BackBufferWindth 指定后台缓冲区(BackBuffer)的宽度 BackBufferHeight 指定后台缓冲区(BackBuffer)的高度 BackBufferFormat 指定后台缓冲区的象素格式 详细参数见帮助文档 D3DFMT_*** BackBufferCount 指定后台缓冲区数量 MultiSampleType 指定多重采样类型,用于图形反锯齿 SwapEffect 指定系统如何将后台缓冲区的内容复制到前台缓冲区 D3DSWAPEFFECT_*** hDeviceWindow 指定图形绘制窗口 如为NULL,则通行绘制窗口为当前被激活的窗口 Windowed 表示图形是以窗口还是全平屏显示 TRUE是窗口 FALSE是全屏 EnableAutoDepthStencil 表示是否创建深度缓冲区 AutoDepthStencilFormat 深度缓冲区格式 D3DFMT_*** Flags 请参考D3DPRESENTFLAG通常为0 FullScreen_RefreshRateInHz 指定显示器刷新率 必须为0 resentationInterval 指定后台缓存与前台缓存的最大交换频率,可取D3DPRESENT常量中一个 根据需要选择上面内容*/ D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp,sizeof(d3dpp)); d3dpp.Windowed =TRUE; d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat=D3DFMT_UNKNOWN; /*HRESULT CreateDevice( UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviorFlags, D3DPRESENT_PARAMETERS * pPresentationParameters, IDirect3DDevice9 ** ppReturnedDeviceInterface ); Adapter 指定显卡序号,表示使用哪块显卡创建Direct3D设备对象,通常设置D3DADAPTER_DEFAULT DeviceType 指定Direct3D设备类型 D3DDEVTYPE_** hFocusWindow 指定当Direct3D程序从前台变换到后台时的提示窗口 BehaviorFlag (设备行为标志)指定Direct3D设备进行3D运算的工作方式 D3DCREATE_** pPresntationParameters 指向一个结构体D3DPRESENT_PARAMETERS*/ if (FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_d3dDevice))) { return E_FAIL; } return S_OK;} ////////////////////////////////////////////////////////////////////////////释放对象//////////////////////////////////////////////////////////////////////////VOID Clean(){ if (g_d3dDevice!=NULL) { g_d3dDevice->Release(); } if (g_D3D!=NULL) { g_D3D->Release(); }} ////////////////////////////////////////////////////////////////////////////渲染图形//////////////////////////////////////////////////////////////////////////VOID Rend(){ /*HRESULT Clear( DWORD Count, CONST D3DRECT * pRects, DWORD Flags, D3DCOLOR Color, float Z, DWORD Stencil ); Count 指定参数pRect指向的矩形数组中矩形的数量 如果pRect设置为NULL则必须为0否则非0 pRect 指向D3DRECT结构数组的指针 Flags 指定需要清空的缓冲区 可以3种任意组合 D3DCLEAR_TARGET(颜色缓冲)D3DCLEAR_ZBUFFER(深度缓冲)D3DCLEAR_STENCIL(模板缓冲) Color 指定清空颜色缓冲区后颜色缓冲区中每个象素对应的颜色值 D3DCOLOR_** Z 指定清空深度缓冲区后深度缓冲区中每个象素对应的深度值 Stencil 指定晴空模板缓冲区后模板缓冲区中每个象素对应的模板值*/ g_d3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,180),1.0f,0); g_d3dDevice->BeginScene(); //开始绘制 g_d3dDevice->EndScene(); //结束绘制 g_d3dDevice->resent(NULL,NULL,NULL,NULL);//记住就行} ////////////////////////////////////////////////////////////////////////////消息处理//////////////////////////////////////////////////////////////////////////VOID Msgg(){ MSG msg; // 定义消息结构体对象 BOOL fMessage; // 定义布尔变量,…… /*BOOL PeekMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg ); lpMsg 指向MSG结构体 hWnd 窗口句柄 wMsgFilterMin 返回消息的最小值 wMsgFilterMax 返回消息的最大值 wRemoveMsg 选择消息是否保留 PM_****/ eekMessage(&msg,NULL,0,0,PM_NOREMOVE); // 从消息队列中提取消息 while (msg.message != WM_QUIT) { fMessage = PeekMessage(&msg,NULL,0,0,PM_REMOVE); // 从消息队列中提取消息 if (fMessage) { TranslateMessage(&msg); // 分析消息 DispatchMessage(&msg); // } else { // 调用 控制方法 Rend(); // 调用 渲染方法 } }}
[此贴子已经被Admin于2009-1-11 0:23:45编辑过] |