65.9K
CodeProject 正在变化。 阅读更多。
Home

用于同步多个窗口的活动状态的类。

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2002年3月11日

2分钟阅读

viewsIcon

44740

downloadIcon

526

用于同步多个窗口的活动状态的类。


  • 下载演示和源代码 - 30 Kb

    引言

    通过本文中的 ISyncActiveImpl 类,您可以拥有与所有者窗口同步活动状态的窗口。

    已实现的功能

    • 可以与所有者窗口同步活动状态的窗口;
    • 当应用程序停用以及当所有者窗口最小化或隐藏时,自动隐藏的窗口;
    • 当所有者窗口禁用时,自动禁用的窗口。

    用法

    我将基于本文中包含的演示应用程序的源代码来举例说明。

    1. 在您的源代码文件中包含 ISyncActiveImpl.h 头文件。

    2. ISyncActiveImpl<> 派生您的类。

      class CMainDlg :
        public CDialogImpl<CMainDlg>
      , public ISyncActiveImpl<CMainDlg>
      , public CMessageFilter
    3. 在您的类构造函数中,确保使用适合您窗口类型的正确参数实例化 ISyncActiveImpl<> 类。

      例如,对于创建对话框或框架窗口

      CMainDlg()
        // this dialog does not sync the active state with
      
        // owner and it must be always visible.
      
        : ISyncActiveImpl<CMainDlg>(FALSE, TRUE)
        {
        }
      

      或者对于创建浮动或工具栏窗口

      CFloatingWindow()
        // this window will synchronize the active state with
      
        // owner and will automatically be hidden when owner
      
        // is hidden/minimized or when application looses the
      
        // active state.
      
        : ISyncActiveImpl<CFloatingWindow>(TRUE)
        {
        }
      
    4. 在您的类的消息映射中添加一个 CHAIN_MSG_MAP 宏。

      BEGIN_MSG_MAP(CMainDlg)
        CHAIN_MSG_MAP(ISyncActiveImpl<CMainDlg>)
        .
        .
        .
      END_MSG_MAP()

      注意:确保将其插入到消息映射的第一个条目中。这是必要的,因为 ISyncActiveImpl<> 类需要拦截一些常规消息(例如 WM_CREATE)。

    幕后

    同步窗口活动状态的关键在于 WM_NCACTIVATE 消息。通过处理或发送此消息,我们可以强制窗口以活动或非活动状态进行绘制。

    窗口的自动隐藏是通过处理 WM_ACTIVATEAPP 消息来实现的。

    另外两个需要处理的重要消息是 WM_ACTIVATEWM_SHOWWINDOW,您可以在源代码和 MSDN 中找到有关它们的信息。

    最后,我想说的是,在实现这个类时,我遇到了两个“奇怪”的激活问题,请在源代码中阅读所有相关信息。

    历史

    • 2002年3月11日
      • 首次公开版本。

    您有什么问题或意见吗?请联系

  • © . All rights reserved.