// JCYWindow.cpp 我写的基于C++继承体系的窗口的类的实现
// 头文件
#include "JCYWindow.h"
namespace JCY
{
#define SAFE_RELEASE( p ) if ( p ) { p->Release( ); p = NULL; }
DWORD CDXBasicApp::s_windowState = WS_NORMAL;
CDXBasicApp::CDXBasicApp( void ) // 默认构造函数
{
m_bFullScreen = false;
m_Width = 640;
m_Height = 480;
m_Style = WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX;
m_wndClass.lpfnWndProc = s_MessageHandler;// 消息函数赋值在默认构造函数,确保了基类能够访问基类的消息函数
}
CDXBasicApp::~CDXBasicApp( void ) // 默认析构函数
{
}
bool CDXBasicApp::SetAttributes( HINSTANCE _hInst, HINSTANCE _hInstPrev, LPSTR _lpCmdLine, int _nCmdShow )// 设置属性
{
m_hInst = _hInst;
m_Width = 640;
m_Height = 480;
m_Style = WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX;
return true;
}
/*-------------------------------------------------------------*/
bool CDXBasicApp::SetSize( DWORD _Width, DWORD _Height )// 设置大小
{
m_Width = _Width;
m_Height = _Height;
return true;
}
bool CDXBasicApp::SetStyle( DWORD _Style ) // 设置样式
{
m_Style = _Style;
return true;
}
bool CDXBasicApp::SetFullScreen( bool bFullScreen ) // 设置全屏
{
m_bFullScreen = bFullScreen;
if ( bFullScreen ) return SetStyle( WS_EX_TOPMOST | WS_POPUP | WS_VISIBLE );
else return SetStyle( WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX );
}
// 默认消息函数
LRESULT WINAPI CDXBasicApp::s_MessageHandler( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_KEYDOWN:
if ( wParam == VK_ESCAPE ) PostQuitMessage( 0 ); return 0;
case WM_DESTROY:
PostQuitMessage( 0 ); return 0;
case WM_SIZE:
if ( wParam == SIZE_MINIMIZED ) s_windowState = WS_MINIMIZED;
else s_windowState = WS_NOMALIZED;
break;
case WM_KILLFOCUS:
s_windowState = WS_LOSTFOCUS;
break;
case WM_SETFOCUS:
s_windowState = WS_GETFOCUS;
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
/*-------------------------------------------------------------*/
bool CDXBasicApp::Initialize( TCHAR* caption ) // 初始化函数
{
OnPreInitialize( );
// 设置成员m_wndClass的属性
m_wndClass.cbSize = sizeof( m_wndClass );
m_wndClass.style = CS_CLASSDC;
m_wndClass.cbClsExtra = 0L;
m_wndClass.cbWndExtra = 0L;
m_wndClass.hInstance = m_hInst;
m_wndClass.hIcon = LoadIcon( NULL, IDI_APPLICATION );
m_wndClass.hCursor = LoadCursor( NULL, IDC_ARROW );
m_wndClass.hbrBackground = NULL;
m_wndClass.lpszMenuName = NULL;
m_wndClass.lpszClassName = caption;
m_wndClass.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
RegisterClassEx( &m_wndClass );// 注册成员wndClass
if ( m_bFullScreen )
{
m_hWnd = CreateWindow( // 创建窗口
caption,
caption,
m_Style,
CW_USEDEFAULT,
CW_USEDEFAULT,
m_Width,
m_Height,
GetDesktopWindow(),
NULL,
m_hInst,
NULL );
}
else
{
m_hWnd = CreateWindow( // 创建窗口
caption,
caption,
m_Style,
CW_USEDEFAULT,
CW_USEDEFAULT,
m_Width + 6,
m_Height + 32,
GetDesktopWindow(),
NULL,
m_hInst,
NULL );
}
if ( m_hWnd == NULL ) Throw( "无法创建窗口。" ); // 窗口句柄为空则错误
HRESULT hr;
//创建D3D对象
m_pD3D = Direct3DCreate9( D3D_SDK_VERSION );
if ( m_pD3D == NULL ) Throw( "创建D3D对象失败。" );
// 获取显示器的模式
D3DDISPLAYMODE displayMode;
hr = m_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &displayMode );
ThrowIfFailed( hr, "获取显示器的模式失败。" );
ZeroMemory( &m_D3dpp, sizeof( m_D3dpp ) );
m_D3dpp.Windowed = !m_bFullScreen;
m_D3dpp.BackBufferWidth = m_Width;
m_D3dpp.BackBufferHeight = m_Height;
m_D3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
m_D3dpp.BackBufferFormat = displayMode.Format;
m_D3dpp.EnableAutoDepthStencil = TRUE;
m_D3dpp.AutoDepthStencilFormat = D3DFMT_D16;
m_D3dpp.PresentationInterval = D3DPRESENT_DONOTWAIT; // 这个标识符很重要,它可以让窗口不会等待管道线,可以很流畅的运动
m_D3dpp.hDeviceWindow = m_hWnd;
// 创建设备
hr = m_pD3D->CreateDevice( D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL, m_hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&m_D3dpp, &m_pDevice );
ThrowIfFailed( hr, "创建设备失败。" );
ShowWindow( m_hWnd, SW_SHOWDEFAULT );// 显示窗口
UpdateWindow( m_hWnd );// 更新窗口
return OnPostInitialize( );
}
bool CDXBasicApp::Run( void ) // 运行
{
// 进入框架内部运行消息循环
MSG msg;
PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE );
while( msg.message != WM_QUIT )
{
// 处理消息
if ( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
switch( s_windowState )
{
case WS_GETFOCUS:// 获得焦点
OnGetFocus( );
s_windowState = WS_NORMAL;
break;
case WS_NOMALIZED:// 恢复正常
OnNormalize( );
s_windowState = WS_NORMAL;
break;
case WS_NORMAL:// 正常渲染
OnPreRender( );// 渲染前动作
Render( );// 渲染
if ( !OnPostRender( ) )// 渲染之后的操作
{
OnPreReset( );
Reset( );
OnPostReset( );
}
break;
case WS_MINIMIZED:// 最小化
OnMinimized( );
WaitMessage( );// 为了解决最小化时CPU占用高的问题,设立这条语句,即只等待消息
break;
case WS_QUIT:// 退出
return 0;// 退出,同时所有线程也结束了
case WS_LOSTFOCUS:// 失去焦点
OnLostFocus( );
}
}
}
OnPreTerminate( );
Terminate( );
OnPostTerminate( );
return true;
}
bool CDXBasicApp::Reset( void ) // 重置
{
HRESULT hr;
hr = m_pDevice->Reset( &m_D3dpp );
ThrowIfFailed( hr, "糟糕了,我们怎样重置也无济于事,这该怎么办呢。\n看来只好找游戏的开发者了。" );
ShowWindow( m_hWnd, SW_SHOWDEFAULT );// 显示窗口
UpdateWindow( m_hWnd );// 更新窗口
return true;
}
bool CDXBasicApp::Terminate( void ) // 结束的函数
{
SAFE_RELEASE( m_pDevice );
SAFE_RELEASE( m_pD3D );
UnregisterClass( m_wndClass.lpszClassName, m_hInst );
return true;
}
/*-------------------------------------------------------------*/
bool CDXBasicApp::OnPreRender( void ) // 渲染之前的操作
{
m_pDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB( 30, 216, 7 ), 1.0f, 0);// 清除后台缓存
m_pDevice->BeginScene( );
return true;
}
bool CDXBasicApp::OnPostRender( void ) // 渲染之后的操作
{
HRESULT hr;
MSG msg;
m_pDevice->EndScene( );
m_pDevice->Present( NULL, NULL, NULL, NULL );// 显示
hr = m_pDevice->TestCooperativeLevel( );
if ( FAILED( hr ) )
{
ShowWindow( m_hWnd, SW_MINIMIZE );// 显示窗口
UpdateWindow( m_hWnd );// 更新窗口
while ( hr == D3DERR_DEVICELOST )
{
Sleep( 50 ); // 防止内存占用过高
PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE );
TranslateMessage( &msg );
DispatchMessage( &msg );
hr = m_pDevice->TestCooperativeLevel( );
}
if ( hr == D3DERR_DEVICENOTRESET ) return false;
else ThrowIfFailed( hr, "不可能啊。设备丢失了...我也不知道原因。不过系统是这么说的:" );
}
return true;
}
bool CDXBasicApp::OnLostFocus( void ) // 失去焦点的操作
{
m_pDevice->Present( NULL, NULL, NULL, NULL );// 显示
return true;
}
bool CDXBasicApp::OnMinimized( void ){ return true; } // 最小化的操作
bool CDXBasicApp::OnGetFocus( void ){ return true; } // 获得焦点的操作
bool CDXBasicApp::OnNormalize( void ){ return true; } // 最小化恢复操作
bool CDXBasicApp::OnPreInitialize( void ){ return true; } // 初始化之前的操作
bool CDXBasicApp::OnPostInitialize( void ){ return true; } // 初始化之后的操作
bool CDXBasicApp::OnPreReset( void ){ return true; } // 恢复设备之前的操作
bool CDXBasicApp::OnPostReset( void ){ return true
没有合适的资源?快使用搜索试试~ 我知道了~
Direct3D进行Alpha混合实现半透明效果

共20个文件
h:8个
cpp:7个
vcproj:1个


温馨提示
这次给大家奉献的是我最近学习DirectX基础的一些内容:进行Alpha混合。虽然我在很多的游戏中看到了美轮美奂的半透明效果,但是能够自己制作出半透明的效果还是一件非常欣慰的事情。因为这不仅仅是自己目的的达成,还是自己自学能力的提升。 Alpha是像素颜色中的一个值,但是改变它并不能改变任何颜色,而是改变它的透明度。它占一个字节,也就是说它的取值范围为从0到255。0代表完全看不见,255表示完全不透明。为此我记住了两个英文单词:transparent和opaque。为了能够使用Alpha制作出半透明的效果,要在D3D设备上调用一个函数来启用它。这个函数就是SetRenderState。下面就是启用Alpha混合的典型用法: [cpp] view plaincopy <pre name="code" class="cpp"> // 设置Alpha混合 m_pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); m_pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); m_pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
资源推荐
资源详情
资源评论























格式:zip 资源大小:1.1MB






收起资源包目录
























共 20 条
- 1
资源评论

- zl7356674942013-02-27文件不全唉- -
- Unkn0wName2013-02-11文件不全!!
- minglang_kun2013-10-17无法编译啊

彩阳
- 粉丝: 2173
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 基于PLC的电梯控制系统研究与方案设计书.doc
- 《网络安全》复习题.doc
- 互联网的企业信息交易平台的研究与研究与设计开发.doc
- 银行计算机网络风险的分析与对策.docx
- VB酒店服务管理完整.doc
- 科学大数据的发展态势及建议.docx
- 云计算时代网络安全现状与防御措施探讨.docx
- 在地铁5G网络建设过程中的规划需求分析.docx
- 区块链分布式记账应用会计记账领域探究.docx
- 《数据库课程设计方案》任务.doc
- 网络餐饮服务实施方案.doc
- 软件测试方案.docx
- 单片机技术课程研究设计报告(篮球计时计分器).doc
- 智慧城市建设PPP模式实践研究.docx
- 大数据技术在特高压变电站运维中的运用.docx
- 软件工程期末复习题(含标准答案).doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
