前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >duilib基本流程

duilib基本流程

作者头像
Masimaro
发布2018-08-31 15:36:34
1.5K0
发布2018-08-31 15:36:34
举报

duilib的基本流程如上图,通过解析一个xml文件,将文件中的内容渲染为窗口界面,这个解析过程由WindowImplBase类来完成。 基本框架如下: 1. 首先在公共头文件中加入如下内容:

代码语言:javascript
复制
#include <objbase.h>
#include <DuiLib\UIlib.h>

using namespace DuiLib;

#ifdef _DEBUG
#pragma comment(lib, "DuiLib_ud.lib");
#else
#pragma comment(lib, "DuiLib_d.lib");
#endif

这个是duilib的一些基本配置 2. 从WindowImplBase类中派生一个类,然后实现这样3个基本函数:

代码语言:javascript
复制
virtual CDuiString GetSkinFolder() { return _T("skin"); };
    virtual CDuiString GetSkinFile()  { return _T("HelloWnd.xml"); };
    virtual LPCTSTR GetWindowClassName(void) const { return _T("HelloWnd"); };

这三个函数的说明如下: 1、 GetSkinFolder () 需要返回 皮肤XML 所在的文件夹

2、GetSkinFile () 需要返回 皮肤 XML 的文件名(也可以包含路径) 3、GetWindowClassName () 需要返回这个窗口的类名,这个类名用于 RegisterClass. 这三个函数告知duilib库应该从哪个文件夹下解析哪个xml文件,并定义对应窗口的名字,以后这个类就代表这个xml文件所描述的窗口 需要注意的是这些函数必须在头文件中这样写,我自己写在CPP文件中它在运行时报错,可能是库本身的bug 3. 在WinMain主函数中添加如下代码

代码语言:javascript
复制
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    CPaintManagerUI::SetInstance(hInstance);// 加载XML的时候,需要使用该句柄去定位EXE的路径,才能加载XML的路径
    CHelloWnd* wnd = new CHelloWnd; // 生成对象
    wnd->Create(NULL, NULL, UI_WNDSTYLE_DIALOG, 0); // 创建DLG窗口
    wnd->CenterWindow(); // 窗口居中
//  wnd->ShowWindow();//作为非模态对话框显示
    wnd->ShowModal(); // 显示
//  CPaintManagerUI::MessageLoop(); // 消息循环,是一个默认的消息循环,什么消息都不响应

    delete wnd; // 删除对象

    return 0;
}

在这创建了一个对话框,但是如果加上消息循环就表示它是一个非模态对话框,这个窗口我没有给它菜单栏,也就没有关闭按钮,如果作为非模态对话框,要加上一句CPaintManagerUI::MessageLoop();给它一个消息循环。但是它将不能关闭,只能通过任务管理器强制结束,使用ShowModal表示将它作为模态对话框,在win32中模态对话框使用它自己的消息循环,也就不需要自己给它一个消息循环,它可以在任务栏上被关闭。

类的Create函数定义如下:

代码语言:javascript
复制
HWND Create(HWND hwndParent, LPCTSTR pstrName, DWORD dwStyle, DWORD dwExStyle, int x = CW_USEDEFAULT, int y = CW_USEDEFAULT, int cx = CW_USEDEFAULT, int cy = CW_USEDEFAULT, HMENU hMenu = NULL);

可以看到它就是对WIN32中CreateWindow的封装,在这duilib为窗口自定义了一些类型,其中主要的类型如下:

代码语言:javascript
复制
#define UI_WNDSTYLE_CONTAINER  (0)
#define UI_WNDSTYLE_FRAME      (WS_VISIBLE | WS_OVERLAPPEDWINDOW)
#define UI_WNDSTYLE_CHILD      (WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN)
#define UI_WNDSTYLE_DIALOG     (WS_VISIBLE | WS_POPUPWINDOW | WS_CAPTION | WS_DLGFRAME | WS_CLIPSIBLINGS | WS_CLIPCHILDREN)

//下面是窗口的扩展类型
#define UI_WNDSTYLE_EX_FRAME   (WS_EX_WINDOWEDGE)
#define UI_WNDSTYLE_EX_DIALOG  (WS_EX_TOOLWINDOW | WS_EX_DLGMODALFRAME)
//下面是窗口类类型
#define UI_CLASSSTYLE_CONTAINER  (0)
#define UI_CLASSSTYLE_FRAME      (CS_VREDRAW | CS_HREDRAW)
#define UI_CLASSSTYLE_CHILD      (CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS | CS_SAVEBITS)
#define UI_CLASSSTYLE_DIALOG     (CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS | CS_SAVEBITS)

大部分都是对win32中窗口类型的一个组合。如果熟悉WIN32编程,那么很容易知道这些都代表什么

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-10-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档