MFC框架结构中,可以用ON_UPDATE_COMMAND_UI( id, memberFxn ) 宏指定菜单或工具条按钮等对应的状态设置函数 在memberFxn中通过传入的CCmdUI对象指针就可以设置菜单项, 工具钮的使用、禁用、标记等属性。 所有在memberFxn中指定条件的变化,都将实时的反映到界面上去。 其实现机理如下 一 工具条按钮的更新 由于工具条一直可见,故要实时更新,就得不断调用memberFxn检查更新条件 这是通过在CWinApp::OnIdle(),以及WM_IDLEUPDATECMDUI消息实现的. ①在程序空闲时,OnIdle将被调用 在其基类CWinThread 中的OnIdle() 将调用主窗口的消息处理函数处理WM_IDLEUPDATECMDUI消息, 同时给所有下级窗口发送WM_IDLEUPDATECMDUI消息。 ②框架窗口相应WM_IDLEUPDATECMDUI消息 void CMDIFrameWnd::OnIdleUpdateCmdUI() void CFrameWnd::OnIdleUpdateCmdUI() 需要时,将调用OnUpdateFrameMenu,更新菜单各项 ③各控制条,对话框接收到WM_IDLEUPDATECMDUI消息 调用CControlBar::OnIdleUpdateCmdUI()进行相应 在其中调用CControlBar::OnUpdateCmdUI进行更新 ④OnUpdateCmdUI是控制条类的虚函数,对不同的控制条将有不同实现方式 以工具条为例: 将针对其上各个按钮调用特定窗口的命令处理函数 首先看是否有对反射消息的处理 另外也支持自己处理 一般情况下将调用DoUpdate进行更新。 DoUpdate 将调用宿主窗口的OnCmdMsg进行处理 OnCmdMsg(m_nID, CN_UPDATE_COMMAND_UI, this, NULL); 其nCode参数为CN_UPDATE_COMMAND_UI,表示是界面更新,将调用ON_UPDATE_COMMAND_UI所制定的成员,同时工具条的信息通过 CmdUI传给处理函数。 最后工具条将调用UpdateDialogControls以更新其上的其他控制。 二 菜单的更新 ①再空闲时OnUpdateFrameMenu被调用,用来更新菜单。 过程大致与工具条更新类似。 ②将菜单被打开时,也作更新。 CFrameWnd::OnInitMenuPopup()中 其间将调用窗口的OnCmdMsg(m_nID, CN_UPDATE_COMMAND_UI, this, NULL); 对各菜单项进行更新。 三 其他 在窗口接到命令时,将试探性的调用命令的更新函数,测试命令是否被禁止了。 若该命令为激活状态,将交由OnCmdMsg处理。 (#) |
|