WEB开发网
开发学院软件开发VC MFC教程(13)-MFC工具条和状态栏(2) 阅读

MFC教程(13)-MFC工具条和状态栏(2)

 2007-10-04 20:11:26 来源:WEB开发网   
核心提示:禁止和允许在MFC下,工具条、状态条还有一个重要的特征,MFC教程(13)-MFC工具条和状态栏(2)(7),就是自动地根据条件禁止或者允许使用某个按钮、窗格等,在4.4.5节命令消息的处理中,而是留给各个派生类去实现,例如,曾详细讨论了其实现原理,现在

禁止和允许

在MFC下,工具条、状态条还有一个重要的特征,就是自动地根据条件禁止或者允许使用某个按钮、窗格等。在4.4.5节命令消息的处理中,曾详细讨论了其实现原理,现在,详细地分析所涉及函数是如何实现的。有关的消息处理函数和虚拟函数如下。

处理WM_INITIALUPDATE消息的OnInitialUpdate;

处理WM_IDLEUPDATECMDUI消息的OnIdleUpdateCmdUI;

虚拟函数OnUpdateCmdUI。

回顾5.3.3.5节,在边框窗口的创建之后,给所有的子窗口发送初始化消息,控制子窗口用OnInitialUpdate响应它,调用OnIdleUpdateCmdUI完成状态的初始化。

OnIdleUpdateCmdUI还在IDLE处理时进行状态的更新处理,它生成用于处理状态更新消息的命令目标pTarget,然后调用虚拟函数OnUpdateCmdUI(pTarget,…)来更新工具栏或者状态栏的状态。

CControlBar的子类都实现了自己的OnUpdateCmdUI函数,用该函数生成适当的CCmdUI对象state,然后调用CCmdUI的DoUpdate(pTarget,…)给pTarget所指对象发送状态更新消息。为了完成具体的状态更新,从CCmdUI派生出CToolCmdUI和CStatusCCmUI,它们实现了自己的Enable、SetCheck等等。

初始化控制窗口

CControlBar使用OnInitialUpdate消息处理函数初始化控制窗口的状态。

void CControlBar::OnInitialUpdate()
{
//在窗口显示之前,更新状态
OnIdleUpdateCmdUI(TRUE, 0L);
}

CControlBar实现了OnInitialUpdate函数,通过它来处理WM_INITIALUPDATE消息。各个子类不必覆盖该消息处理函数。

处理Idle消息更新工具条状态

CControlBar使用OnIdleUpdateCmdUI消息处理函数处理IDLE消息。

LRESULT CControlBar::OnIdleUpdateCmdUI(WPARAM wParam, LPARAM)
{
// handle delay hide/show
BOOL bVis = GetStyle() & WS_VISIBLE;
UINT swpFlags = 0;
if ((m_nStateFlags & delayHide) && bVis)
swpFlags = SWP_HIDEWINDOW;
else if ((m_nStateFlags & delayShow) && !bVis)
swpFlags = SWP_SHOWWINDOW;
m_nStateFlags &= ~(delayShow|delayHide);
if (swpFlags != 0)
{
SetWindowPos(NULL, 0, 0, 0, 0, swpFlags|
SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
}
// the style must be visible and if it is docked
// the dockbar style must also be visible
if ((GetStyle() & WS_VISIBLE) &&
(m_pDockBar == NULL || (m_pDockBar->GetStyle() & WS_VISIBLE)))
{
//得到父边框窗口,状态更新消息将发送给它
CFrameWnd* pTarget = (CFrameWnd*)GetOwner();
if (pTarget == NULL || !pTarget->IsFrameWnd())
pTarget = GetParentFrame();
if (pTarget != NULL)
OnUpdateCmdUI(pTarget, (BOOL)wParam);
}
return 0L;
}

OnIdleUpdateCmdUI或者在初始化时被OnInitialUpdate调用,或者作为消息处理函数来处理WM_IDLEUPDATECMDUI消息。

CControlBar实现了OnIdleUpdateCmdUI函数,把具体的用户界面更新动作委托给虚拟函数OnUpdateCmdUI完成。

由于各个用户界面的特殊性,所以CControlBar本身没有实现OnUpdateCmdUI,而是留给各个派生类去实现。例如,CToolBar覆盖了OnUpdateCmdUI,其实现如下:

上一页  2 3 4 5 6 7 8 9 10 11  下一页

Tags:MFC 教程 MFC

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接