Play With MFC(1) 让工具栏“召之即来,挥之即去”

让工具栏“召之即来,挥之即去”


前言:
工具栏设计的目的就是为了使用方便;但是人的“懒欲”是无穷的:当我们在视图区工作的时候,要伸手去点工具栏往往都觉得那是“三万一英尺的距离”。于是,动态菜单成了大家的宠儿。
但它工具栏凭什么就不能像动态菜单一样“召之即来,挥之即去”??大家都是窗口,凭什么你一定要高高在上?!!因此,有了本文的戏耍工具栏。

方法:

1、首先,在主框架类CMainFrame类声明一个public的CToolBar:
public:
CToolBar m_wndToolBar;


2、在CMainFrame::OnCreate中创建它,并使之具有docking的功能 :
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;

if (!m_wndToolBar.Create(this) ||
!m_wndToolBar.LoadBitmap(IDR_MAINFRAME) ||
!m_wndToolBar.SetButtons(buttons,
sizeof(buttons)/sizeof(UINT) + 1))
{
TRACE0("Failed to create toolbar/n");
return -1; // fail to create
}

if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar/n");
return -1; // fail to create
}

// 使m_wndToolBar具有自动停靠的功能:
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);

return 0;
}


3. 在你的视图类里添加WM_RBUTTONDOWN的响应函数,并添加一个bool变量m_bMove(默认值为true)。
当 m_bMove 为true时,召唤工具栏到鼠标处; 当 m_bMove 为false时,让工具栏回去。
话不多说,看代码先,你会发觉其实很简单。

void CDynaMenuView::OnRButtonDown(UINT nFlags, CPoint point)
{

CMainFrame* pMainFrame = (CMainFrame*) AfxGetMainWnd();
CToolBar* pToolBar = & pMainFrame->m_wndToolBar;
CRect rect;
pToolBar->GetWindowRect(&rect);
if(m_bMove)
{
pToolBar->SetParent(NULL);
ClientToScreen(&point);
pToolBar->MoveWindow(point.x,point.y,rect.Width(),rect.Height(),TRUE);
m_bMove  =  false;
}
else
{
pToolBar->SetParent(pMainFrame);
//pMainFrame->DockControlBar(pToolBar);
pToolBar->MoveWindow(0,0,rect.Width(),rect.Height(),TRUE);
m_bMove  =  true;
}

CView::OnRButtonDown(nFlags, point);
}

后记:

我想把自己做的一些东西陆续写出来,名字暂时就叫《戏耍MFC系列》(Play With MFC)吧。为什么叫这个名字呢? 
因为我想用vc实现一些奇怪的想法,这样既可以使自己有创造力,而且在这个过程中可以熟练掌握MFC。
但,只怕没有那么多空闲的时间......哎!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值