HGE引擎适用于MFC的修改
打开hge181/src/core/system.cpp
找到System_Initiate()函数,可以看见里面有段代码是用于创建窗口。
// Register window class winclass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW; winclass.lpfnWndProc = WindowProc; winclass.cbClsExtra = 0; winclass.cbWndExtra = 0; winclass.hInstance = hInstance; winclass.hCursor = LoadCursor(NULL, IDC_ARROW); winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); winclass.lpszMenuName = NULL; winclass.lpszClassName = WINDOW_CLASS_NAME; if(szIcon) winclass.hIcon = LoadIcon(hInstance, szIcon); else winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); if (!RegisterClass(&winclass)) { _PostError("Can't register window class"); return false; } // Create window width=nScreenWidth + GetSystemMetrics(SM_CXFIXEDFRAME)*2; height=nScreenHeight + GetSystemMetrics(SM_CYFIXEDFRAME)*2 + GetSystemMetrics(SM_CYCAPTION); rectW.left=(GetSystemMetrics(SM_CXSCREEN)-width)/2; rectW.top=(GetSystemMetrics(SM_CYSCREEN)-height)/2; rectW.right=rectW.left+width; rectW.bottom=rectW.top+height; styleW=WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_VISIBLE; //WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX; rectFS.left=0; rectFS.top=0; rectFS.right=nScreenWidth; rectFS.bottom=nScreenHeight; styleFS=WS_POPUP|WS_VISIBLE; //WS_POPUP if(hwndParent) { rectW.left=0; rectW.top=0; rectW.right=nScreenWidth; rectW.bottom=nScreenHeight; styleW=WS_CHILD|WS_VISIBLE; bWindowed=true; } if(bWindowed) hwnd = CreateWindowEx(0, WINDOW_CLASS_NAME, szWinTitle, styleW, rectW.left, rectW.top, rectW.right-rectW.left, rectW.bottom-rectW.top, hwndParent, NULL, hInstance, NULL); else hwnd = CreateWindowEx(WS_EX_TOPMOST, WINDOW_CLASS_NAME, szWinTitle, styleFS, 0, 0, 0, 0, NULL, NULL, hInstance, NULL); if (!hwnd) { _PostError("Can't create window"); return false; } ShowWindow(hwnd, SW_SHOW);shi
这段代码是创建窗口。
但因为我们是创建基于MFC窗口消息的图形,其窗口创建MFC已经帮其做好了。所以需要将其删除。
再找到SystemSetStatusHwnd函数,修改代码:
void CALL HGE_Impl::System_SetStateHwnd(hgeHwndState state, HWND value) { switch(state) { case HGE_HWND: if(!hwnd) hwnd = value; break; case HGE_HWNDPARENT: if(!hwnd) hwndParent=value; break; } }
这样做是方便我们设置渲染的窗口。比如对话框之类的。
接下来在HGE_IMP.H文件中定义成员
RECT flipSrcRect; RECT flipDstRect;
并将其初始化为0.
打开hge181/src/core/graphics.cpp文件修改Gfx_EndScene函数修改代码如下:
void CALL HGE_Impl::Gfx_EndScene(bool use_fliRect /*= 0*/) { _render_batch(true); pD3DDevice->EndScene(); if(!pCurTarget) { if (!use_fliRect) { pD3DDevice->Present( NULL, NULL, NULL, NULL ); return; } pD3DDevice->Present(&flipSrcRect, &flipDstRect, NULL,NULL); } }
修改_GfxInit()在 pD3D=Direct3DCreate8(120); // D3D_SDK_VERSION这句代码前面添加如下代码:
if( bWindowed ) { int width=nScreenWidth + GetSystemMetrics(SM_CXFIXEDFRAME)*2; int height=nScreenHeight + GetSystemMetrics(SM_CYFIXEDFRAME)*2 + GetSystemMetrics(SM_CYCAPTION); rectW.left=(GetSystemMetrics(SM_CXSCREEN)-width)/2; rectW.top=(GetSystemMetrics(SM_CYSCREEN)-height)/2; rectW.right=rectW.left+width; rectW.bottom=rectW.top+height; if(!hwnd) { _PostError("hwnd is NULL"); return false; } styleW=GetWindowLong(hwnd,GWL_STYLE); } else { rectFS.left=0; rectFS.top=0; rectFS.right=nScreenWidth; rectFS.bottom=nScreenHeight; styleFS = WS_POPUP|WS_VISIBLE; }
rectW和rectFS顾名思义分别设置渲染子窗口区域,渲染整个屏幕区域。
并添加一个接口
void CALL HGE_Impl::Gfx_SetFlipRect(int top, int left, int right, int bottom) { flipSrcRect.top = top; flipSrcRect.left = left; flipSrcRect.right =right; flipSrcRect.bottom = bottom; flipDstRect.top = top; flipDstRect.left = left; flipDstRect.right =right; flipDstRect.bottom = bottom; }
这几句代码的作用是为了兼容MFC绘制模式。我们在这里的pD3DDevice->Present(&flipSrcRect, &flipDstRect, NULL,NULL);函数的作用是为了绘制到指定的我们的渲染区域。
调用过程如下。创建对话框,在初始化对话框上面初始化Render
具体代码如下:
CRect rect; HWND hwnd = GetDlgItem(IDC_STATIC_RENDER)->GetSafeHwnd(); GetDlgItem(IDC_STATIC_RENDER)->GetClientRect(&rect); hge = hgeCreate(HGE_VERSION); hge->System_SetState(HGE_SCREENWIDTH, rect.Width()); hge->System_SetState(HGE_SCREENHEIGHT, rect.Height()); hge->System_SetState(HGE_WINDOWED, true); //hge->System_SetState(HGE_HWNDPARENT, GetSafeHwnd()); hge->System_SetState(HGE_HWND,hwnd); hge->System_SetState(HGE_FRAMEFUNC, FrameFunc); hge->System_SetState(HGE_FPS,60); hge->System_SetState(HGE_DONTSUSPEND, true); hge->System_SetState(HGE_TEXTUREFILTER, false); hge->System_SetState(HGE_SCREENBPP, 32); hge->System_SetState(HGE_LOGFILE, "log.txt"); hge->System_Initiate(); hge->Gfx_SetFlipRect(25, 25, rect.Width()-50, rect.Height()-50); m_htexture = hge->Texture_Load("minimap.dds"); m_pic = new hgeSprite(hge, m_htexture);//这里的接口稍稍做一点变动,涉及到后面四个参数的操作可以屏蔽掉 //因为这步就可以重新设置图片大小 m_pic->SetTextureRect( 0, 0, hge->Texture_GetWidth(m_htexture), hge->Texture_GetHeight(m_htexture) );
后面创建图片并具体渲染,我们可以模仿hgeSprite这种方式创建。然后在OnTimer里面进行渲染。
void CDxTestDlg::OnPaint() { /// render to target m_render->Gfx_Clear(0); m_render->Gfx_BeginScene(); m_pic->RenderEx(100, 100, 0.0f, 0.5, 0.5); m_render->Gfx_EndScene(true); }
HGE引擎适用于MFC的修改相关推荐
- hge引擎配置登录器教程_Hge引擎程序+登录器配置器+配套工具+全套入门教程
关于HGE引擎版本优化的相关建议 很多人经常说:我和别人是一样的版本,为什么我的游戏卡,他的游戏不卡,是不是你们引擎不行?其实道理很简单.抛开服务器质量的缘故,以及引擎自身的不足,版本导致的游戏卡占了 ...
- C++多小球非对心弹性碰撞(HGE引擎)
程序是一个月前完成的,之前一直没正儿八经的来整理下这个程序,感觉比较简单,不过即使简单的东西也要跟大家分享下. 源码下载:http://download.csdn.net/detail/y851716 ...
- HGE引擎写的俄罗斯方块程序(附vc源码)[r]
使用HGE引擎写了个俄罗斯方块游戏,for study 执行文件 源代码 运行效果图 PS: 开源!!! 转载于:https://www.cnblogs.com/dotLive/archive/200 ...
- MySQL 查询数据库和表在使用的引擎和编码并修改使用引擎和编码
一,MySQL的引擎问题 Mysql数据库引擎 Mysql常见的三中存储引擎为InnoDB.MyISAM.MEMORY.其区别提现在事物安全.存储限制.空间使用.插入数据的速度和对外键的支持上,具体如 ...
- HGE引擎的粒子系统
这次的HGE系列让我们一起来学习一下HGE引擎的粒子系统部分,对于粒子系统不甚了解的朋友可以从这里开始了解. 首先还是让我们从头文件开始: 类名 :hgeParticle 功能 :单个粒子的属性结构 ...
- mysql alter engine_MySQL_mysql下修改engine引擎的方法,修改my.ini,在[mysqld]下加上 - phpStudy...
mysql下修改engine引擎的方法 修改my.ini,在[mysqld]下加上 default-storage-engine=INNODB 其中红色字体部分是要指定的引擎名称. 用sql语句修改已 ...
- mysql改存储引擎教程_MySQL中修改数据表存储引擎的三种方法
第一种方法:ALTER TABLE 将表从一个引擎修改为另一个引擎最简单的办法是使用ALTER TABLE语句,转换表的存储引擎会导致失去原引擎相关的所有特性. 例:将mytable的引擎修改为Inn ...
- MFC中修改程序图标
在使用MFC时,我们经常需要修改我们得到的exe文件的图标.如:写一个随机画圆的小程序,我们就希望该程序的图标是个圆或者是和圆有关的图标.所以,在这里我就记录一下我修改图标的步骤. 顺便提一下,我使用 ...
- mysql修改存储引擎报错_修改mysql存储引擎备份数据库报错及解决方案
备份数据库报错 原因:由于监控服务器最近cpu负载比较高.(cpu4核心,负载2.7左右)感觉很奇怪,因为别的服务器mysql占用的资源并不多,因此我首先优化了数据库的配置文件.cpu稍微下降了一点, ...
最新文章
- 数据团队做什么,看这篇就够了!
- [置顶] Codeforces Round #190 (Div. 2)(完全)
- jq 浏览器窗口大小发生变化时
- 对产品经理而言,有一种灾难叫“老板说”
- mysql安装报错 1130_关于Linux编译安装会无法远程登录,报错:1130-host ... is not allowed to connect to this MySql server...
- python - 定时拍照并发送到qq
- JdbcTemplate和NamedParameterJdbcTemplate
- python123第七章_Python入门第7/10页
- Worktile协同特色之二:任务看板管理
- 【原译】什么是TCHAR,WCHAR,LPSTR,LPWSTR,LPCTSTR.等等
- 简述java中类的构造方法_Java中类的构造方法
- 服务器2003系统序列号,Windows Server 2003 R2 With Sp2 序列号
- “莫兰迪色系” 高级灰
- Windows自动更新呈灰色点不了,电脑会自动更新的解决方案
- SpringBoot无法引入@RunWith注解解决方法
- 由DatePicket和TimePicker扩展延伸其他控件
- Navicat mysql 数据库备份和使用,备份以后是nb3文件
- GLES2.0中文API-glCompressedTexImage2D
- 【源码解读】BertLayer
- 15条建议,把技术成果写成一篇高质量学术论文