zoukankan      html  css  js  c++  java
  • Duilib学习笔记《06》— 窗体基类WindowImpBase

    在前面的例子中我们发现,窗口都是继承CWindowWnd、INotifyUI,然后重载相关函数去实现。显然,我们发现窗口的创建流程实际上都是差不多的,主要只是在OnCreate加载的配置文件不同等等…所以,能不能创建一个公有的窗体基类呢?其实,在duilib中已经提供了一个窗体基类 WindowImplBase:在基类内搭建窗口的消息框架,各处理函数为虚函数,子类可以重载处理函数,实现其处理。

    此处我们以修改之前的代码为例来进行说明。


    1. 窗体显示

    CMainWndDlg类修改为继承WindowImpBase类:class CMainWndDlg : public WindowImplBase

    将之前的成员函数全部删除,添加如下函数(实际上是重载WindowImplBase中的函数)

    public:
        LPCTSTR GetWindowClassName() const;    
        virtual CDuiString GetSkinFile();
        virtual CDuiString GetSkinFolder();

    对应的函数实现:

    LPCTSTR CMainWndDlg::GetWindowClassName() const
    {
        return _T("UIMainWnd");
    }
    CDuiString CMainWndDlg::GetSkinFile()
    {
        return _T("DemoSkin.xml");
    }
    CDuiString  CMainWndDlg::GetSkinFolder()
    {
        return CDuiString(CPaintManagerUI::GetInstancePath());
    }

    这里,窗体Create创建时直接根据传递的窗口XML布局文件,调用父类的函数处理。这样一来,编译运行窗体就可以显示出来了。


    2. 消息处理

    对于每个窗体,具体的操作是不一样的,所以对应的控件消息等等还需要在对应的窗体中去自行处理。

    2.1)事件消息

    对于duilib自带的消息,其处理和Duilib学习笔记《05》中的处理是一样的,该部分基本没什么变化。只需要重装Notify,然后在实现中进行相关处理即可。(具体参见代码)

    2.2 ) 用户自定义消息

    在实际情况中,可能多个窗口之间传递用户自定义消息等情况,而对于用户自定义消息。我们需要在HandleCustomMessage中去处理。首先需要重载该函数:LRESULT HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);在函数实现中,根据具体的消息进行部分的分支处理:

    LRESULT CMainWndDlg::HandleCustomMessage( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled )
    {
        bHandled = TRUE;    // 消息本地处理,不流入系统处理。
        switch (uMsg)
        {
        default:
            bHandled = FALSE;    // 本地没有处理,流入系统处理。
        }
        return 0;
    }

    补充说明:

    1. duilib自带的提供的WindowImpBase当中可能存在部分问题,具体的后续会提到。根据时间情况的需要,可自行对WindowImpBase继续修改补充。参考代码:DuiLib通用窗口类WindowImpBase封装

    2. 附上本节对应的代码:代码下载

  • 相关阅读:
    数组的学习——有序数组中插入及删除数值的问题分析
    关于控制台输入年月,显示该月日历的问题分析
    关于控制台的输入,分支结构及循环的用法的一些总结
    坚持学习,坚持写博客,记录学习的点点滴滴,先从学习JAVA开始!
    Immutable Object模式
    Windows GIT SSH 免密教程
    腾讯云服务器购买
    Centos7系统中安装JDK、Tomcat、Mysql
    SonarQube使用教程
    UEditor使用说明
  • 原文地址:https://www.cnblogs.com/MrYuan/p/4972025.html
Copyright © 2011-2022 走看看