zz:VC CMenu / 菜单操作

来源:互联网 发布:南昌seo外包公司 编辑:程序博客网 时间:2024/05/16 11:06

实现右键菜单时,需要实现单选项,查msdn没能解决,只好求助网络。

 

ZZ from:http://blog.sina.com.cn/s/blog_4c1934d5010009k7.html

 

1. 取消右键系统菜单

在PreCreateWindow函数中改变设置样式:
cs.style&=~WS_SYSMENU
CREATESTRUCT的具体结构如下:
typedef struct tagCREATESTRUCT {
  LPVOID    lpCreateParams;
  HANDLE    hInstance;//当前实例句柄
   HMENU     hMenu;//菜单句柄
   HWND      hwndParent;//父窗口
  int       cy;//宽度
  int       cx;//高度
  int       y;//窗口位置坐标
  int       x;//窗口位置坐标
  LONG      style;//窗口样式
  LPCSTR    lpszName;//标题
  LPCSTR    lpszClass;//窗口类名
  DWORD     dwExStyle;//窗口扩展样式
} CREATESTRUCT;
2.右键系统菜单加入菜单项:
在窗口创建的时候加入
    CMenu *pMenu=GetSystemMenu(FALSE);//取得系统菜单
    CString StrMenuTitle="我的菜单";
    pMenu->AppendMenu(MF_SEPARATOR);//增加一个项目到菜单的末尾,增加分割线
    pMenu->AppendMenu(MF_STRING,IDM_MYSYSTEM,StrMenuTitle);
MSDN中的定义;
BOOL AppendMenu( UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );
BOOL AppendMenu( UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp );
NFlags:标志位,可以是, MF_OWNERDRAW, MF_STRING, MF_SEPARATOR, MF_POPUP
NIDNewItem:菜单项目的ID,如果Nflags设置为MF_POPUP,那么就是子菜单的句柄,如果是MF_SEPARATOR,就突列.
LpszNewItem:新菜单项的内容
PBmp:菜单项图像对象,指向一个Cbitmap对象
在系统菜单中增加了菜单项之后再增加消息处理函数.发送的是系统消息,在OnSysCommand函数中处理
void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
{
if(nID==IDM_MYSYSTEM)
{
     MessageBox("这是我的自定义系统菜单","信息提示",MB_OK);
}
CFrameWnd::OnSysCommand(nID, lParam);
}
 
3.动态的增加菜单项:
    pMenu->GetSubMenu(0)->AppendMenu(MF_SEPARATOR);//增加分割线
    pMenu->GetSubMenu(0)->AppendMenu(MF_STRING,ID_APP_ABOUT,"关于...");//增加菜单项
4.动态的删除菜单项:
    CMenu *pMenu=AfxGetMainWnd()->GetMenu()->GetSubMenu(0);
    for(int i=0;i<pMenu->GetMenuItemCount();i++)
    {
        CString StrName;
        pMenu->GetMenuString(i,StrName,MF_BYPOSITION);
        if(StrName.Find("保存",0)==0)
        {
            pMenu->DeleteMenu(i,MF_BYPOSITION);
            MessageBox("删除“文件/保存”菜单操作成功!请查看","信息提示",MB_OK);
            break;
        }
    }
函数说明:
    int GetMenuString( UINT nIDItem, LPTSTR lpString, int nMaxCount, UINT nFlags ) const;
