VC 显示 隐藏 工具栏 状态栏

来源:互联网 发布:宝洁八大问 答案 知乎 编辑:程序博客网 时间:2024/05/21 09:04

显示或者隐藏工具栏和状态栏
 

这里讨论显示或者隐藏工具栏、状态栏的操作,以及工具栏、状态栏被显示/隐藏时,相关的两个菜单项ID_VIEW_STATUS_BAR、ID_VIEW_TOOLBAR的状态更新。这两个菜单命令及对应的状态更新命令是标准命令消息所包含的。MFC边框窗口实现了菜单命令消息的处理和菜单项状态的更新。

CFrameWnd提供了OnBarCheck来响应与ID_VIEW_STATUS_BAR、ID_VIEW_TOOLBAR菜单项对应的命令。

消息映射:

ON_COMMAND_EX(ID_VIEW_STATUS_BAR, OnBarCheck)

ON_COMMAND_EX(ID_VIEW_TOOLBAR, OnBarCheck)

这里,使用了扩展命令消息映射宏把ID_VIEW_STATUS_BAR和ID_VIEW_TOOLBAR命令映射给同一个函数OnBarCheck处理。

OnBarCheck函数的实现:

BOOL CFrameWnd::OnBarCheck(UINT nID)

{

ASSERT(ID_VIEW_STATUS_BAR == AFX_IDW_STATUS_BAR);

ASSERT(ID_VIEW_TOOLBAR == AFX_IDW_TOOLBAR);

 

//得到工具条或者状态条

CControlBar* pBar = GetControlBar(nID);

if (pBar != NULL)

{

//若控制条可见,则隐藏它;否则,显示它

ShowControlBar(pBar, (pBar->GetStyle() & WS_VISIBLE) == 0, FALSE);

//处理完毕

return TRUE;

}

//可以让下一个命令目标继续处理

return FALSE;

}

由于是扩展映射宏定义的消息处理函数,所以OnBarCheck函数有一个UINT类型的参数和一个BOOL返回值。

当用户从“View”菜单选择打了钩的“Toolbar”时,消息处理函数OnBarCheck被调用,参数就是菜单项的ID号ID_VIEW_TOOLBAR,它等于工具条的子窗口IDAFX_IDW_TOOLBAR。处理结果,工具条被隐藏;当再次选择该菜单项则工具条被显示。

处理状态条的过程类似于工具条的处理。

ShowControlBar是CFrameWnd的成员函数,参数1表示控制条对象指针,参数2表示显示(TRUE)或者隐藏(FALSE),参数3表示是立即显示(FALSE)或者延迟显示(TRUE)。

 

如果工具条或者状态条被隐藏,则相应的菜单项ID_VIEW_STATUS_BAR 或者ID_VIEW_TOOLBAR 变成uncheked(菜单项被标记为没有选择),否则,checked(菜单项被标记选择)。CFrameWnd实现了这两个菜单项的状态更新处理,列举其中一个如下:

声明处理ID_VIEW_TOOLBAR的状态更新消息:

ON_UPDATE_COMMAND_UI(ID_VIEW_TOOLBAR, OnUpdateControlBarMenu)

函数的实现:

void CFrameWnd::OnUpdateControlBarMenu(CCmdUI* pCmdUI)

{

ASSERT(ID_VIEW_STATUS_BAR ==

AFX_IDW_STATUS_BAR);

ASSERT(ID_VIEW_TOOLBAR == AFX_IDW_TOOLBAR);

 

CControlBar* pBar = GetControlBar(pCmdUI->m_nID);

//存在工具栏

if (pBar != NULL)

{

//工具条窗口被显示则checked,被隐藏则uncheked

pCmdUI->SetCheck((pBar->GetStyle() & WS_VISIBLE) != 0);

return;

}

pCmdUI->ContinueRouting();

}

GetControlBar是CFrameWnd的成员函数,用来返回边框窗口的指定ID的控制条对象(指定ID是控制条的子窗口ID)。

 

泊位和漂浮
 

工具条可以泊位在边框窗口的任一边(上、下、左、右),或者漂浮在屏幕上的任何地方。

 

实现泊位的方法
 

首先,边框窗口调用CFrameWnd::EnableDocking函数使控制条泊位在边框窗口中有效,指明在边框窗口的哪边接受泊位。如果想在任何边都可以泊位,则使用参数CBRS_ALIGN_ANY。

然后,工具条调用ControlBar::EnableDocking使泊位对工具条有效,如果在调用ControlBar::EnableDocking时指定的泊位目的边和边框窗口能够泊位的边不符合,那么工具条不能泊位,它将漂浮。

最后,边框窗口调用CFrameWnd::DockControlBar泊位工具条。

 

泊位后形成窗口层次关系
 

边框窗口、泊位条、工具条的包含关系如下:

边框窗口

泊位条1

工具条1

工具条2

泊位条2

边框窗口包含1到4个泊位条子窗口,每个泊位条包含若干个控制条子窗口。

 

泊位的实现
 

CFrameWnd::EnableDocking指定哪边接受泊位,则为泊位准备一个泊位条。泊位条用CDockBar描述,派生于CControlBar。如果指定任何边都可以泊位,则创建四个CDockBar对象和对应的HWND窗口。然后,调用ControlBar::EnableDocking在对应的泊位条内安置工具条。

MFC设计了CDockBar类和CFrameWnd的一些函数来实现泊位,具体代码实现在此不作详细讨论。

 

实现漂浮工具条的方法:
 

边框窗口调用FloatControlBar实现工具条的漂浮。

 

漂浮的实现:
 

首先,创建一个微型漂浮边框窗口,该边框窗口有一个泊位条。

然后,在微型边框窗口的泊位条内放置工具条。

MFC设计了微型边框类CMiniFrameWnd,在此基础上派生出微型泊位边框窗口类CMiniDockFrameWnd。CMiniDockFrameWnd增加了一个CDockBar类型成员变量m_wndDockBar,即泊位条。

在CMiniDockFrameWnd对象被创建时,创建泊位条m_wndDockBar。泊位条m_wndDockBar的父窗口如同CMiniDockFrameWnd的父窗口一样,是调用FloatControlBar的边框窗口,而不是微型泊位边框窗口。微型边框窗口和泊位条创建完成之后,调用ControlBar::DockControlBar泊位工具条在CMiniDockFrameWnd窗口。

文章出处:DIY部落(http://www.diybl.com/course/3_program/c++/cppjs/200834/102726_10.html)

原创粉丝点击