Duilib学习笔记《04》— 窗体显示

简介:

在前面已经了解了duilib控件以及界面布局相关内容,接下来就要考虑该如何将xml中描述的布局通过界面展现出来。实际上在 Duilib学习笔记《01》 中我们已经简单提到过基本的流程及元素创建机制。这里我们直接用 Duilib学习笔记《03》最后提供的代码,下面我们就具体来说明:


一. duilib调用设置

1 #include "..\DuiLib\UIlib.h"
2 using namespace DuiLib;
3 #ifdef _DEBUG
4 #   ifdef _UNICODE
5 #       pragma comment(lib, "..\\bin\\DuiLib_ud.lib")
6 #   else
7 #       pragma comment(lib, "..\\bin\\DuiLib_d.lib")
8 #   endif
9 #else
10 #   ifdef _UNICODE
11 #       pragma comment(lib, "..\\bin\\DuiLib_u.lib")
12 #   else
13 #       pragma comment(lib, "..\\bin\\DuiLib.lib")
14 #   endif
15 #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:

1 LRESULT CMainWndDlg::OnCreate( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled )
2 {
3     m_PaintManager.Init(m_hWnd);    // 窗口类与窗口句柄关联
4     CDialogBuilder builder;
5     CControlUI* pRoot = builder.Create(_T("DemoSkin.xml"), (UINT)0, NULL, &m_PaintManager);  // 核心:加载XML并动态创建界面元素
6     ASSERT(pRoot && "Failed to parse XML");
7     m_PaintManager.AttachDialog(pRoot);    // 附加控件数据到HASH表中
8     return 0;
9 }

在窗体类的OnCreate函数中加载窗体对应的XML布局文件并动态创建界面元素。


三. 入口函数——初始化并创建显示窗口类

1 int APIENTRY _tWinMain(HINSTANCE hInstance,
2                        HINSTANCE hPrevInstance,
3                        LPTSTR    lpCmdLine,
4                        int       nCmdShow)
5 {
6     CPaintManagerUI::SetInstance(hInstance);    // 实例句柄与渲染类关联
7     CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath()); // 指定资源路径
8  
9     HRESULT Hr = ::CoInitialize(NULL);    // 初始化COM库, 为加载COM库提供支持
10     if( FAILED(Hr) ) return 0;
11  
12     CMainWndDlg* pMainDlg = new CMainWndDlg();    // 创建窗口类
13     pMainDlg->Create(NULL, _T("Demo窗体"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);      // 注册窗口类与创建窗口
14     pMainDlg->CenterWindow();    // 窗口居中显示
15     pMainDlg->ShowModal();
16     CPaintManagerUI::MessageLoop();    // 处理消息循环
17     ::CoUninitialize(); // 退出程序并释放COM库
18  
19     return 0;
20 }

在入口函数中设置相关初始化,然后创建窗口,这样一来,编译运行即可显示对应的窗口。


四. 额外说明:XML加载

:这里知识粗略提一下,具体的在Duilib源码分析系列再具体说明)

实际上,经过上述操作后就已经可以显示出界面效果了。但这里,对第二步中关于XML文件的加载额外补充说明一下。

CPaintManagerUI::窗口消息及图形绘制管理器类。
CDialogBuilder: 创建控件类,分析脚本并用递归方式(_Parse函数)创建所有控件实例。

在m_pm.AttachDialog操作中,duilib中内部处理:

-> InitControls (初始化控件)-> FindControl-> __FindControlFromNameHash->pManager->m_mNameHash.Insert(把控件插入到Hash中)

至此,界面已经可以显示出来了,而如何进行事件处理、消息响应呢?在 Duilib学习笔记《05》中再具体说明…

目录
相关文章
|
C#
C# WPF 一直保持多个Topmost窗体的置顶顺序
原文:C# WPF 一直保持多个Topmost窗体的置顶顺序 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37862405/article/details/80915523   参考自:https://blog.csdn.net/okkk/article/details/44118469   需求:多个窗体的Topmost都设置为true时候,还需要控制它们的置顶顺序。
2957 0
|
C# 编解码
WPF C# 多屏情况下,实现窗体显示到指定的屏幕内
原文:WPF C# 多屏情况下,实现窗体显示到指定的屏幕内 针对于一个程序,需要在两个显示屏上显示不同的窗体,(亦或N个显示屏N个窗体),可以使用如下的方式实现。
5016 0
C#编程学习19:mdi窗体中子窗体不能重复打开的三种实现方式
C#编程学习19:mdi窗体中子窗体不能重复打开的三种实现方式
C#编程学习19:mdi窗体中子窗体不能重复打开的三种实现方式
|
C#
WPF之托盘图标的设定
原文:WPF之托盘图标的设定 首先需要在项目中引用System.Windows.Forms,System.Drawing; using System; using System.Collections.
1396 0
|
C# 项目管理
WPF 窗体基类实现的体验及实现回车到下一控件
原文:WPF 窗体基类实现的体验及实现回车到下一控件 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jsyhello/article/details/7216509 ...
1129 0
|
C#
WPF自定义控件第二 - 转盘按钮控件
原文:WPF自定义控件第二 - 转盘按钮控件 继之前那个控件,又做了一个原理差不多的控件。这个控件主要模仿百度贴吧WP版帖子浏览界面左下角那个弹出的按钮盘。希望对大家有帮助。 这个控件和之前的也差不多,为了不让大家白看,文章最后发干货。
1105 0

热门文章

最新文章