如何实现锁定解锁工具栏的功能,顶者有分

DentistryDoctor 2004-08-23 08:36:11
我们可以用CFrameWnd的EnableDocking让控制栏可停靠,但我们在CFrameWnd中却找不到DisableDocking之类的函数来移除控制栏的可停靠特性。那我们如何实现IE和Explore那样的锁定/解锁工具栏的功能呢?
MFC中并没有锁定/解锁控制栏的实现代码,那我们可不可以根据CFrameWnd::EnableDocking/CControlBar::EnableDocking的实现代码来实现DisableDocking的功能呢?我们发现CFrameWnd::EnableDocking和CControlBar::EnableDocking的实现代码相当难懂,想通过这种方式就要求我们对MFC的很多内部机制实现了解得很清楚才行(dwDockBarMap是?),非常困难。有没有更简单的方法呢?
我们可以想到的办法就是当工具栏被锁定后拦截会引用拖动的所有鼠标事件?我们需要拦截什么鼠标事件呢?在CControlBar的实现中我们可以找到答案;
void CControlBar::OnLButtonDown(UINT nFlags, CPoint pt)
{
// only start dragging if clicked in "void" space
if (m_pDockBar != NULL && OnToolHitTest(pt, NULL) == -1)
{
// start the drag

}
else
{
CWnd::OnLButtonDown(nFlags, pt);
}
}

void CControlBar::OnLButtonDblClk(UINT nFlags, CPoint pt)
{
// only toggle docking if clicked in "void" space
if (m_pDockBar != NULL && OnToolHitTest(pt, NULL) == -1)
{
// start the drag

}
else
{
CWnd::OnLButtonDblClk(nFlags, pt);
}
}

可以看到当在WM_LBUTTONDOWN和WM_LBUTTONDBCLK事件中并且OnToolHitTest(pt, NULL) == -1的时候将开始拖动,如果我过滤这两个事件,并判断OnToolHitTest的结果就可以阻止控制栏的拖动了。下面给出以ToolBar为例的实现代码
//------------------------------------------------------------------------------
// File: LockToolBar.h
//
// Desc: A lockable/unlockable toolbar.
//
// Copyright (c) 2004 DentistryDoctor. All rights reserved.
//------------------------------------------------------------------------------
// CLockToolBar

class CLockToolBar : public CToolBar
{
DECLARE_DYNAMIC(CLockToolBar)

public:
CLockToolBar();
virtual ~CLockToolBar();
void SetLocked(BOOL bLocked=TRUE);
BOOL GetLocked() const
{
return m_bLocked;
}

protected:
DECLARE_MESSAGE_MAP()
virtual BOOL PreTranslateMessage(MSG* pMsg);
BOOL m_bLocked;
};

//------------------------------------------------------------------------------
// File: LockToolBar.cpp
//
// Desc: A lockable/unlockable toolbar.
//
// Copyright (c) 2004 DentistryDoctor. All rights reserved.
//------------------------------------------------------------------------------

#include "stdafx.h"
#include "LockToolBar.h"

// CLockToolBar

IMPLEMENT_DYNAMIC(CLockToolBar, CToolBar)
CLockToolBar::CLockToolBar() : m_bLocked(FALSE)
{
}

CLockToolBar::~CLockToolBar()
{
}

BEGIN_MESSAGE_MAP(CLockToolBar, CToolBar)
END_MESSAGE_MAP()

// CLockToolBar Message handle functions

/////////////////////////////////////////////////

void CLockToolBar::SetLocked(BOOL bLocked)
{
CFrameWnd* pFrame = GetParentFrame();
ASSERT(pFrame);

m_bLocked = bLocked;
DWORD dwStyle = GetBarStyle();
if (bLocked) {
pFrame->DockControlBar(this); // dock if not already
dwStyle &= ~CBRS_GRIPPER; // turn off gripper
} else {
dwStyle |= CBRS_GRIPPER;
}
SetBarStyle(dwStyle);
pFrame->RecalcLayout(); // make frame recalc toolbar sizes
}

BOOL CLockToolBar::PreTranslateMessage(MSG* pMsg)
{
UINT msg = pMsg->message;
LPARAM lp = pMsg->lParam;
if ((pMsg->hwnd==GetSafeHwnd() || CWnd::FromHandle(pMsg->hwnd)->GetParent()==this) && (msg==WM_LBUTTONDOWN || msg==WM_LBUTTONDBLCLK) && m_bLocked)
{
CPoint pt(lp);
if (OnToolHitTest(pt, NULL) == -1)
return TRUE;
}
return CToolBar::PreTranslateMessage(pMsg);
}

这样用CLockToolBar代替CToolBar就可以实现锁定/解锁的功能了。
...全文
504 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
junhuang09 2005-06-09
  • 打赏
  • 举报
回复
强, 顶一下
brytison 2005-01-29
  • 打赏
  • 举报
回复
mark
DentistryDoctor 2004-08-27
  • 打赏
  • 举报
回复
没人顶,我就结了。
狂放之歌 2004-08-24
  • 打赏
  • 举报
回复
顶了在看..


拔牙决不找你..呵呵
mdzhao 2004-08-24
  • 打赏
  • 举报
回复
关注
budongjiuwen 2004-08-24
  • 打赏
  • 举报
回复
up
DentistryDoctor 2004-08-24
  • 打赏
  • 举报
回复
大家先看看。有什么错误,欢迎提出来。
OriesMap 2004-08-24
  • 打赏
  • 举报
回复
老弟,狼多肉少呀!

我也来凑个热闹!顶一把!
crystal_heart 2004-08-24
  • 打赏
  • 举报
回复
up
HickMars 2004-08-23
  • 打赏
  • 举报
回复
顶分
gwinner 2004-08-23
  • 打赏
  • 举报
回复
狂顶
sanyou98 2004-08-23
  • 打赏
  • 举报
回复
up
tangshiping 2004-08-23
  • 打赏
  • 举报
回复
->我的收藏夹...........
DentistryDoctor 2004-08-23
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3296/3296255.xml?temp=.5684168
zhaogaojian 2004-08-23
  • 打赏
  • 举报
回复
学习
nineclock 2004-08-23
  • 打赏
  • 举报
回复
强烈支持。。。。。。。。。 up up up up up
1楼???
tangshiping 2004-08-23
  • 打赏
  • 举报
回复
楼上,说话太不专业了吧?不是特别懂啊
wjuu 2004-08-23
  • 打赏
  • 举报
回复
有没有会不会写发信软件的程序者 本公司征才中 如有意愿 请回信至speace222@yahoo.com.tw
月光莫利亚 2004-08-23
  • 打赏
  • 举报
回复
up

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