Duilib学习笔记《04》— 窗体显示
在前面已经了解了duilib控件以及界面布局相关内容,接下来就要考虑该如何将xml中描述的布局通过界面展现出来。实际上在 Duilib学习笔记《01》 中我们已经简单提到过基本的流程及元素创建机制。这里我们直接用 Duilib学习笔记《03》最后提供的代码,下面我们就具体来说明:
一. duilib调用设置
#include "..\DuiLib\UIlib.h"
using namespace DuiLib;
#ifdef _DEBUG
# ifdef _UNICODE
# pragma comment(lib, "..\\bin\\DuiLib_ud.lib")
# else
# pragma comment(lib, "..\\bin\\DuiLib_d.lib")
# endif
#else
# ifdef _UNICODE
# pragma comment(lib, "..\\bin\\DuiLib_u.lib")
# else
# pragma comment(lib, "..\\bin\\DuiLib.lib")
# endif
#endif
在工程中的stdafx.h头文件中添加上述代码。当然,也并不一定非要在stdafx.h文件中添加,根据自己工程的实际情况进行设置即可。
二. 窗体类
在duilib中,所有的窗口均继承自CWindowWnd类,在CWindowWnd类中由虚函数HandleMessage来处理Windows消息(如WM_CREATE、WM_SIZE等等),所以对于本例的窗体类,同样需要继承CWinowWnd,同时窗体类中需要重写虚函数HandleMessage用于Windows消息的处理。
而对于duilib,我们此时更关心是界面元素是如何创建显示出来的。实际上,在Create创建窗体类时会触发WM_CREATE消息,这个消息也就都由窗体类中的HandleMessage函数来处理,具体可查看示例代码窗体类中该函数。WM_CREATE消息对应的消息处理函数OnCreate:
LRESULT CMainWndDlg::OnCreate( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled )
{
m_PaintManager.Init(m_hWnd); // 窗口类与窗口句柄关联
CDialogBuilder builder;
CControlUI* pRoot = builder.Create(_T("DemoSkin.xml"), (UINT), NULL, &m_PaintManager); // 核心:加载XML并动态创建界面元素
ASSERT(pRoot && "Failed to parse XML");
m_PaintManager.AttachDialog(pRoot); // 附加控件数据到HASH表中
return ;
}
在窗体类的OnCreate函数中加载窗体对应的XML布局文件并动态创建界面元素。
三. 入口函数——初始化并创建显示窗口类
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
CPaintManagerUI::SetInstance(hInstance); // 实例句柄与渲染类关联
CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath()); // 指定资源路径 HRESULT Hr = ::CoInitialize(NULL); // 初始化COM库, 为加载COM库提供支持
if( FAILED(Hr) ) return ; CMainWndDlg* pMainDlg = new CMainWndDlg(); // 创建窗口类
pMainDlg->Create(NULL, _T("Demo窗体"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE); // 注册窗口类与创建窗口
pMainDlg->CenterWindow(); // 窗口居中显示
pMainDlg->ShowModal();
CPaintManagerUI::MessageLoop(); // 处理消息循环
::CoUninitialize(); // 退出程序并释放COM库 return ;
}
在入口函数中设置相关初始化,然后创建窗口,这样一来,编译运行即可显示对应的窗口。
四. 额外说明:XML加载
(注:这里知识粗略提一下,具体的在Duilib源码分析系列再具体说明)
实际上,经过上述操作后就已经可以显示出界面效果了。但这里,对第二步中关于XML文件的加载额外补充说明一下。
在m_pm.AttachDialog操作中,duilib中内部处理:
至此,界面已经可以显示出来了,而如何进行事件处理、消息响应呢?在Duilib学习笔记《05》中再具体说明…
Duilib学习笔记《04》— 窗体显示的更多相关文章
- Duilib学习笔记《06》— 窗体基类WindowImpBase
在前面的例子中我们发现,窗口都是继承CWindowWnd.INotifyUI,然后重载相关函数去实现.显然,我们发现窗口的创建流程实际上都是差不多的,主要只是在OnCreate加载的配置文件不同等等… ...
- Duilib学习笔记《05》— 消息响应处理
在Duilib学习笔记<04>中已经知道了如何将窗体显示出来,而如何处理窗体上的事件.消息呢? 一. 系统消息 窗体显示的时候我们就已经说了,窗体是继承CWindowWnd类的,对于窗体的 ...
- Duilib学习笔记《03》— 控件使用
在前面已经对duilib有个一个基本的了解,并且创建了简单的空白窗体.这仅仅只是一个开始,如何去创建一个绚丽多彩的界面呢?这就需要一些控件元素(按钮.文本框.列表框等等)来完善. 一. Duilib控 ...
- SaToken学习笔记-04
SaToken学习笔记-04 如果有问题,请点击:传送门 角色认证 在sa-token中,角色和权限可以独立验证 // 当前账号是否含有指定角色标识, 返回true或false StpUtil.has ...
- Redis:学习笔记-04
Redis:学习笔记-04 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 10. Redis主从复制 1 ...
- DuiLib学习笔记(二) 扩展CScrollbar属性
DuiLib学习笔记(二) 扩展CScrollbar属性 Duilib的滚动条滑块默认最小值为滚动条的高度(HScrollbar)或者宽度(VScrollbar).并且这个值默认为16.当采用系统样式 ...
- 机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes)
机器学习实战(Machine Learning in Action)学习笔记————04.朴素贝叶斯分类(bayes) 关键字:朴素贝叶斯.python.源码解析作者:米仓山下时间:2018-10-2 ...
- python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍
python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍 IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列.pycharm免费社区版.Su ...
- OpenCV 学习笔记 04 深度估计与分割——GrabCut算法与分水岭算法
1 使用普通摄像头进行深度估计 1.1 深度估计原理 这里会用到几何学中的极几何(Epipolar Geometry),它属于立体视觉(stereo vision)几何学,立体视觉是计算机视觉的一个分 ...
随机推荐
- 黄聪:Discuz X2.5、3.0、3.1、3.2 如何不用插件实现用户名只允许中文注册
1.在后台--注册与访问--注册链接文字,把“注册”改为“中文注册”或“注册(请使用中文注册)”等 2.后台UCenter管理中心---注册设置---禁止的用户名: *q* *w* *e* * ...
- MySql5.6 Window超详细安装教程
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 目录 一.安装包准备二.开始安装三.验证安装四.客户端工具 一.安装包准备 1.下载MySql ...
- 0814JavaScript简介、基本语法、运算符、转换
一.JavaScript简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系,Java是Sun公司 ...
- VMware和CentOS7安装和配置
准备工作: 下载: 1.VMware-workstation-full-10.0.0-1295980 2.CentOS-7-x86_64-DVD-1511.iso 安装: 1.VMware-works ...
- 转-WebView loadData与loadDataWithBaseURL用法、区别
近期用到WebView加载一些动态的内容的时候遇到一些问题,例如:在加载动态网页时,页面有很多样式表包含一些特殊字符,导致WebView无法识别产生加载异常,程序直接崩溃:另外一个就是加载的网页中有图 ...
- 转载__Java内部类
内部类是指在一个外部类的内部再定义一个类.内部类作为外部类的一个成员,并且依附于外部类而存在的.内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权 ...
- Java注解实践--annotation学习三
注解对代码的语意没有直接影响, 他们只负责提供信息给相关的程序使用. 注解永远不会改变被注解代码的含义, 但可以通过工具对被注解的代码进行特殊处理. JDK 基本Annotation 注解 说明 @O ...
- WCF z
终结点与服务寄宿 由于最近可能要使用WCF做开发,开始重读蒋金楠的<WCF全面解析>,并整理个人学习WCF的笔记. 蒋金楠的书是我的第一本WCF入门书,虽说硬着头皮啃下来了,但是原理内容太 ...
- Java序列化,serializable
Java 串行化技术可以使你将一个对象的状态写入一个Byte 流里,并且可以从其它地方把该Byte 流里的数据读出来,重新构造一个相同的对象.这种机制允许你将对象通过网络进行传播,并可以随时把对象持久 ...
- C++学习22 多态的概念及前提条件
在<C++基类和派生类的赋值>一节中讲到,基类的指针也可以指向派生类对象.请看下面的例子: #include <iostream> using namespace std; c ...