1

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

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

谁能指出我正确的方向?

4

1 回答 1

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            
        }
    }
}

我希望这有帮助!

于 2009-02-07T16:46:09.937 回答