【发布时间】:2019-10-19 09:36:47
【问题描述】:
我正在使用 CControlBar 派生类,我想检测 CControlBar 的停靠状态何时发生变化(即,从垂直停靠到水平或进入浮动模式)。
当然,我可以处理 WM_SIZE,但每次触发 WM_SIZE 消息而不是仅在停靠状态发生变化时执行任务似乎是浪费资源。
谁能指点我正确的方向?
【问题讨论】:
我正在使用 CControlBar 派生类,我想检测 CControlBar 的停靠状态何时发生变化(即,从垂直停靠到水平或进入浮动模式)。
当然,我可以处理 WM_SIZE,但每次触发 WM_SIZE 消息而不是仅在停靠状态发生变化时执行任务似乎是浪费资源。
谁能指点我正确的方向?
【问题讨论】:
您可以覆盖CControlBar::OnBarStyleChange 虚函数以检测控制栏样式的变化(CBRS_XXX 值 - 查看<afxres.h> 头文件了解详细信息)。
要确定控制栏是否浮动/停靠,请检查CBRS_FLOATING 样式。要检查水平/垂直方向,请使用 CBRS_ORIENT_HORZ 和 CBRS_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
}
}
}
我希望这会有所帮助!
【讨论】: