06.3.3 图形标记菜单.txt
来自「网上第一本以TXT格式的VC++深入详解孙鑫的书.全文全以TXT格式,并每一章节」· 文本 代码 · 共 72 行
TXT
72 行
6.3.3 图形标记菜单
我们可以看到 VC++开发环境中,【 Tools】子菜单下的多个菜单项前面都带有图形,如图 6.15所示。
为了实现这种图形标记菜单项的效果,可以利用 CMenu
类的 SetMenultemB itmaps函数,这个函数的作用是将指定的
位图与菜单项关联起来。该函数的声明如下所示 :
BOOL SetMenultemBitmaps ( UINT nposi tion, UINT nFlags , const CBitmap* pBmpUnchecked, const CBitmap*
pBmpChecked );
这个函数有四个参数,同样,第一个参数 ( nPosition )
。 1的取值也是由第三个参数 (nFIψ的值决定的。如果第二个民UM即由咄咄 i参数的值是 MF_BYCOMMAND,则表明第一个参数的值是
。即时M i 菜单项标识:如果第二个参数的值是 MF_BYPOSITION,则
图 6.15 VC++开发环境中带表明第一个参数的值是菜单项位置索引。后两个参数都是
有图形的菜单项 CBitmap类型的指针,用来设置与菜单项关联的两幅位图,其中,第三个参数 (pBmpU nchecked)指定当取消菜单项选中状态时的位图,第四个参数 ( pBmpChecked)指定选中菜单项时显示的位图。这样,可以让菜单项显示两幅位图,来表明其选中和未选中状态。
以 Menu程序中【查看】子菜单下的【工具栏】标记菜单项为例,看看菜单项选中和取消选中时的状态,以及产生的功能。当【工具栏】菜单项处于选中状态,即显示该菜单项的复选标记时,程序窗口中显示了工具栏。当再次单击【工具栏】菜单项,它前面的表示选中状态的标记消失,程序窗口上的工具栏也消失了。再次单击这个菜单项,它又处于选中状态,标记符号又显示了,同时,工具栏也在程序窗口中出现了。
为了显示图形标记菜单,首先就需要准备图形,可以新建一个位图资源。这里,我们先创建一个默认大小的白色背景的位图。笔者创建的位图资源如图 6.16所示。
图 6.16白色背景位图
笔者注:因为这幅位图的背景是白色的,与书籍的纸张背景色相同,所以读者只能看到这幅位困土内容。
其次,可以在 CMai nFrame类的 OnCreate函数中完成图形标记菜单的实现。这时因为要把位图作为图形标记菜单的内容来显示,这样的话,就不能把位图作为局部变量来使用,否则,当 OnCreate函数调用结束时,这个位图对象的生命周期也就结束了,在程序中就看不到位图了。所以,要把位图对象设置为 CMai nFrame的成员变量。因此,为 CMai nFrame类添加一个 CBitmap类型的成员变量: m_bitmap。
例 6-6中加灰显示的代码是在 CMainFrame类的 OnCreate函数中添加的实现图形标记
" I 175
第 6章辈单
菜单的具体代码(读者可以在 OnCreate函数的最后,但一定要在 return语旬之前,加上如下这段代码) :
例 6-6
int CMainFrame: : OnCreate(LPCREATESTRUCT lpCreateStruct)
GetMenu()->GetSubMenu(O)->CheckMenultem(O , MF_BYPOS工 TION I MF_CHECKED); GetMenu() ->GetSubMenu(O) ->SetDefaultltem(工 D_FILE_OPEN, FALSE) ; GetMenu()->GetSubMenu(O)->SetDefaultltem(4 , TRUE);
m_bitmap . LoadB itmap(工 DB_BITMAP1) ; GetMenu()->GetSubMenu(O)->SetMenu工temBitmaps(O, MF一BYPOSIT工ON, &m_bitmap , &rn_bitmap) ; return 0;
例 6-6所示代码中,首先加载位图资源,初始化图形标记菜单将使用的位图对象,然后将程序【文件】子菜单下的【新建】菜单项实现为图形标记菜单项,并且将该菜单项的选中和取消选中状态都设置为同一幅位图。
Build井运行 Menu程序,打开【文件】子菜单,将发现【新建】菜单项的前面并没有显示位图。失败的原因在哪里呢?实际上,图形标记菜单上显示的位图的尺寸有固定的标准,这里我们创建的位图太大了,只显示了当前位图左上角的一小部分内容,而正好我们创建的这个位图资源左上角的这块范围没有内容,因此,看到的结果就是位图没有显示。
通过 GetSystemMetrics函数可以得到图形标记菜单上显示的位图的尺寸。这个函数的声明如下所述 :
int GetSystemMetrics( int nlndex );
这个函数只有一个参数,用来指定希望获取哪部分系统信息。当该参数的值为 SM_ XMENUCHECK或 SM CYMENUCHECK时,这个函数将获取标记菜单项上标记图形的默认尺寸,前者是获得标记图形的宽度,后者将获得标记图形的高度。我们可以分别以这两个参数值调用 GetSy s temMetrics函数两次,从而得到标记菜单项上位图的尺寸。于是,我们对上述例 6-6所示 Menu程序中 CMainFrame类的 OnCreate函数进行改进,在加载位图的那行代码(即 LoadBitmap调用〉之前添加获取该位图尺寸的代码,结果如例 6-7中加灰显示的代码所示。
例 6-7
int CMainFrame: : OnCreate(LPCREATESTRUCT lpCreateStruct)
{
…...
GetMenu()->GetSubMenu(O)->CheckMenultem(O , MF_BYPOSIT工 ON I MF_CHECKED); GetMenu()->GetSubMenu(O)->SetDefault工 tem(工 o F工 LE一OPEN, FALSE) ; GetMenu()->GetSubMenu(O)->SetDefault工 tem(4, TRUE) ;
1761 ~…·
CString str; str.Format ("x=屯d, y=毡d",GetSystemMetrics(SM_CXMENUCHECK),GetSystemMetrics(SM_CYMENUCHECK));
MessageBox(str) ;
rn_bitrnap.LoadBitrnap(IDB_BITMAP1) ;
GetMenu()->GetSubMenu(O)->SetMenulternBitrnaps(O,MF_BYPOSITION, &rn_bitrnap, &rn
_bitrnap) ;
return 0,;
在上述例6-7所示代码中,把获得的位图尺寸放到字符串附中,然后利用MessageBox函数将其显示出来。
飞。只细1日居 CString类提供了一个名为 FOImat的函数,这个函数可以按照一定的格式把内容格式化,然后将结果保存到CString类型的字符串对象中。
在C语言中也有两个这样的格式化函数,一个是printf,该函数是把内容按照一定的格式进行格式化,然后把结果输出到屏幕上。另一个是sprintf,该函数是把一个整数或字符按照一定的格式进行格式化,然后把结果保存到一个缓存中。
Build井运行Menu程序,这时会弹出一个消息框,如图 6.17所示。也就是说,作为图形标记菜单项上显示的位图,其宽度和高度都是130,...13, "(-13 这样,我们就需要把程序中位图资源的尺寸调整到 13X 13。
但是如何知道位图资源当前的尺寸呢?当在位图资源编辑器中,
用鼠标拖动位图外围的蓝色方框以改变位图资源大小时,在VC++图 6.17 图形标记位图开发环境窗口底部的状态条中有一格专门用来显示位图当前的尺的尺寸信息寸信息,该信息会随着鼠标的拖动而变化。如图6.18所示。
显示位图当前的尺寸图 6.18显示位图资源当前尺寸的位置调整好位图资源的大小后,设置位图资源的内容。笔者创建的位图资源如图6.18所示。
" ‘ I 177 .
第 6.襄单
Build井运行 Menu程序,打开【文件】子菜单,这时可以看到在【新建】菜单项的左侧就显示了刚刚创建的位图。如图 6.19所示。
妇开刨... ctr忡。傻,也自@忡S-'3存为ω...
mmmF咛鲁田』
".cv… a酬,打翻醺擅自。好'设量ω...
11剧。。
图 6.19图形标记菜单的显示结果
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?