小默

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

在窗口创建的时候加入

    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或者偏移量

lpStringrString:存放字符

nMaxCount:最大长度

nFlags;标志位,可以是MF_BYCOMMANDMF_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_BYCOMMANDMF_BYPOSITION

BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL );//在指定的位置弹出菜单

NFlagsTPM_CENTERALIGNTPM_LEFTALIGN TPM_RIGHTALIGNTPM_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_open1bm_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(1MF_BYPOSITION&bm_open1&bm_open2)

函数说明:

BOOL SetMenuItemBitmaps( UINT nPosition, UINT nFlags, const CBitmap* pBmpUnchecked, const CBitmap* pBmpChecked );

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

posted on 2009-10-23 16:32 小默 阅读(1820) 评论(0)  编辑 收藏 引用 所属分类: Language


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

留言簿(13)

随笔分类(287)

随笔档案(289)

漏洞

搜索

积分与排名

最新评论

阅读排行榜