1. 取消右鍵系統(tǒng)菜單
在PreCreateWindow函數(shù)中改變設(shè)置樣式:
cs.style&=~WS_SYSMENU
CREATESTRUCT的具體結(jié)構(gòu)如下:

typedef struct tagCREATESTRUCT
{
LPVOID lpCreateParams;
HANDLE hInstance;//當(dāng)前實(shí)例句柄
HMENU hMenu;//菜單句柄
HWND hwndParent;//父窗口
int cy;//寬度
int cx;//高度
int y;//窗口位置坐標(biāo)
int x;//窗口位置坐標(biāo)
LONG style;//窗口樣式
LPCSTR lpszName;//標(biāo)題
LPCSTR lpszClass;//窗口類名
DWORD dwExStyle;//窗口擴(kuò)展樣式
} CREATESTRUCT;

2.在右鍵系統(tǒng)菜單加入菜單項(xiàng):
在窗口創(chuàng)建的時(shí)候加入
CMenu *pMenu=GetSystemMenu(FALSE);//取得系統(tǒng)菜單
CString StrMenuTitle="我的菜單";
pMenu->AppendMenu(MF_SEPARATOR);//增加一個(gè)項(xiàng)目到菜單的末尾,增加分割線
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:標(biāo)志位,可以是, MF_OWNERDRAW, MF_STRING, MF_SEPARATOR, MF_POPUP
NIDNewItem:菜單項(xiàng)目的ID,如果Nflags設(shè)置為MF_POPUP,那么就是子菜單的句柄,如果是MF_SEPARATOR,就突列.
LpszNewItem:新菜單項(xiàng)的內(nèi)容
PBmp:菜單項(xiàng)圖像對象,指向一個(gè)Cbitmap對象
在系統(tǒng)菜單中增加了菜單項(xiàng)之后再增加消息處理函數(shù).發(fā)送的是系統(tǒng)消息,在OnSysCommand函數(shù)中處理
void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)


{
if(nID==IDM_MYSYSTEM)


{
MessageBox("這是我的自定義系統(tǒng)菜單","信息提示",MB_OK);
}
CFrameWnd::OnSysCommand(nID, lParam);
}

3.動態(tài)的增加菜單項(xiàng):
pMenu->GetSubMenu(0)->AppendMenu(MF_SEPARATOR);//增加分割線
pMenu->GetSubMenu(0)->AppendMenu(MF_STRING,ID_APP_ABOUT,"關(guān)于
");//增加菜單項(xiàng)

4.動態(tài)的刪除菜單項(xiàng):
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;
}
}

函數(shù)說明:
int GetMenuString( UINT nIDItem, LPTSTR lpString, int nMaxCount, UINT nFlags ) const;
int GetMenuString( UINT nIDItem, CString& rString, UINT nFlags ) const;
nIDItem:由標(biāo)志位確定,可以是菜單項(xiàng)的ID或者偏移量
lpString和rString:存放字符
nMaxCount:最大長度
nFlags;標(biāo)志位,可以是MF_BYCOMMAND或MF_BYPOSITION
BOOL DeleteMenu( UINT nPosition, UINT nFlags );//刪除一個(gè)菜單項(xiàng)
BOOL RemoveMenu( UINT nPosition, UINT nFlags );
5.如何觸發(fā)系統(tǒng)菜單命令;
AfxGetMainWnd()->SendMessage(WM_SYSCOMMAND,SC_CLOSE);
6.如何創(chuàng)建一個(gè)彈出式菜單
以右擊鼠標(biāo)鍵為例:
CMenu Menu;
//創(chuàng)建一個(gè)彈出式菜單
Menu.CreatePopupMenu();
//添加一個(gè)菜單項(xiàng)
Menu.AppendMenu(0, ID_POPUP_MENU1, "菜單項(xiàng)&一");
//添加一個(gè)左邊帶復(fù)選標(biāo)志的菜單項(xiàng)
Menu.AppendMenu(MF_CHECKED, ID_POPUP_MENU2, "菜單項(xiàng)&二");
//添加一個(gè)分隔條
Menu.AppendMenu(MF_SEPARATOR, 0, "");
//顯示一個(gè)灰色和無效的菜單項(xiàng)
Menu.AppendMenu(MF_GRAYED, ID_POPUP_MENU3, "菜單項(xiàng)&三");
//添加一個(gè)左邊帶單選標(biāo)志的菜單項(xiàng)
Menu.AppendMenu(0, ID_POPUP_MENU4, "菜單項(xiàng)&四");
Menu.CheckMenuRadioItem(ID_POPUP_MENU3,ID_POPUP_MENU4,ID_POPUP_MENU4,MF_BYCOMMAND);
//使菜單項(xiàng)為缺省菜單項(xiàng),以黑體字顯示,并在用戶按回車時(shí)響應(yīng)
::SetMenuDefaultItem(Menu.m_hMenu,ID_POPUP_MENU4,MF_BYCOMMAND);
//根據(jù)當(dāng)前光標(biāo)位置顯示菜單
CPoint Pos;
GetCursorPos(&Pos); //取得光標(biāo)位置
Menu.TrackPopupMenu(TPM_RIGHTBUTTON, Pos.x, Pos.y, this);//彈出菜單
Menu.DestroyMenu();
CView::OnRButtonDown(nFlags, point);
函數(shù)說明:
BOOL CreatePopupMenu( );//創(chuàng)建一個(gè)彈出式菜單
BOOL CheckMenuRadioItem( UINT nIDFirst, UINT nIDLast, UINT nIDItem, UINT nFlags );
NIDFirst:單選按鈕組的第一個(gè)項(xiàng)的ID或命令
NIDLast:單選按鈕組的最或一個(gè)項(xiàng)的ID或命令
NIDItem:單選標(biāo)記的按鈕
NFlags;標(biāo)志位,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時(shí),如果用戶單擊彈出菜單的其他部分,就取消顯示
7.創(chuàng)建快捷菜單:
重載窗口的OnContextMenu函數(shù),當(dāng)鼠標(biāo)右鍵單擊時(shí)觸發(fā)它,
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.取消應(yīng)用程序的菜單;
CMenu *pMenu=GetMenu();
pMenu->DestroyMenu();
SetMenu(NULL);
9.如何在菜單中添加位圖
在應(yīng)用程序的視圖類中添加CBitmap類的對象,取名為bm_open1和bm_open2。在視圖類的構(gòu)造函數(shù)中添加以下代碼:
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);
函數(shù)說明:
BOOL SetMenuItemBitmaps( UINT nPosition, UINT nFlags, const CBitmap* pBmpUnchecked, const CBitmap* pBmpChecked );
相信看到函數(shù)原形就可以知道函數(shù)是什么意思