检测CControlBar的对接状态何时发生变化

时间:2009-02-07 15:23:35

标签: winapi mfc docking

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

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

任何人都可以指出我正确的方向吗?

1 个答案:

答案 0 :(得分:3)

您可以覆盖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            
        }
    }
}

我希望这有帮助!