📄 sy0102.htm
字号:
<html>
<HEAD>
<TITLE>Visual C++与计算机接口</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=gb2312" >
</HEAD>
<body>
<font color="#0000FF">更新命令用户接口(UI)消息</font>
<p>
(一)实验目的:<BR>
练习如何控制菜单的显示形态<BR><BR>
(二)实验内容:<BR>
将菜单使能或选中<BR><BR>
(三)实验方法:<BR><BR>
一般情况下,菜单项和工具条按钮都不止一种状态,我们经常需要根据应用的内部状态来对菜单项和工具条按钮作相应的改变。<BR>
例如,在我们没有选择任何内容时,编辑菜单下的“复制”、“剪切”等菜单是无效的(灰色显示)。有时还可看到,在菜单项旁边可能还会有检查标记,表示它是选中的还是不选中的。工具条也有类似的情形,如果按钮不可用也可以被置成无效,或者可以被选中。<BR>
如果我们采用SDK来编程,那么我们就要跟踪与这些状态相关的变量所有可能发生变化的地方,并根据可能发生的变化作相应的处理。这样的工作非常复杂且容易遗漏。为此,MFC应用程序框架引入了更新命令用户接口消息来简化这一工作。<BR><BR>
在ClassWizard的Message Map页中,如果我们选择一个菜单ID,在Messages列表框中就会出现两项:<BR>
COMMAND<BR>
UPDATE_COMMAND_UI<BR>
其中UPDATE_COMMAND_UI就是更新命令用户接口消息,专门用于处理菜单项和工具条按钮的更新。<BR>
每一个菜单命令都对应于一个更新命令用户接口消息。可以为更新命令用户接口消息编写消息处理函数来处理用户接口(包括菜单和工具条按钮)的更新。<BR>
如果一条命令有多个用户接口对象(比如一个菜单项和一个工具条按钮),两者都被发送给同一个处理函数。这样,对于所有等价的用户接口对象来说,可以把用户接口更新代码封装在同一地方。<BR>
<H4>用户接口更新原理</H4>
为了理解用户接口更新机制,我们来看一下应用框架是如何实现用户接口更新的。<BR>
当我们选择某一菜单时,将产生一条WM_INITMENUPOPUP消息。框架的更新机制将在菜单拉下之前集体更新所有的项,然后再显示该菜单。<BR>
为了更新所有的菜单项,应用框架按标准的命令发送路线把该弹出式菜单中的所有菜单项的更新命令都发送出去。通过匹配命令和适当的消息映射条目(形式为ON_UPDATE_COMMAND_UI),并调用相应的更新处理器函数,就可以更新任何菜单项。<BR>
如果在命令发送期间找不到对应于该命令的ON_UPDATE_COMMAND_UI项,那么框架就检查是否存在一个命令的ON_COMMAND项,如果存在,则使该菜单有效,否则就使该菜单无效(灰化)。<BR>
这种更新机制仅适用于弹出式菜单,对于顶层菜单象File和Edit菜单,就不能使用这种更新机制。<BR>
按钮的命令更新机制与菜单的命令接口更新机制类似,只是工具条按钮的命令接口更新在空闲循环时完成。<BR>
<H4>用户接口更新机制编程</H4>
当框架给处理函数发送更新命令时,它给处理函数传递一个指向CCmdUI对象的指针。这个对象包含了相应的菜单项或工具条按钮的指针。更新处理函数利用该指针调用菜单项或工具条的命令接口函数来更新用户接口对象(包括灰化,使能,选中菜单项和工具条按钮等)。<BR><BR>
下面使用前面的例子演示如何使用用户接口更新机制:<BR>
(1)按Ctrl+W激活ClassWizard,选择Message Map选项页。<BR>
(2)在Object IDs列表中选择 ID_MSG1,在Messages列表中双击ON_UPDATE _COMMAND_UI条目,弹出Add Member Function对话框。<BR>
(3)接受缺省函数名,按OK按钮接收此函数名。OnUpdateMsg1成员函数名就出现在Member Functions列表中。<BR>
(4)在CTestMsgView类头文件中对m_bMessage1等变量进行声明:<BR>
向TestMsgView.h中的CTestMsgView类中加入BOOL m_bMessage1,m_bMessage2,m_bMessage3;<BR>
(5)现在手工编辑刚才生成的成员函数(TestMsgView.cpp中)<BR>
void CTestMsgView::OnMsg1() <BR>
{<BR>
// TODO: Add your command handler code here<BR>
m_bMessage1=TRUE;<BR>
m_bMessage2=FALSE;<BR>
m_bMessage3=FALSE;<BR>
}<BR>
void CTestMsgView::OnUpdateMsg1(CCmdUI* pCmdUI) <BR>
{<BR>
// TODO: Add your command update UI handler code here<BR>
pCmdUI->SetCheck(m_bMessage1); <BR>
}<BR><BR>
上例中是使用一个变量决定了菜单的是否选中,这是进行用户接口更新的常用方式。<BR>
CCmdUI的其他功能例如使能,换文本等请参阅MSDN帮助。<BR>
<p></p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -