📄 sy0104.htm
字号:
<html>
<HEAD>
<TITLE>Visual C++与计算机接口</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=gb2312" >
</HEAD>
<body>
<a name='01'><font color="#0000FF">创建弹出式菜单</font></a>
<p>
(一)实验目的:<BR>
用户右击视窗时创建一个弹出式菜单(见图1)<BR>
<p align="center"><span style="FONT-SIZE: 9pt"><img height="188" width="675" alt="弹出式菜单" src="sy0102.jpg" ></span></p>
<p align="center"><span style="FONT-SIZE: 9pt">图1.1.2 用户可以创建一个弹出式菜单,以便用户右击时显示</span></p>
(二)实验内容:<BR>
用CMenu::CreatePopupMenu() 和CMenu::TrackPopupMenu()创建弹出式菜单;并练习使用CMenu类的一些成员函数动态地修改菜单。<BR><BR>
(三)实验步骤:<BR><BR>
实现弹出式菜单一般分四步:<BR>
·选择并用ClassWizard自动生成要使用的消息映射,例如鼠标右键消息映射;<BR>
·使用菜单资源或手工填充来创建一个弹出式菜单;<BR>
·显示弹出式菜单;<BR>
·加入菜单消息处理代码。<BR><BR>
1、创建并填充一个弹出式菜单<BR>
(1)用ClassWizard为类添加一个WM_RBUTTONDOWN消息处理函数,用于响应鼠标右键消息。<BR>
(2)在该新处理函数中,创建一个CMenu类弹出式菜单对象。<BR>
CMenu menu;<BR>
menu.CreatePopupMenu();<BR>
(3)添加一个菜单项到该菜单,可以用:<BR>
menu.AppendMenu(0,IDC_WZD1_TYPE,"Wzd&1");<BR>
(4)添加一个边上有复选标志的命令,用:<BR>
menu.AppendMenu(MF_CHECKED,IDC_WZD2_TYPE,"Wzd&2");<BR>
(5)在该弹出式菜单中放置一个分隔符,用:<BR>
menu.AppendMenu(MF_SEPARATOR,0,"");<BR>
(6)添加一个显示灰色和无效的命令,用:<BR>
menu.AppendMenu(MF_GRAYED,IDC_WZD3_TYPE,"Wzd&3");<BR>
(7)添加单选按钮到一组菜单项,可以用:<BR>
menu.CheckMenuRadioItem(IDC_WZD3_TYPE, IDC_WZD4_TYPE, IDC_WZD4_TYPE, MF_BYCOMMAND);<BR>
该函数的前两个变量是某个范围的命令ID的起始ID和结束ID;<BR>
第三个变量是用户想在边上画点的菜单项。<BR>
如果更喜欢用菜单位置,第四个变量可以用MF_BYPOSITION。<BR>
(8)要使一个菜单项成为默认的菜单项,使用户按回车时被执行,可以用:<BR>
::SetMenuDefaultItem(menu.m_hMenu,IDC_WZD4_TYPE,MF_BYCOMMAND);<BR>
注意:其中IDC_WZD1_TYPE,IDC_WZD2_TYPE,IDC_WZD3_TYPE,IDC_WZD4_TYPE是任意常数,它们分别代表每个菜单项对应的Resource ID<BR><BR>
2、显示弹出式菜单<BR>
(1)在鼠标右击处显示该弹出式菜单,用:<BR>
CPoint pt;<BR>
GetCursorPos(&pt);<BR>
menu.TrackPopupMenu(TPM_RIGHTBUTTON,pt.x,pt.y,this);<BR>
应用程序暂停在TrackPopupMenu(),直到用户单击该菜单或其他地方。<BR>
当菜单被单击时,一个WM_COMMAND消息与命令ID一起被发送到TrackPopupMenu()第四个变量指定的窗口。<BR><BR>
(2)使用TrackPopupMenu()以后,需要用DestroyMenu()销毁弹出式菜单对象。因为该例中的CMenu对象分配在堆栈中,返回时也将销毁它。<BR>
menu.DestroyMenu();<BR><BR>
3、用一个应用程序资源创建一个弹出式菜单<BR>
若不想匆忙地创建一个弹出式菜单,也可以直接从应用程序资源中装入一个预定义的菜单。<BR>
(1)用菜单编辑器创建一个新菜单,并给它添加所需的菜单项。<BR>
(2)同前面一样,在堆栈中创建Menu类对象,但现在使用CMenu::LoadMenu( )从资源中装入新菜单。<BR>
CMenu menu;<BR>
menu.LoadMenu(IDR_WZD_MENU); // get menu resource<BR>
CMenu*pPopup=menu.GetSubMenu(0); // get pointer to popup menu<BR>
(3)禁用该弹出式菜单中的菜单项,用:<BR>
pPopup->EnableMenuItem(ID_POPUP_WZD1,MF_BYCOMMAND|MF_GRAYED);<BR>
(4)给菜单项添加一个复选标记,用:<BR>
pPopup->CheckMenuItem(2,MF_BYPOSITION|MF_CHECKED);<BR>
(5)可以使用与前面一样的方法显示和销毁该弹出式菜单。<BR>
注意:应该显示pPopup而不是menu<BR><BR>
4、说明:<BR>
(1)注意我们在这里处理两个对象:CMenu类对象和Windows弹出式菜单对象。<BR>
可以认为CMenu对象是一个Windows资源的C++类封装;弹出式菜单对象实际上是一个用#32768作为它的窗口类的弹出式窗口。<BR>
有关MFC对象和窗口对象参见MSDN。<BR>
(2)注意正如一个普通菜单一样,从一个弹出式菜单中发送出来的消息是一个具有命令ID的WM_COMMAND消息。<BR>
有关消息处理参见MSDN。<BR>
</p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -