[zz]MFC中菜單的應用(注釋詳細)
在PreCreateWindow函數中改變設置樣式:
cs.style&=~WS_SYSMENU
CREATESTRUCT的具體結構如下:















2.在右鍵系統菜單加入菜單項:
在窗口創建的時候加入






MSDN中的定義;



NFlags:標志位,可以是, MF_OWNERDRAW, MF_STRING, MF_SEPARATOR, MF_POPUP
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 );
相信看到函數原形就可以知道函數是什么意思posted on 2009-10-23 16:32 小默 閱讀(1847) 評論(0) 編輯 收藏 引用 所屬分類: Language