zoukankan      html  css  js  c++  java
  • 第十八篇:在SOUI中实现PreTranslateMessage

    在MFC中,通常可以通过重载CWnd::PreTranslateMessage这样一个虚函数来实现对一些窗口消息的预处理。多用于tooltip的显示控制。

    在SOUI中也实现了类似的机制。

    要在SOUI中实现PreTranslateMessage,我们首先需要实现一个接口:

        struct IMessageFilter
        {
            virtual BOOL PreTranslateMessage(MSG* pMsg) = 0;
        };
    

    可以看出,实现这个接口和在MFC中重载PreTranslateMessage是相同的道理。

    和MFC中只需要重载这个接口不同,在SOUI中,除了需要实现IMessageFilter外,还需要向当前的MessageLoop注册该IMessageFilter。

        class SOUI_EXP SMessageLoop
        {
        public:
            SArray<IMessageFilter*> m_aMsgFilter;
                    
            // Message filter operations
            BOOL AddMessageFilter(IMessageFilter* pMessageFilter);
    
            BOOL RemoveMessageFilter(IMessageFilter* pMessageFilter);
            //...
        };

    上面是SMessageLoop两个和IMessageFilter相关的方法。

    SMessageLoop::AddMessageFilter向当前的message loop注册一个IMessageFilter;
    SMessageLoop::RemoveMessageFilter则向当前的message loop注销一个IMessageFilter

    剩下的问题就是如何获得当前的MessageLoop了。

    在SHostWnd 或者SHostDialog中可以调用SHostWnd::GetMsgLoop()方法获得。

    在SWindow中,则可以调用SWindow::GetContainer()->GetMsgLoop()获得。

    使用示例可以参考SDropDownWnd的实现。

    class SOUI_EXP SDropDownWnd : public SHostWnd, public IMessageFilter
    {
    //...
    };
    

      

    
    
     
  • 相关阅读:
    Memcached基本架构和思想
    varnish和squid的对比
    常用排序讲解
    数据结构堆的一种比较明白的讲解
    磁盘挂载MOUNT 445问题集
    mysql 如何提高批量导入的速度
    云平台涅槃重生计划
    NumPy、SciPy 等Python包在Windows下的whl安装包下载
    表迁移工具的选型-复制ibd的方法
    下一步的技术研究方向
  • 原文地址:https://www.cnblogs.com/setoutsoft/p/4127333.html
Copyright © 2011-2022 走看看