您当前的位置: 首页 >  ui

插件开发

暂无认证

  • 1浏览

    0关注

    492博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

第一章 第四小节Duilib的WindowImplBase基类(四)-四个接口

插件开发 发布时间:2022-03-23 12:37:35 ,浏览量:1

文章目录
    • 1.四个接口
    • 2.作者答疑

1.四个接口

  在面向对象的世界里,接口规范了类实现的功能,WindowImplBase基类在本小节开始的时候,就已经知道需要实现四个接口,分别是INotifyUI、 IMessageFilterUI、 IDialogBuilderCallback和IQueryControlText四个接口。如下所示:

    // Listener interface
    class INotifyUI
    {
    public:
        virtual void Notify(TNotifyUI& msg) = 0;
    };

  必须要实现这个消息通知函数。

    // MessageFilter interface
    class IMessageFilterUI
    {
    public:
        virtual LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled) = 0;
    };

  必须要实现这个消息过滤函数。

    class IDialogBuilderCallback
    {
    public:
        virtual CControlUI* CreateControl(LPCTSTR pstrClass) = 0;
    };

  创建控件函数。

    // 控件文字查询接口
    class UILIB_API IQueryControlText
    {
    public:
        virtual LPCTSTR QueryControlText(LPCTSTR lpstrId, LPCTSTR lpstrType) = 0;
    };

  查询文件接口。在C++里,接口的类的使用应该需要有一定的了解。接下来分析在WindowImplBase基类中相应的实现。首先INotifyUI这个接口在上一小节讲解CNotifyPump时,已经提到过,是消息分发的进入点。如下所示:

    void WindowImplBase::Notify(TNotifyUI& msg)
    {
        if (msg.sType == _T("windowinit"))
        {
            OnPrepare();
            return;
        }
        return CNotifyPump::NotifyPump(msg);
    }

  接着是消息过滤函数,如果大家对win32的效果流程有些了解,这个函数在消息循环消息处理之前被调用,如下所示:

    LRESULT WindowImplBase::MessageHandler(UINT uMsg, WPARAM wParam, LPARAM /*lParam*/, bool& /*bHandled*/)
    {
        if (uMsg == WM_KEYDOWN)
        {
            switch (wParam)
            {
            case VK_RETURN:
            case VK_ESCAPE:
                return ResponseDefaultKeyEvent(wParam);
            default:
                break;
            }
        }
        return FALSE;
    }

  接下来是创建控件函数,如下所示:

    CControlUI* WindowImplBase::CreateControl(LPCTSTR pstrClass)
    {
        return NULL;//没有什么操作
    }

  接下来是查询文本的实现,如下所示:

    LPCTSTR WindowImplBase::QueryControlText(LPCTSTR lpstrId, LPCTSTR lpstrType)
    {
        return NULL;//没有什么操作
    }

  综上所述,接口最重要的还是前面两个接口,与消息传递有关。

2.作者答疑

  如有疑问,请留言。

关注
打赏
1665481431
查看更多评论
立即登录/注册

微信扫码登录

0.0373s