VC内部培训资料 - 第6章 菜单、工具栏和状态栏

2026/4/27 10:43:57

VC++培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址:http://www.it315.org

II. 利用CcmdUI类的成员变量m_nIndex

void CEX06_00View::OnUpdateGraphDot(CCmdUI* pCmdUI) {

// TODO: Add your command update UI handler code here

pCmdUI->SetCheck(m_nType==pCmdUI->m_nIndex);

} 读者不要给这种写法搞迷糊了。我们知道m_nIndex表示菜单项在整个弹出菜

单中的序号。括号中的语句是一个比较语句,当m_nType与m_nIndex相等时,比较结果为真,也就是SetCheck函数的参数为真,表示该菜单项被点击了。

上句代码在编译的时候会给出警告,提示“==”两边类型不匹配,那是因为我们定义的CEX06_00View类的成员变量m_nType为int型,而CCmdUI类的成员变量m_nIndex为unsinged int型,其实,这只是个警告并不影响运行及运行结果,如果读者不希望有这个警告,只需要加个强制转换就可以了,如下: pCmdUI->SetCheck((unsigned int )m_nType==pCmdUI->m_nIndex); 运行结果都是一样的。

III.利用CcmdUI类的成员变量m_nID

void CEX06_00View::OnUpdateGraphDot(CCmdUI* pCmdUI) {

// TODO: Add your command update UI handler code here pCmdUI->SetCheck(m_nType+ID_GRAPH_DOT==pCmdUI->m_nID); }

此种方法有一个条件,就是要求菜单项“画点”、“画线”、“画矩形”和“画椭圆”的ID必须是连续的。如果不连续,读者可以打开resource.h文件,将它们的ID手动修改为连续的就可以了。

到此为止,这个程序就基本完成了,但是细心的读者会发现,当窗口发生重绘的时候,所画的一系列图形会消失,那么如何才能将图形保存下来,并在窗口重绘时还能够显示出来呢?这个问题我们将在后面第八章持久性中详细讲述。

6.1.3 在应用程序中控制菜单

前面我们所讲的创建菜单及修改菜单都是在应用程序设计阶段,通过菜单编辑器来操作的,那么这节,我们将给读者介绍如果在应用程序运行时动态的修改和创建菜单。 6.1.3.1 在应用程序中取得菜单

系统菜单是有鼠标点击应用程序图标弹出的菜单。点击系统菜单时,发出WM_SYSCOMMAND消息,可添加此消息的响应函数来进行控制。 ? GetMenu()函数

CMenu* GetMenu( ) const; 返回窗口菜单指针,若无菜单,则返回值NULL。 ? GetSystemMenu()函数

CMenu* GetSystemMenu( BOOL bRevert ) const;

返回窗口系统菜单指针,我们可以用这个指针来修改系统菜单。

参数bRevert若为flase则可得到系统菜单并修改;若为true,系统菜单恢复为默认状态。

? GetSubMenu()函数

CMenu* GetSubMenu( int nPos ) const;

VC++培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址:http://www.it315.org

返回窗口菜单中的某个弹出式菜单。

参数nPos指定要取得的那个弹出式菜单在菜单中的位置,如果,nPos指定的位置不存在,那么返回NULL。

6.1.3.2 在应用程序中修改菜单的状态 ? CheckMenuItem()函数

UINT CheckMenuItem( UINT nIDCheckItem, UINT nCheck ); 复选菜单项,也就是将菜单项打钩或去掉钩。

参数nIDCheckItem指定是哪个菜单项。这个参数受制于第二个参数nCheck,当第二个参数nCheck为MF_BYCOMMAND 时,第一个参数使用的是菜单项的ID值,如ID_FILE_NEW;如果第二个参数nCheck为MF_BYPOSITION 时,第一个参数使用的是菜单项在弹出式菜单中的位置,如0、1等。

第二个参数nCheck还有两个可选值:MF_CHECKED 表示将参数nIDCheckItem指定的菜单项复选;MF_UNCHECKED 表示将参数nIDCheckItem指定的菜单项不复选。 我们以MFC单文档应用程序中,AppWizard为我们生成的标准菜单为例,如果在CMainFrame类的OnCreate函数中敲入如下代码:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {

??

m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar);

GetMenu()->GetSubMenu(0)->CheckMenuItem(2,MF_BYPOSITION|MF_CHECKED); return 0; }

那么我们会看到“文件”菜单中的“保存”菜单项被复选上了,如图6-21所示。

图6-21 “保存”菜单项被复选

? SetDefaultItem() 函数

VC++培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址:http://www.it315.org

BOOL SetDefaultItem( UINT uItem, BOOL fByPos = FALSE ); 设置某个菜单项为缺省菜单。