int GetMenuString( UINT nIDItem, CString& rString, UINT nFlags ) const;
nIDItem:由标志位确定,可以是菜单项的ID或者偏移量
lpString和rString:存放字符
nMaxCount:最大长度
nFlags;标志位,可以是MF_BYCOMMAND或MF_BYPOSITION
BOOL DeleteMenu( UINT nPosition, UINT nFlags );//删除一个菜单项
BOOL RemoveMenu( UINT nPosition, UINT nFlags );
5.如何触发系统菜单命令;
AfxGetMainWnd()->SendMessage(WM_SYSCOMMAND,SC_CLOSE);
6.如何创建一个弹出式菜单
    以右击鼠标键为例:
    CMenu Menu;
    //创建一个弹出式菜单
    Menu.CreatePopupMenu();
    //添加一个菜单项
    Menu.AppendMenu(0, ID_POPUP_MENU1, "菜单项&一");
    //添加一个左边带复选标志的菜单项
    Menu.AppendMenu(MF_CHECKED, ID_POPUP_MENU2, "菜单项&二");
    //添加一个分隔条
    Menu.AppendMenu(MF_SEPARATOR, 0, "");
    //显示一个灰色和无效的菜单项
    Menu.AppendMenu(MF_GRAYED, ID_POPUP_MENU3, "菜单项&三");
    //添加一个左边带单选标志的菜单项
    Menu.AppendMenu(0, ID_POPUP_MENU4, "菜单项&四");
    Menu.CheckMenuRadioItem(ID_POPUP_MENU3,ID_POPUP_MENU4,ID_POPUP_MENU4,MF_BYCOMMAND);
    //使菜单项为缺省菜单项,以黑体字显示,并在用户按回车时响应
    ::SetMenuDefaultItem(Menu.m_hMenu,ID_POPUP_MENU4,MF_BYCOMMAND);
    //根据当前光标位置显示菜单
    CPoint Pos;
    GetCursorPos(&Pos); //取得光标位置
    Menu.TrackPopupMenu(TPM_RIGHTBUTTON, Pos.x, Pos.y, this);//弹出菜单
    Menu.DestroyMenu();
    CView::OnRButtonDown(nFlags, point);
函数说明:
BOOL CreatePopupMenu( );//创建一个弹出式菜单
BOOL CheckMenuRadioItem( UINT nIDFirst, UINT nIDLast, UINT nIDItem, UINT nFlags );
    NIDFirst:单选按钮组的第一个项的ID或命令
    NIDLast:单选按钮组的最或一个项的ID或命令
NIDItem:单选标记的按钮
NFlags;标志位,MF_BYCOMMAND,MF_BYPOSITION
BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL );//在指定的位置弹出菜单
NFlags:TPM_CENTERALIGN,TPM_LEFTALIGN ,TPM_RIGHTALIGN,TPM_LEFTBUTTON  ,TPM_RIGHTBUTTON
PWnd:从菜单中接收WM_COMMAND消息
LpRect:包含屏幕的矩形位置,如果用户单击,就取消弹出菜单的显示,为NULL时,如果用户单击弹出菜单的其他部分,就取消显示
7.创建快捷菜单:
重载窗口的OnContextMenu函数,当鼠标右键单击时触发它,
void C。。。。View::OnContextMenu(CWnd* pWnd, CPoint point)
{
    CMenu Menu;
    if(Menu.LoadMenu(IDR_MAINFRAME))
    {
        CMenu *pMenu=Menu.GetSubMenu(0);
        pMenu->TrackPopupMenu(TPM_RIGHTBUTTON,point.x,point.y,AfxGetMainWnd());
    }
}
8.取消应用程序的菜单;
    CMenu *pMenu=GetMenu();
    pMenu->DestroyMenu();
    SetMenu(NULL);
9.如何在菜单中添加位图
    在应用程序的视图类中添加CBitmap类的对象,取名为bm_open1和bm_open2。在视图类的构造函数中添加以下代码:
 
bm_open1.LoadBitmap(IDB_OPEN1);
bm_open2.LoadBitmap(IDB_OPEN2);
添加位图到菜单
CWnd*parent=GetParent();
CMenu*pmenubar=parent->GetMenu();
CMenu*pmenu=pmenubar->GetSubMenu(2);
pmenu->SetMenuItemBitmaps(1,MF_BYPOSITION,&bm_open1,&bm_open2);
函数说明:
BOOL SetMenuItemBitmaps( UINT nPosition, UINT nFlags, const CBitmap* pBmpUnchecked, const CBitmap* pBmpChecked );
相信看到函数原形就可以知道函数是什么意思

原创粉丝点击