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 );
相信看到函數原形就可以知道函數是什么意思