参数uItem指定要设置为缺省菜单的菜单项的位置索引或ID号。若参数fByPos为FALSE,则第一个参数uItem指定菜单的ID号;若参数fByPos为TRUE,则第一个参数uItem指定菜单的位置。函数中默认第二个参数为FALSE。

我们还是以MFC单文档应用程序中,AppWizard为我们生成的标准菜单为例,如果在CMainFrame类的OnCreate函数中再敲入如下代码:

GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_NEW,false);

再运行程序会发现“文件”菜单中的“新建”菜单项被设置为缺省菜单,呈加重黑体样式,如图6-22所示。

图6-22 “新建”菜单项被设置为缺省菜单

? EnableMenuItem()函数

UINT EnableMenuItem( UINT nIDEnableItem, UINT nEnable ); 使某一菜单项可用或不可用,或呈灰白状态。

参数nIDEnableItem指定是哪个菜单项。这个参数受制于第二个参数nEnable,当第二个参数nEnable为MF_BYCOMMAND 时,第一个参数使用的是菜单项的ID值,如ID_FILE_NEW;如果第二个参数nEnable为MF_BYPOSITION 时,第一个参数使用的是菜单项在弹出式菜单中的位置,如0、1等。

第二个参数nEnable还有三个可选值:MF_DISABLED 表示使参数nIDEnableItem指定的菜单项不可用;MF_ENABLED 表示使参数nIDCheckItem指定的菜单项可用;MF_GRAYED 表示使参数nIDCheckItem指定的菜单项变灰白状态。

我们还是以MFC单文档应用程序中,AppWizard为我们生成的标准菜单为例,如果在CMainFrame类的OnCreate函数中敲入如下代码:

GetMenu()->GetSubMenu(2)->EnableMenuItem(1,MF_DISABLED|MF_BYPOSITION|MF_GRAYED);

运行程序时,会发现上面的代码没有生效。应该在CMainFrame的构造函数中将成员变量m_bAutoMenuEnable设为FALSE。当这个成员变量设置为TRUE时,如果菜单项没有ON_UPDATE_COMMAND_UI 或者ON_COMMAND的处理函数,用户点击弹出菜单时系统自动将菜单项设为失效。如果菜单项有ON_COMMAND的处理函数,菜单项自动被设置为有效。

将m_bAutoMenuEnable成员变量在构造函数中设为FALSE之后,再运行程序,那么“查看”菜单的“状态栏”菜单项被灰白不可用了,如图6-23所示。

VC++培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址:http://www.it315.org

图6-23 “状态栏”菜单项被设置为灰白不可用

? SetMenuItemBitmaps()函数

BOOL SetMenuItemBitmaps( UINT nPosition, UINT nFlags, const CBitmap*

pBmpUnchecked, const CBitmap* pBmpChecked );

设置图形复选菜单,也就是将某个菜单项的左边添加一个图标。

参数nPosition为选取的菜单项的位置索引或ID号;参数nFlags为MF_BYCOMMAND 时,第一个参数使用的是菜单项的ID值,如ID_FILE_NEW;参数nFlags为MF_BYPOSITION 时,第一个参数使用的是菜单项在弹出式菜单中的位置,如0、1等;第三个参数pBmpUnchecked表示该菜单项没被选中时的位图信息;第四个参数pBmpChecked表示该菜单项被选中时的位图信息。

实现图形复选菜单的步骤如下: 1) 在CMainFrame中增加两个成员变量,用于装入两个位图,一个是菜单被选择时的图标,一个是未被选择时的。分别为 CBitmap bmp1;和CBitmap bmp2;

2) 在资源面板里增加两个位图资源,其ID为IDB_BITMAP1,IDB_BITMAP2,或者也可

以从其他文件夹中导入两个位图。

3) 在CMainFrame的OnCreate函数中加入代码: bmp1.LoadBitmap(IDB_BITMAP1); bmp2.LoadBitmap(IDB_BITMAP2); GetMenu()->GetSubMenu(1)->SetMenuItemBitmaps(0,MF_BYPOSITION,&bmp1,&bmp2);

上段代码是设置“编辑”菜单的“撤消”菜单项为图形复选菜单。

4) 此时位图有可能在菜单中不能完全显示,因为我们自己加的位图的大小不一定和菜

单用的图标的大小吻合,因此需要用GetSystemMetrics()函数来获取标准菜单图标的大小,代码如下,下面的代码旨在获取图标信息,因此得到图标大小信息后,可以将该段代码删除。 CString str;

str.Format(\

GetSystemMetrics(SM_CYMENUCHECK));

MessageBox(str);

按照取得的标准图标大小(13,13)修改我们的位图。


VC内部培训资料 - 第6章 菜单、工具栏和状态栏.doc 将本文的Word文档下载到电脑
搜索更多关于: VC内部培训资料 - 第6章 菜单、工具栏和状态栏 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219