MFC中菜单的应用(注释详细)

 

MFC中菜单的应用(注释详细)

  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.在右键系统菜单加入菜单项:

在窗口创建的时候加入中的定义;NFlags:标志位,可以是, MF_OWNERDRAW, MF_STRING, MF_SEPARATOR, MF_POPUP

    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 );

 

NIDNewItem:菜单项目的ID,如果Nflags设置为MF_POPUP,那么就是子菜单的句柄,如果是MF_SEPARATOR,就突列.

LpszNewItem:新菜单项的内容

PBmp:菜单项图像对象,指向一个Cbitmap对象

在系统菜单中增加了菜单项之后再增加消息处理函数.发送的是系统消息,在OnSysCommand函数中处理

3.动态的增加菜单项:

4.动态的删除菜单项:

函数说明:

    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 );

相信看到函数原形就可以知道函数是什么意思

 

pMenu -> GetSubMenu( 0 ) -> AppendMenu(MF_SEPARATOR); // 增加分割线
pMenu -> GetSubMenu( 0 ) -> AppendMenu(MF_STRING,ID_APP_ABOUT, " 关于 " ); // 增加菜单项

 

    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;
        }

    }

void  CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
{
if(nID==IDM_MYSYSTEM)
{
     MessageBox(
"这是我的自定义系统菜单","信息提示",MB_OK);
}

CFrameWnd::OnSysCommand(nID, lParam);
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值