void CbuttonDlg::onLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CMenu menu;//菜单 CMenu* pPopupMenu;//菜单指针 CBitmap m_bitmap1,m_bitmap2,m_bitmap3;//位图
menu.LoadMenu(IDR_MENU1);//加载ID为IDR_MENU1的菜单 m_bitmap1.LoadBitmap(IDB_BITMAP1);//加载ID为IDB_BITMAP1的位图 m_bitmap2.LoadBitmap(IDB_BITMAP2);//加载ID为IDB_BITMAP2的位图 m_bitmap3.LoadBitmap(IDB_BITMAP3);
pPopupMenu = menu.GetSubMenu(0); //获取弹出菜单的第一层子菜单的类指针
//为菜单的第一和第三项设置图标 pPopupMenu->CheckMenuItem(0,MF_BYPOSITION|MF_CHECKED); //设置第1个为被选中状态 图标显示为选中后的图标 pPopupMenu->CheckMenuItem(1,MF_BYPOSITION|MF_CHECKED); //设置第2个为被选中状态 因为没有加载图标 前面会显示 勾 pPopupMenu->EnableMenuItem(4,MF_BYPOSITION|MF_GRAYED); //设置第四项为灰色禁用 pPopupMenu->SetDefaultItem(ID_MENU1_32772,FALSE); //当第二个参数为FALSE时,前面一个参数需要为ID标识名称 这里是设置第二个菜单为默认菜单项 会显示粗体 pPopupMenu->SetDefaultItem(3,TRUE); //因为菜单中有分隔符,所有这里要设置标号为3 即第4项为默认菜单项 并且一个菜单中只能有一个默认项 pPopupMenu->SetMenuItemBitmaps(0,MF_BYPOSITION,&m_bitmap1,&m_bitmap3); // 其中第三个参数是未选中时图标,第四个参数是选中的图标,由于上面设置该菜单已选中,图标显示m_bitmap2 pPopupMenu->SetMenuItemBitmaps(3,MF_BYPOSITION,&m_bitmap2,&m_bitmap3);
ClientToScreen(&point);//将鼠标单击处的坐标转换为屏幕坐标
//弹出菜单函数,第一个参数表示快捷菜单的下边界与由参数y指定的坐标对齐
//第二和第三个为x、y坐标,第四个表示拥有此菜单的窗口句柄,
//第五个默认为NULL,表示当用户在菜单以外的区域按鼠标键时,菜单会消失
pPopupMenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this,NULL);
CDialog::onLButtonDown(nFlags, point); }
void CbuttonDlg::OnMenu132771() { // TODO: 在此添加命令处理程序代码 MessageBox(L"点击菜单弹出的对话框"); }
CheckMenuItem函数
函数功能:该函数取得与指定菜单项相联系的菜单标志。如果该菜单项打开了一个子菜单,该函数也返回子菜单里的菜单项数。
函数原型:DWORD CheckMenuItem(HMENU hmenu, UINT uIDCheckItem, UINT uCheck);
参数:
hmenu:含有其菜单项的标志将被提取得的菜单的句柄。
uIDCheckItem:制定要修改的菜单项。
uCheck:表示标记的状态。此参数可取下列值之一:
MF_BYCOMMAND:表示参数uId给出菜单项的标识符。如果MF_BYCOMMAND和MF_BYPOSITION都没被指定,则MF_BYCOMMAND是缺省值。
MF_BYPOSITION:表示参数uId给出菜单项相对于零的位置。
返回值:如果指定的项不存在,返回值是OXFFFFFFFF;如果菜单项打开了一个子菜单,则返回值的低位含有与菜单相联系的菜单标志,高位含有子菜单的项数。否则,返回值是莱单标志的掩码(布尔OR)。
下面列出与菜单项相关的菜单标志。
MF_CHECKED:放置选取标记于菜单项旁边(只用于下拉式菜单、子菜单或快捷菜单)。
MF_DISABLED:使菜单项无效。MF_GRAYED:使菜单项无效并交灰。MF_HILITE:加亮菜单项。
MF_MENUBARBREAK:对下拉式菜单、子菜单和快捷菜单,新列和旧列由垂直线隔开,其余功能同MF_MENUBREAK标志。
MF_MENUBREAK:将菜单项放于新行(对菜单条)或无分隔列地放于新列(对下拉式菜单、子菜单或快捷菜单)。
MF_SEPARATOR:创建一个水平分隔线(只用于下拉式菜单、子菜单或快捷菜单)。
MF_UNCHECKED: Acts as a toggle with MF_CHECKED to remove a check mark next to the item
SetMenuItemBitmaps 函数
该函数将一个位图与制定菜单条目相关联。无论菜单条目被选中或被清除,系统都将在菜单条目之前显示一个(大小适当的)位图。
Syntax
BOOL SetMenuItemBitmaps( HMENU hMenu, UINT uPosition, UINT uFlags, HBITMAP hBitmapUnchecked, HBITMAP hBitmapChecked );
Parameters
hMenu [in] 菜单句柄 uPosition [in] 指定将要改变的菜单条目,由uFlags参数决定。 uFlags [in] 指定uPosition参数如何被解释。该参数必须为下列值之一:
MF_BYCOMMAND 表明uPosition参数赋给菜单条目的标识符。如果MF_BYCOMMAND和MF_BYPOSITION都未被指定,MF_BYCOMMAND就是默认的标识。 MF_BYPOSITION 表明uPosition赋给菜单条目相对位置。
hBitmapUnchecked [in] 菜单项未被选中时的位图句柄 hBitmapChecked [in] 菜单项被选中时位图的句柄
Return Value
如果函数成功,返回非零值;如果函数失败,返回零值。
Remarks
如果hBitmapUnchecked 或 hBitmapChecked 参数为NULL,系统将不会在相应的选择状态下显示任何位图。如果此二参数都为NULL,系统将在菜单项被选中时显示默认的选中位图,并在取消该菜单项的选择后移除该位图。 当菜单被摧毁后,这些位图不会被摧毁;直到应用程序来摧毁他们为止。