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

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就可以实现锁定/解锁的功能了。
...全文
502 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
这是一个共享软件,除了可以在本站下载外,你还可以在http://dl.dbank.com/c0e431w4g9# 下载。其主要功能如下: 1、内置特等奖、一等奖~五等奖6个级别的奖项和1个自定义级别的奖项,抽奖顺序没有限制。 2、对于任意一等奖来说,可以一次抽取任意数量的奖项; 3、背景、解码用户可自行调整; 4、抽奖背景音乐用户可换; 5、可以在抽奖过程中显示中奖者的照片; 6、抽奖过程中可以显示用户所在的部门信息; 7、对于要求必须在场的抽奖,当中奖人不在场时可以做弃权处理; 8、抽奖结果立即存入Excel“抽奖结果”工作表中。 使用说明及注意事项   1、抽奖前请在Excel“工具”-“宏”-“安全性”中将宏的安全级别设置为低,然后关闭Excel重新打开,否则无法运行抽奖程序。 2、本程序支持六个固定级别的奖项设置和一个自定义的奖项设置。 3、抽奖顺序有两种,即先小奖后大奖或相反。这个设置仅用于初始化《抽奖》工作表中的奖项设置,抽奖过程中需手动在《抽奖》工作表中切 换抽奖级别。 4、本程序支持两种抽奖方法:每次抽取一组中的全部名额,或每次抽取指定的若干名额。但是推荐一次抽取1个,因为大余一个时只能显示最 后一名中奖者的照片,且显示众多中奖者的名字时布局不是很美观。 5、单项最多可设 5000 名中奖者,中奖者总数不能多于候选人数,否则在抽取最后一人时会出现死循环。 6、请在《候选名单》工作表中录入所有候选项。候选人仅受Excel行数限制,输入时请连续纵向输入,不留空行。 7、在《抽奖》工作表中点击“弃权”按钮时该组中奖的所有的人将被自动剔除,后面的抽奖中将不再参与抽奖。 8、当设置的奖项总数+弃权总数大于等于抽奖候选人总数时,程序将出现死循环。 9、抽奖一旦开始,请完成整个抽奖过程,不要中途退出程序或追加候选人名单。 10、本程序不支持重复中奖,中奖的人不计入下一轮抽奖中。     关于《抽奖》工作表的界面设置的几点说明: 1、修改《抽奖》工作表的界面时需要先解锁工作表。具体方法:“工具”-“保护”-“解锁工作表”。修改完后最好锁定工作表。 2、抽奖时可隐藏Excel航标、列表。具体方法:“工具”-“选项”-“视图”-“行号列号”,取消勾选前面的复选框。 3、在调整《抽奖》工作表时,不可插入、删除行或列。 4、一般地,修改《抽奖》工作表布局可以通过调整第一行的行高或第一列的列宽来实现。如果你要对控件进行详细布局设计(例如改变控件大 小),你可以通过控件设计模式来实现。具体方法:“视图”-“工具栏”-“退出设计模式”。 这时,你可以随意拖动按钮或照片控件的位 置及大小。调整完成后必须退出设计模式(将“退出设计模式”前面的勾取消掉)。系统的默认位置为D2单元格。 5、为满足多人抽奖的需要,《抽奖》工作表中的D5:D65536(即D列中从第5行到65535行)用来显示中奖者姓名。该列采用了条件格式,用特殊 的格式来显示中奖者的姓名。如果你需要更改这个样式,可在编辑工具栏(显示fx的那个工具栏)最左边的“名称框”中选择“ResultDisplay” 或输入D5:D65536并回车,这时这些单元格会被自动选上,然后从工具栏中的“格式”-“条件格式”中修改。 6、《抽奖》工作表中的下拉列表根据设置自动生成,请不要更改其下拉列表的内容。 7、全屏显示。具体方法:“视图”-“全屏显示”。 8、更换背景。具体方法:“格式”-“工作表”-“背景”,选择你要的背景图片即可。 9、更换默认照片。具体方法:替换photo文件夹下面的“none.jpg”这个图片文件即可。 10、若要在抽奖过程中显示中奖者的照片,则需把抽奖人的照片放到photo文件夹下面,同时在《候选名单》工作表的C列给出照片名。 11、若要更改在抽奖过程中播放的声音,可以替换Music文件夹下面的start.wav、finish.wav文件。

15,980

社区成员

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

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