BlankDTX9Window - DirectX9c 程序的模板[原创]
直接上代码,注释比较详尽.
虽然代码很简单,但是转载请注明作者及出处!谢谢!
DTXWindow.h
/**
* 程序名: DirectX9 空白实例
* 版本: 1.0
* 作者: Suwnayking
* Blog: http://sunwayking.cnblogs.com/
* QQ: 410109674
* Email: sunwayking@163.com
* 制作日期: 2009-03-12 18:32:03
* 功能描述:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1. 适合做为任何 DirectX9 游戏或程序的编写起点;
2. 附带了详尽的注释,适合Win32编程初学者和DirectX编程初学者自学.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* 版权信息: 本代码开源,转载请注明作者及出处,谢谢!
**/
// define 定义
#define CLASS_NAME "BlankDTX9Window"
#define WINDOW_NAME "BlankDTX9Window"
#define WINDOW_WIDTH 640
#define WINDOW_HEIGHT 480
// 引用头文件
#include<d3d9.h>
#include<d3dx9.h>
// 引用库文件
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
// 应用程序句柄
HINSTANCE hInstance=NULL;
// 主窗口句柄
HWND hWnd=NULL;
// 定义Direct3D 对象
LPDIRECT3D9 g_D3D = NULL;
// 定义Direct3D 设备
LPDIRECT3DDEVICE9 g_D3DDevice = NULL;
// 定义D3DXFONT 对象(字体对象),和一个RECT对象(描述文本的绘制区域)
LPD3DXFONT g_Font=NULL;
RECT g_FontPosition={0,0,0,0};
// 预声明各个函数
LRESULT WINAPI WndProc(HWND,UINT,WPARAM,LPARAM);
BOOL InitializeD3D(HWND,BOOL);
void RenderScene();
void DisposeD3D();
BOOL InitializeObjects();
/**
* 程序名: DirectX9 空白实例
* 版本: 1.0
* 作者: Suwnayking
* Blog: http://sunwayking.cnblogs.com/
* QQ: 410109674
* Email: sunwayking@163.com
* 制作日期: 2009-03-12 18:32:03
* 功能描述:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1. 适合做为任何 DirectX9 游戏或程序的编写起点;
2. 附带了详尽的注释,适合Win32编程初学者和DirectX编程初学者自学.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* 版权信息: 本代码开源,转载请注明作者及出处,谢谢!
**/
// define 定义
#define CLASS_NAME "BlankDTX9Window"
#define WINDOW_NAME "BlankDTX9Window"
#define WINDOW_WIDTH 640
#define WINDOW_HEIGHT 480
// 引用头文件
#include<d3d9.h>
#include<d3dx9.h>
// 引用库文件
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
// 应用程序句柄
HINSTANCE hInstance=NULL;
// 主窗口句柄
HWND hWnd=NULL;
// 定义Direct3D 对象
LPDIRECT3D9 g_D3D = NULL;
// 定义Direct3D 设备
LPDIRECT3DDEVICE9 g_D3DDevice = NULL;
// 定义D3DXFONT 对象(字体对象),和一个RECT对象(描述文本的绘制区域)
LPD3DXFONT g_Font=NULL;
RECT g_FontPosition={0,0,0,0};
// 预声明各个函数
LRESULT WINAPI WndProc(HWND,UINT,WPARAM,LPARAM);
BOOL InitializeD3D(HWND,BOOL);
void RenderScene();
void DisposeD3D();
BOOL InitializeObjects();
DTXWindow.cpp
/**
* 程序名: DirectX9 空白实例
* 版本: 1.0
* 作者: Suwnayking
* Blog: http://sunwayking.cnblogs.com/
* QQ: 410109674
* Email: sunwayking@163.com
* 制作日期: 2009-03-12 18:32:03
* 功能描述:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1. 适合做为任何 DirectX9 游戏或程序的编写起点;
2. 附带了详尽的注释,适合Win32编程初学者和DirectX编程初学者自学.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* 版权信息: 本代码开源,转载请注明作者及出处,谢谢!
**/
#include "DTXWindow.h"
// Win 程序主函数(程序入口函数)
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmdLine, int show)
{
hInstance=hInst;// 保存应用程序句柄
WNDCLASSEX wc;// 声明窗体类并初始化
wc.cbSize=sizeof(WNDCLASSEX);// 通常情况下,只要将此参数设置为sizeof(WNDCLASSEX)即可,如果程序中用到了GetClassInfoEx函数,那么在使用前请一定先设置cbSize的值,
wc.style=CS_CLASSDC;// 指定一个样式,它的值可以是窗口样式的任意组合
wc.lpfnWndProc=WndProc;// 此参数为指定一个窗口过程的回调函数
wc.cbClsExtra=0;// 指定一个数值,记录窗口类额外的信息,默认为0
wc.cbWndExtra=0;// 指定一个数值,记录窗口实例的额外信息,默认为0;如果程序使用WNDCLASSEX注册一个从资源文件里创建的对话框,则此参数必须设置为DLGWINDOWEXTRA,这里我也将其设置为0
wc.hInstance=hInst;// 应用程序句柄
wc.hIcon=NULL;// 窗口类的图标,此参数ICON资源句柄,如果设置为NULL,操作系统将提供一个默认的图标,这里可以自己指定一个ICON,如LoadIcon(NULL,MAKEINTRESOURCE(IDI_QUESTION));
wc.hCursor=NULL;// 窗口类的鼠标样式,同样,该参数为指向CURSOR资源的句柄,如果为NULL,则当任何时候鼠标进入窗口区域时必须明确指定鼠标形状
wc.hbrBackground=NULL;// 背景刷的句柄,即可以指向物理笔刷又可以为一个颜色值,该值必须为标准系统颜色;当使用UnregisterClass函数注销一个窗口类的时候,系统会自动删除该类的笔刷,程序运行中不可删除.如果此成员值为NULL,那么在必要的时候客户端必须自己执行渲染.确认什么时候渲染背景,你可通过BeginPaint函数提取WM_ERASEBKGND 消息或测试PAINTSTRUCT结构中fErase的值
wc.lpszMenuName=NULL;// 指向一个以NULL结尾的字符串,同资源中的名字一样,作为窗口菜单的名字.如果要使用整型ID标识菜单,可以使用MAKEINTRESOURCE定义一个宏.如果它的值为NULL,那么该类创建的窗口将都没有默认的菜单
wc.lpszClassName=CLASS_NAME;// 窗口类的名字,我们可以随便取,值类型为一个字符串
wc.hIconSm=NULL;// 在任务栏时的图标,值设置同hIcon
// 注册窗体类
RegisterClassEx(
&wc
);
// 创建窗体
hWnd=CreateWindow(
CLASS_NAME,
WINDOW_NAME,
WS_OVERLAPPEDWINDOW,
100,
100,
WINDOW_WIDTH,
WINDOW_HEIGHT,
NULL,
NULL,
hInst,
NULL
);// 保存主窗口句柄
// 初始化D3D
if(FAILED(InitializeD3D(hWnd,FALSE)))
return 0;
// 显示窗体
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
{
// 绘制并显示D3D场景
RenderScene();
}
}
// 释放所有D3D对象
void DisposeD3D();
UnregisterClass(
CLASS_NAME,
wc.hInstance
);
}
// 窗体过程函数
LRESULT WINAPI WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(
0
);
return 0;
break;
}
return DefWindowProc(
hWnd,
msg,
wParam,
lParam
);
}
// 初始化D3D设备
BOOL InitializeD3D(HWND hWnd,BOOL bFullscreen)
{
D3DDISPLAYMODE displaymode;
// 创建D3D对象
g_D3D=Direct3DCreate9(
D3D_SDK_VERSION
);
if (g_D3D==NULL)
{
return FALSE;
}
// 获取桌面显示模式
if (FAILED(g_D3D->GetAdapterDisplayMode(
D3DADAPTER_DEFAULT,
&displaymode
)))
{
return FALSE;
}
// 设置用来创建D3D设备的结构体
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(
&d3dpp,
sizeof(D3DPRESENT_PARAMETERS
));
if (bFullscreen)
{
d3dpp.Windowed=FALSE;
d3dpp.BackBufferWidth=WINDOW_WIDTH;
d3dpp.BackBufferHeight=WINDOW_HEIGHT;
}
else
{
d3dpp.Windowed=TRUE;
}
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat=displaymode.Format;
// 创建D3D设备
if(FAILED(g_D3D->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&d3dpp,
&g_D3DDevice
)))
{
return FALSE;
}
if(FAILED(InitializeObjects()))
{
return FALSE;
}
return TRUE;
}
// 绘制并显示场景
void RenderScene()
{
// 清除后台缓冲
g_D3DDevice->Clear(
0,
NULL,
D3DCLEAR_TARGET,
D3DCOLOR_XRGB(255,255,255),
1.0f,
0
);
// 初始化场景,开始绘制
g_D3DDevice->BeginScene();
// TODO: 写入自己的场景绘制代码
// 设置文本绘制位置,并绘制文本
g_FontPosition.top = 150;
g_Font->DrawText(
NULL,
"~DirectX 9.0c~",
-1,
&g_FontPosition,
DT_CENTER,
D3DCOLOR_XRGB(0,0,0)
);
// 结束场景,停止绘制
g_D3DDevice->EndScene();
// 显示场景
g_D3DDevice->Present(
NULL,
NULL,
NULL,
NULL
);
}
// 释放D3D对象
void DisposeD3D()
{
if (g_D3DDevice!=NULL)
{
g_D3DDevice->Release();
}
if (g_D3D!=NULL)
{
g_D3D->Release();
}
if (g_Font!=NULL)
{
g_Font->Release();
}
g_D3DDevice=NULL;
g_D3D=NULL;
g_Font=NULL;
}
// 初始化D3D对象
BOOL InitializeObjects()
{
// 创建D3D字体对象
if (FAILED(D3DXCreateFont(g_D3DDevice,
36,
0,
0,
1,
FALSE,
DEFAULT_CHARSET,
OUT_TT_ONLY_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH | FF_DONTCARE,
"微软雅黑",
&g_Font
)))
{
return FALSE;
}
// 设置文本绘制的区域
GetClientRect(hWnd,&g_FontPosition);
return TRUE;
}
/**
* 程序名: DirectX9 空白实例
* 版本: 1.0
* 作者: Suwnayking
* Blog: http://sunwayking.cnblogs.com/
* QQ: 410109674
* Email: sunwayking@163.com
* 制作日期: 2009-03-12 18:32:03
* 功能描述:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1. 适合做为任何 DirectX9 游戏或程序的编写起点;
2. 附带了详尽的注释,适合Win32编程初学者和DirectX编程初学者自学.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
* 版权信息: 本代码开源,转载请注明作者及出处,谢谢!
**/
#include "DTXWindow.h"
// Win 程序主函数(程序入口函数)
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmdLine, int show)
{
hInstance=hInst;// 保存应用程序句柄
WNDCLASSEX wc;// 声明窗体类并初始化
wc.cbSize=sizeof(WNDCLASSEX);// 通常情况下,只要将此参数设置为sizeof(WNDCLASSEX)即可,如果程序中用到了GetClassInfoEx函数,那么在使用前请一定先设置cbSize的值,
wc.style=CS_CLASSDC;// 指定一个样式,它的值可以是窗口样式的任意组合
wc.lpfnWndProc=WndProc;// 此参数为指定一个窗口过程的回调函数
wc.cbClsExtra=0;// 指定一个数值,记录窗口类额外的信息,默认为0
wc.cbWndExtra=0;// 指定一个数值,记录窗口实例的额外信息,默认为0;如果程序使用WNDCLASSEX注册一个从资源文件里创建的对话框,则此参数必须设置为DLGWINDOWEXTRA,这里我也将其设置为0
wc.hInstance=hInst;// 应用程序句柄
wc.hIcon=NULL;// 窗口类的图标,此参数ICON资源句柄,如果设置为NULL,操作系统将提供一个默认的图标,这里可以自己指定一个ICON,如LoadIcon(NULL,MAKEINTRESOURCE(IDI_QUESTION));
wc.hCursor=NULL;// 窗口类的鼠标样式,同样,该参数为指向CURSOR资源的句柄,如果为NULL,则当任何时候鼠标进入窗口区域时必须明确指定鼠标形状
wc.hbrBackground=NULL;// 背景刷的句柄,即可以指向物理笔刷又可以为一个颜色值,该值必须为标准系统颜色;当使用UnregisterClass函数注销一个窗口类的时候,系统会自动删除该类的笔刷,程序运行中不可删除.如果此成员值为NULL,那么在必要的时候客户端必须自己执行渲染.确认什么时候渲染背景,你可通过BeginPaint函数提取WM_ERASEBKGND 消息或测试PAINTSTRUCT结构中fErase的值
wc.lpszMenuName=NULL;// 指向一个以NULL结尾的字符串,同资源中的名字一样,作为窗口菜单的名字.如果要使用整型ID标识菜单,可以使用MAKEINTRESOURCE定义一个宏.如果它的值为NULL,那么该类创建的窗口将都没有默认的菜单
wc.lpszClassName=CLASS_NAME;// 窗口类的名字,我们可以随便取,值类型为一个字符串
wc.hIconSm=NULL;// 在任务栏时的图标,值设置同hIcon
// 注册窗体类
RegisterClassEx(
&wc
);
// 创建窗体
hWnd=CreateWindow(
CLASS_NAME,
WINDOW_NAME,
WS_OVERLAPPEDWINDOW,
100,
100,
WINDOW_WIDTH,
WINDOW_HEIGHT,
NULL,
NULL,
hInst,
NULL
);// 保存主窗口句柄
// 初始化D3D
if(FAILED(InitializeD3D(hWnd,FALSE)))
return 0;
// 显示窗体
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
{
// 绘制并显示D3D场景
RenderScene();
}
}
// 释放所有D3D对象
void DisposeD3D();
UnregisterClass(
CLASS_NAME,
wc.hInstance
);
}
// 窗体过程函数
LRESULT WINAPI WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(
0
);
return 0;
break;
}
return DefWindowProc(
hWnd,
msg,
wParam,
lParam
);
}
// 初始化D3D设备
BOOL InitializeD3D(HWND hWnd,BOOL bFullscreen)
{
D3DDISPLAYMODE displaymode;
// 创建D3D对象
g_D3D=Direct3DCreate9(
D3D_SDK_VERSION
);
if (g_D3D==NULL)
{
return FALSE;
}
// 获取桌面显示模式
if (FAILED(g_D3D->GetAdapterDisplayMode(
D3DADAPTER_DEFAULT,
&displaymode
)))
{
return FALSE;
}
// 设置用来创建D3D设备的结构体
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(
&d3dpp,
sizeof(D3DPRESENT_PARAMETERS
));
if (bFullscreen)
{
d3dpp.Windowed=FALSE;
d3dpp.BackBufferWidth=WINDOW_WIDTH;
d3dpp.BackBufferHeight=WINDOW_HEIGHT;
}
else
{
d3dpp.Windowed=TRUE;
}
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat=displaymode.Format;
// 创建D3D设备
if(FAILED(g_D3D->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&d3dpp,
&g_D3DDevice
)))
{
return FALSE;
}
if(FAILED(InitializeObjects()))
{
return FALSE;
}
return TRUE;
}
// 绘制并显示场景
void RenderScene()
{
// 清除后台缓冲
g_D3DDevice->Clear(
0,
NULL,
D3DCLEAR_TARGET,
D3DCOLOR_XRGB(255,255,255),
1.0f,
0
);
// 初始化场景,开始绘制
g_D3DDevice->BeginScene();
// TODO: 写入自己的场景绘制代码
// 设置文本绘制位置,并绘制文本
g_FontPosition.top = 150;
g_Font->DrawText(
NULL,
"~DirectX 9.0c~",
-1,
&g_FontPosition,
DT_CENTER,
D3DCOLOR_XRGB(0,0,0)
);
// 结束场景,停止绘制
g_D3DDevice->EndScene();
// 显示场景
g_D3DDevice->Present(
NULL,
NULL,
NULL,
NULL
);
}
// 释放D3D对象
void DisposeD3D()
{
if (g_D3DDevice!=NULL)
{
g_D3DDevice->Release();
}
if (g_D3D!=NULL)
{
g_D3D->Release();
}
if (g_Font!=NULL)
{
g_Font->Release();
}
g_D3DDevice=NULL;
g_D3D=NULL;
g_Font=NULL;
}
// 初始化D3D对象
BOOL InitializeObjects()
{
// 创建D3D字体对象
if (FAILED(D3DXCreateFont(g_D3DDevice,
36,
0,
0,
1,
FALSE,
DEFAULT_CHARSET,
OUT_TT_ONLY_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH | FF_DONTCARE,
"微软雅黑",
&g_Font
)))
{
return FALSE;
}
// 设置文本绘制的区域
GetClientRect(hWnd,&g_FontPosition);
return TRUE;
}
作者: Sunwayking
http://www.cnblogs.com/Sunwayking/articles/1409930.html
参考资料:
DirectX SDK Document
Ultimate Game Programming with DirectX (American)Allen Sherrod
posted on 2009-03-12 20:17 Sunwayking 阅读(418) 评论(0) 编辑 收藏 举报