浅谈如何禁止拖动单文档和多文档上的工具栏呢?
思路1:首先我们想到的是查看MSDN中工具栏中的窗口属性中有无属性可是直接设置他的dwStyle就可以禁止了呢,发现没有。那么窗口属性WS_***呢,仔细查阅MSDN发现也没有。但是仔细查看工具栏的member function发现,他有个EnableDocking方法,我们注释代码中和EnableDocking相关的函数
// m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
// EnableDocking(CBRS_ALIGN_ANY);
// DockControlBar(&m_wndToolBar);
可以发现工具栏已经不能拖放了,我们的想要的效果也就实现了。
思路2:又没有第二种方法可以实现禁止拖动工具栏呢?当然是的。我们都知道Windows是基于消息机制架构的,无论是rong3级的应用程序还是内核驱动都是基于消息体制的,我们只要禁止工具栏传递WM_MOVE,WM_LBUTTONDOWM,WM_MOUSEMOVE消息,不就可以实现禁止拖动了吗?基于上面的思路,我们创建基于CToolBar的子类CToolBarEx,
同时在CToolBarEx子类中响应WM_MOVE,WM_LBUTTONDOWM,WM_MOUSEMOVE函数。同时注释CToolBar对上述消息的响应。具体代码如下
class CToolBarEx : public CToolBar
{
// Construction
public:
CToolBarEx();
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CToolBarEx)
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CToolBarEx();
// Generated message map functions
protected:
//{{AFX_MSG(CToolBarEx)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnMove(int x, int y);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CToolBarEx::CToolBarEx()
{
}
CToolBarEx::~CToolBarEx()
{
}
BEGIN_MESSAGE_MAP(CToolBarEx, CToolBar)
//{{AFX_MSG_MAP(CToolBarEx)
ON_WM_LBUTTONDOWN()
ON_WM_MOVE()
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/
// CToolBarEx message handlers
void CToolBarEx::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
// CToolBarCtrl::OnLButtonDown(nFlags, point);
}
void CToolBarEx::OnMove(int x, int y)
{
// CToolBarCtrl::OnMove(x, y);
// TODO: Add your message handler code here
}
void CToolBarEx::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
// CToolBarCtrl::OnMouseMove(nFlags, point);
}
编译运行可以发现,也是我们想要的结果。
我们还可以再想,有没有第三种方法可以实现禁止拖动工具栏呢?当然也是有的。在此我们不在举例,留给读者去实现吧
其实我们想实现一个功能,有很多思路可以实现,但前提是对MSDN和WINDOWS的机制十分了解才可以。