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


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


    一. duilib调用设置

    #include "..DuiLibUIlib.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)0, NULL, &m_PaintManager);  // 核心:加载XML并动态创建界面元素
        ASSERT(pRoot && "Failed to parse XML");
        m_PaintManager.AttachDialog(pRoot);    // 附加控件数据到HASH表中
        return 0;
    }

    在窗体类的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 0;
    
        CMainWndDlg* pMainDlg = new CMainWndDlg();    // 创建窗口类
        pMainDlg->Create(NULL, _T("Demo窗体"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);      // 注册窗口类与创建窗口 
        pMainDlg->CenterWindow();    // 窗口居中显示
        pMainDlg->ShowModal();
        CPaintManagerUI::MessageLoop();    // 处理消息循环
        ::CoUninitialize(); // 退出程序并释放COM库
    
        return 0;
    }

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

     

    四. 额外说明:XML加载

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

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

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

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

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

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

  • 相关阅读:
    CentOS Linux release 7.5.1804 (Core) OpenSSH8.0升级OpenSSH9.0
    几种常用的css动画效果(持续更新)
    php一行代码判断请求头http、https
    PHPer 请停下来好好想一想,你到底想要什么样的出路(下篇)(转)
    百度搜索url关键词获取乱码问题处理办法
    洛雪音乐App,一款开源免费的音乐神器(android)
    作为一名phper,php的运行模式,你真的了解吗??
    阅读App,一款完全免费开源电子书阅读神器(android)
    php检测域名是否被微信封禁,可以做监控
    jsdelivr.com挂了,免费的真的无风险吗?
  • 原文地址:https://www.cnblogs.com/MrYuan/p/4971999.html
Copyright © 2020-2023  润新知