direct3d9 渐变的窗口代码
2015-11-19 15:33
260 查看
//包含Dx9的头文件
#include <d3d9.h>
#pragma warning( disable : 4996
dad0
) //除去警告
#include <strsafe.h>
#pragma warning( default : 4996 )
//-----------------------------------------------------------------------------
// 全局参数
//-----------------------------------------------------------------------------
LPDIRECT3D9 g_pD3D = NULL; // 创建 D3DDevice
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // 我们使用的渲染设备
//-----------------------------------------------------------------------------
// 名称: InitD3D()
// 描述: 初始化 Direct3D
//-----------------------------------------------------------------------------
HRESULT InitD3D(HWND hWnd)
{
// 根据版本创建D3D对象
if (NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
return E_FAIL;
//设置参数
D3DPRESENT_PARAMETERS d3dpp; //参数对象,用于下面的设备创建
ZeroMemory(&d3dpp, sizeof(d3dpp)); //用0来填充d3dpp内存区域,也就是初始化内存
d3dpp.Windowed = TRUE; //设置为窗口模式
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //交换缓冲支持的效果类型,指定表面在交换链中是如何被交换的。这里为后备的缓存加载之后就删除。
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; //显示模式
//创建设备驱动Direct3D
if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, //默认适配器
D3DDEVTYPE_HAL, //硬件驱动
hWnd, //设备所使用的窗体
D3DCREATE_SOFTWARE_VERTEXPROCESSING, //顶点像素渲染方式
&d3dpp, //参数
&g_pd3dDevice //驱动设备
)))
{
return E_FAIL;
}
// 初始化完成
return S_OK;
}
//-----------------------------------------------------------------------------
// 名称: Cleanup()
// 描述: 释放所有初始化对象
//-----------------------------------------------------------------------------
VOID Cleanup()
{
if (g_pd3dDevice != NULL)
g_pd3dDevice->Release();
if (g_pD3D != NULL)
g_pD3D->Release();
KillTimer(NULL, 1);
}
//-----------------------------------------------------------------------------
// 名称: Render()
// 描述: 绘制场景
//-----------------------------------------------------------------------------
VOID Render()
{
if (NULL == g_pd3dDevice)
return;
//清除背景缓存并重新设置为蓝色
g_pd3dDevice->Clear(0, // pRects中的矩形数,如果 pRects为NULL着该参数必须为0
NULL, //一个指向D3DRECT结构体的指针
D3DCLEAR_TARGET, //D3DCLEAR标志,现在为清空当前的渲染器
D3DCOLOR_XRGB(0, 0, 0), //颜色
1.0f, // depth buffer的新z值
0 //模板
);
// 开始渲染场景
if (SUCCEEDED(g_pd3dDevice->BeginScene()))
{
// 可以在这里渲染场景
// 结束渲染
g_pd3dDevice->EndScene();
}
// 清苦当前缓存中的数据
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}
//-----------------------------------------------------------------------------
// 名称: MsgProc()
// 描述: Windows窗体句柄
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
Cleanup();
PostQuitMessage(0);
return 0;
case WM_PAINT:
Render();
ValidateRect(hWnd, NULL);//效验矩形数据
return 0;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
void CALLBACK TimeProc(HWND hWnd, UINT nMsg, UINT nTimerid, DWORD dwTime)
{
if (NULL == g_pd3dDevice)
return;
//清除背景缓存并重新设置为颜色
g_pd3dDevice->Clear(0, // pRects中的矩形数,如果 pRects为NULL着该参数必须为0
NULL, //一个指向D3DRECT结构体的指针
D3DCLEAR_TARGET, //D3DCLEAR标志,现在为清空当前的渲染器
D3DCOLOR_XRGB(0, dwTime%256, 0), //颜色
1.0f, // depth buffer的新z值
0 //模板
);
// 开始渲染场景
if (SUCCEEDED(g_pd3dDevice->BeginScene()))
{
// 可以在这里渲染场景
// 结束渲染
g_pd3dDevice->EndScene();
}
// 清苦当前缓存中的数据
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}
//WinMain函数入口
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{
//直接初始化结构体
/*
GetModuleHandle 函数是返回一个模块在当前进程地址空间的HMODULE
如果函数参数值为NULL则返回一个虚拟当前句柄.
*/
WNDCLASSEX wc = { sizeof(WNDCLASSEX), //指定了以字节为单位的结构的大小
CS_CLASSDC, //所有属于该类的窗口实例共享相同的DC
MsgProc, //是指向窗口过程的指针
0L, //…………
0L, //…………
GetModuleHandle(NULL), //是指向窗口过程实例的句柄
NULL, //指向窗口图标的句柄
NULL, //指向窗口光标的句柄
NULL, //背景刷
NULL, //菜单
"D3D Tutorial", //类名
NULL //指向小图标的句柄
};
//注册窗体类
RegisterClassEx(&wc);
//创建窗体
HWND hWnd = CreateWindow("D3D Tutorial", //窗体的类名
"D3D Tutorial 01: CreateDevice", //标题
WS_OVERLAPPEDWINDOW, //窗体风格
100, //位置坐标x
100, //位置坐标y
300, //宽
300, //高
NULL, //父窗口
NULL, //菜单
wc.hInstance, //窗体类句柄,2000以上的系统无含义!
NULL //窗体结构参数
);
SetTimer(NULL, 1, 1000, TimeProc);
// Initialize Direct3D
if (SUCCEEDED(InitD3D(hWnd)))
{
// Show the window
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
// Enter the message loop
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
UnregisterClass("D3D Tutorial", wc.hInstance);
return 0;
}
//包含Dx9的头文件
#include <d3d9.h>
#pragma warning( disable : 4996
dad0
) //除去警告
#include <strsafe.h>
#pragma warning( default : 4996 )
//-----------------------------------------------------------------------------
// 全局参数
//-----------------------------------------------------------------------------
LPDIRECT3D9 g_pD3D = NULL; // 创建 D3DDevice
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // 我们使用的渲染设备
//-----------------------------------------------------------------------------
// 名称: InitD3D()
// 描述: 初始化 Direct3D
//-----------------------------------------------------------------------------
HRESULT InitD3D(HWND hWnd)
{
// 根据版本创建D3D对象
if (NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
return E_FAIL;
//设置参数
D3DPRESENT_PARAMETERS d3dpp; //参数对象,用于下面的设备创建
ZeroMemory(&d3dpp, sizeof(d3dpp)); //用0来填充d3dpp内存区域,也就是初始化内存
d3dpp.Windowed = TRUE; //设置为窗口模式
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //交换缓冲支持的效果类型,指定表面在交换链中是如何被交换的。这里为后备的缓存加载之后就删除。
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; //显示模式
//创建设备驱动Direct3D
if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, //默认适配器
D3DDEVTYPE_HAL, //硬件驱动
hWnd, //设备所使用的窗体
D3DCREATE_SOFTWARE_VERTEXPROCESSING, //顶点像素渲染方式
&d3dpp, //参数
&g_pd3dDevice //驱动设备
)))
{
return E_FAIL;
}
// 初始化完成
return S_OK;
}
//-----------------------------------------------------------------------------
// 名称: Cleanup()
// 描述: 释放所有初始化对象
//-----------------------------------------------------------------------------
VOID Cleanup()
{
if (g_pd3dDevice != NULL)
g_pd3dDevice->Release();
if (g_pD3D != NULL)
g_pD3D->Release();
KillTimer(NULL, 1);
}
//-----------------------------------------------------------------------------
// 名称: Render()
// 描述: 绘制场景
//-----------------------------------------------------------------------------
VOID Render()
{
if (NULL == g_pd3dDevice)
return;
//清除背景缓存并重新设置为蓝色
g_pd3dDevice->Clear(0, // pRects中的矩形数,如果 pRects为NULL着该参数必须为0
NULL, //一个指向D3DRECT结构体的指针
D3DCLEAR_TARGET, //D3DCLEAR标志,现在为清空当前的渲染器
D3DCOLOR_XRGB(0, 0, 0), //颜色
1.0f, // depth buffer的新z值
0 //模板
);
// 开始渲染场景
if (SUCCEEDED(g_pd3dDevice->BeginScene()))
{
// 可以在这里渲染场景
// 结束渲染
g_pd3dDevice->EndScene();
}
// 清苦当前缓存中的数据
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}
//-----------------------------------------------------------------------------
// 名称: MsgProc()
// 描述: Windows窗体句柄
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
Cleanup();
PostQuitMessage(0);
return 0;
case WM_PAINT:
Render();
ValidateRect(hWnd, NULL);//效验矩形数据
return 0;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
void CALLBACK TimeProc(HWND hWnd, UINT nMsg, UINT nTimerid, DWORD dwTime)
{
if (NULL == g_pd3dDevice)
return;
//清除背景缓存并重新设置为颜色
g_pd3dDevice->Clear(0, // pRects中的矩形数,如果 pRects为NULL着该参数必须为0
NULL, //一个指向D3DRECT结构体的指针
D3DCLEAR_TARGET, //D3DCLEAR标志,现在为清空当前的渲染器
D3DCOLOR_XRGB(0, dwTime%256, 0), //颜色
1.0f, // depth buffer的新z值
0 //模板
);
// 开始渲染场景
if (SUCCEEDED(g_pd3dDevice->BeginScene()))
{
// 可以在这里渲染场景
// 结束渲染
g_pd3dDevice->EndScene();
}
// 清苦当前缓存中的数据
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}
//WinMain函数入口
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{
//直接初始化结构体
/*
GetModuleHandle 函数是返回一个模块在当前进程地址空间的HMODULE
如果函数参数值为NULL则返回一个虚拟当前句柄.
*/
WNDCLASSEX wc = { sizeof(WNDCLASSEX), //指定了以字节为单位的结构的大小
CS_CLASSDC, //所有属于该类的窗口实例共享相同的DC
MsgProc, //是指向窗口过程的指针
0L, //…………
0L, //…………
GetModuleHandle(NULL), //是指向窗口过程实例的句柄
NULL, //指向窗口图标的句柄
NULL, //指向窗口光标的句柄
NULL, //背景刷
NULL, //菜单
"D3D Tutorial", //类名
NULL //指向小图标的句柄
};
//注册窗体类
RegisterClassEx(&wc);
//创建窗体
HWND hWnd = CreateWindow("D3D Tutorial", //窗体的类名
"D3D Tutorial 01: CreateDevice", //标题
WS_OVERLAPPEDWINDOW, //窗体风格
100, //位置坐标x
100, //位置坐标y
300, //宽
300, //高
NULL, //父窗口
NULL, //菜单
wc.hInstance, //窗体类句柄,2000以上的系统无含义!
NULL //窗体结构参数
);
SetTimer(NULL, 1, 1000, TimeProc);
// Initialize Direct3D
if (SUCCEEDED(InitD3D(hWnd)))
{
// Show the window
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
// Enter the message loop
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
UnregisterClass("D3D Tutorial", wc.hInstance);
return 0;
}
相关文章推荐
- javaee ssh框架下mysql中文乱码解决办法
- Matlab处理彩色图像 RGB888-RGB565
- python logging模块实例
- C语言中的回调
- java byte转二进制字符串
- Struts2+Spring+hibernate 小demo
- 浅复制与深复制
- Eclipse 快捷键
- Spring邮件服务
- java内存泄露介绍
- [置顶] Python在线爆破邮箱账号密码测试代码(亲测可用)
- c++中switch语句的使用问题
- freemarker+spring中文乱码的解决
- C语言中下标与指针的转换以及指向指针的指针的例子
- java SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- Django里,如何更改ADMIN管理后台的显示
- input file
- asp.net微信开发(高级群发图文)
- java 反射应用案例
- java sftp文件上传核心代码