会员
周边
众包
新闻
博问
闪存
赞助商
所有博客
当前博客
我的博客
我的园子
账号设置
简洁模式
...
退出登录
注册
登录
笨鸟先飞
两颗番茄去逛街,第一颗番茄突然走的很快,第二颗番茄就问:我们要去哪里啊?第一颗番茄没回答,所以第二颗番茄又问了一次。第一颗又番茄没回答,所以第二颗番茄又再问了一次。第一颗番茄终于慢慢转头说:我们不是番茄吗,我们会讲话吗?
博客园
首页
新随笔
联系
订阅
管理
更新UI对象
/*
更新UI对象
常规情况下,菜单和工具栏按钮可以有多种状态。例如,菜单不可用时可以置灰,菜单
正在被使用时可以设定为选中状态。同样工具栏也有这些状态。
谁来更新这些可变状态项的状态?从逻辑上讲,如果一个菜单项产生了一个命令消息,
此消息会被文档处理,那么由文档去更新可变状态项的状态更有意义,文档中应该包括
可变状态项的状态信息。
如果一个命令对应多个UI对象,比如一个菜单项和一个工具栏项,那么这两处的发出的
命令将会被路由到同一个处理函数。这样就会在一处为多个同等的UI对象封装一份
UI更新代码。
编程框架提供了一个自动更新UI对象的快捷方法,你可以选择自己的更新方法,但框架
提供的方法更有效且易于使用。
1:更新函数何时被调用?
假设用户通过鼠标点击了“文件”菜单,此操作会产生WM_INITMENUPOPUP消息,在菜单
弹出之前,编程框架的更新机制会更新“文件”菜单下的所有菜单项,这样我们就可以
看到各个菜单项的状态了。
为了做到这一点,编程框架会以标准的命令路由方式路由弹出菜单的所有菜单项命令。
在路由的过程中,通过检查消息映射入口,命令目标有机会更新任意的菜单项及调用
更新函数。比如,一个菜单有六个菜单项,那个弹出之前,这六个更新命令都会被发送
出去。如果存在与其相关的更新函数,则其会被更新状态。如果没有,编程框架会检查
与命令ID相关的处理函数是否存在,并依据其更新菜单项的状态。
如果在命令路由的过程中找不到相应的状态更新项,编程框架会自动去检查针对此命令
ID的响应函数是否存在,如果存在则UI对象可用,如果不存在则不可用。
所以,为了使一个UI对象可用,可以为其提供一个命令响应函数或者一个UI对象更新
函数。二者存在一个即可。
禁用UI对象的默认不可用属性是可以做到的,具体可以参照CFrameWnd的成员变量
m_bAutoMenuEnable。
编程框架中的菜单初始化是自动完成的,它发生在程序接收到消息WM_INITMENUPOPUP
的时候。在IDLE时间内,编程框架会像查找菜单的更新函数一样为按钮也查找更新函数。
2:宏ON_UPDATE_COMMAND_UI
通过属性窗口可以自动地将UI对象的ID与其相应的更新函数联系起来。UI对象的更新
函数的原型如下:
*/
/*
像所有的消息处理函数一样,更新函数的声明需要关键字afx_msg的支持
所像所有的更新函数一样,它也需要一个参数,类型为CCmdUI*
*/
afx_msg
void
OnUpdateEditClearAll(CCmdUI *pCmdUI);
/*
3:类CCmdUI
在路由更新命令的过程中,编程框架会为更新函数提供一个CCmdUI*类型的参数,它代表
了产生更新命令的UI对象。更新函数会调用CCmdUI的成员函数去更新其代表的UI对象。
示例代码如下:
*/
void
CMyWinApp::OnUpdateEditClearAll(CCmdUI *pCmdUI)
{
pCmdUI->Enable(m_bClearAllAvailable);
}
/*
CCmdUI的成员函数可操作的UI对象包括:
Menu item,菜单项
Enables or disables
Checks (×) or unchecks
Checks using dot (•)
Sets item text
Toolbar button,工具栏项
Enables or disables
Selects, unselects, or indeterminate
Same as SetCheck
Status-bar pane,状态栏项
Makes text visible or invisible
Sets pop-out or normal border
Same as SetCheck
Sets pane text
Normal button in CDialogBar
Enables or disables
Checks or unchecks check box
Same as SetCheck
Sets button text
Normal control in CDialogBar
Enables or disables
Sets window text
成员函数有下面的五人:
ContinueRouting
Enable
SetCheck
SetRadio
SetText
*/
发表于
2008-09-12 14:50
两颗番茄
阅读(
429
) 评论(
0
)
编辑
收藏
举报
刷新页面
返回顶部
公告