【问题标题】:Detecting when a CControlBar's docking state has changed检测 CControlBar 的停靠状态何时发生变化
【发布时间】:2019-10-19 09:36:47
【问题描述】:

我正在使用 CControlBar 派生类,我想检测 CControlBar 的停靠状态何时发生变化(即,从垂直停靠到水平或进入浮动模式)。

当然,我可以处理 WM_SIZE,但每次触发 WM_SIZE 消息而不是仅在停靠状态发生变化时执行任务似乎是浪费资源。

谁能指点我正确的方向?

【问题讨论】:

    标签: winapi mfc docking


    【解决方案1】:

    您可以覆盖CControlBar::OnBarStyleChange 虚函数以检测控制栏样式的变化(CBRS_XXX 值 - 查看<afxres.h> 头文件了解详细信息)。

    要确定控制栏是否浮动/停靠,请检查CBRS_FLOATING 样式。要检查水平/垂直方向,请使用 CBRS_ORIENT_HORZCBRS_ORIENT_VERT 样式。

    所以,以CToolBar(派生自CControlBar)为例:

    class CMyToolBar : public CToolBar {
    public:
        virtual void OnBarStyleChange(DWORD dwOldStyle, DWORD dwNewStyle);
    };
    
    void CMyToolBar::OnBarStyleChange(DWORD dwOldStyle, DWORD dwNewStyle)
    {
        // Call base class implementation.
        CToolBar::OnBarStyleChange(dwOldStyle, dwNewStyle);
    
        // Use exclusive-or to detect changes in style bits.
        DWORD changed = dwOldStyle ^ dwNewStyle;
    
        if (changed & CBRS_FLOATING) {
            if (dwNewStyle & CBRS_FLOATING) {
                // ToolBar now floating
            }
            else {
                // ToolBar now docked
            }
        }
    
        if (changed & CBRS_ORIENT_ANY) {
            if (dwNewStyle & CBRS_ORIENT_HORZ) {
                // ToolBar now horizontal
            }
            else if (dwNewStyle & CBRS_ORIENT_VERT) {
                // ToolBar now vertical            
            }
        }
    }
    

    我希望这会有所帮助!

    【讨论】:

    • 这很有帮助!感谢您如此迅速地回答并举例说明——这太好了:-)
    猜你喜欢
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    相关资源
    最近更新 更多