MFC學習筆記(4)

菜單響應順序 : view類 文檔類 框架類 應用程序類
消息分類
標準消息
      除WM_COMMAND之外,所有以WM_開頭的消息。
      從CWnd派生的類,都可以接收到這類消息。
命令消息
      來自菜單、加速鍵或工具欄按鈕的消息。這類消息都以WM_COMMAND呈現。在MFC中,通過菜單項的標識(ID)來區分不同的命令消息;在SDK中,通過消息的wParam參數識別。
 從CCmdTarget派生的類,都可以接收到這類消息。
通告消息
      由控件產生的消息,例如,按鈕的單擊,列表框的選擇等均產生此類消息,爲的是向其父窗口(通常是對話框)通知事件的發生。這類消息也是以WM_COMMAND形式呈現。
 從CCmdTarget派生的類,都可以接收到這類消息。


標記菜單
1.
GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW,MF_BYCOMMAND|MF_CHECKED);
2.
GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION|MF_CHECKED);

圖形標記菜單
m_bitmap.LoadBitmapW(IDB_BITMAP1);
GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,&m_bitmap,&m_bitmap);

str.Format(L"x=%d,y=%d",GetSystemMetrics(SM_CXMENUCHECK),GetSystemMetrics(SM_CYMENUCHECK));

缺省菜單
1.
GetMenu()->GetSubMenu(0)->SetDefaultItem(1,TRUE);
2.
GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_NEW);


*菜單分隔符是佔索引 位置的 


菜單項禁用
首先在CMainFrame構造函數中設置m_bAutoMenuEnabl=FALSE
GetMenu()->GetSubMenu(0)->EnableMenuItem(1,MF_BYPOSITION | MF_DISABLED | MF_GRAYED);

一般的方法是利用命令更新機制 給菜單選項添加 UPDATE_COMMAND_UI事件
然後用CCmdUI的成員函數Enble來控制

*要注意局部變量生命週期問題


SetMenu(NULL); //刪除整個菜單
CMenu menu;
menu.LoadMenu(IDR_MAINFRAME);  //添加菜單
SetMenu(&menu);
menu.Detach();

右鍵菜單添加
建立一個MENU資源IDR_MENU1  ID爲IDR_POPMENU
在OnRButtonDown函數下實現
CMenu menu;
    menu.LoadMenu(IDR_MENU1);
    CMenu*pPopup=menu.GetSubMenu(0);

    ClientToScreen(&point);
    pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y,GetParent()); //GetParent()可以讓CmainFrame響應


動態添加刪除菜單
 CMenu menu;
 menu.CreatePopupMenu();  //創建彈出菜單
 GetMenu()->AppendMenuW(MF_POPUP,(UINT)menu.m_hMenu,L"楓江");
 GetMenu()->InsertMenuW(2,MF_BYPOSITION|MF_POPUP,(UINT)menu.m_hMenu,L"楓江");
 menu.AppendMenuW(MF_STRING,IDM_HELLO,L"hello");
 menu.AppendMenuW(MF_STRING,112,L"li");
 menu.AppendMenuW(MF_STRING,113,L"wei");
 menu.Detach();      //使局部變量menu創建的菜單不隨着它被析構而銷燬
 GetMenu()->GetSubMenu(0)->InsertMenuW(ID_FILE_OPEN,MF_BYCOMMAND|MF_STRING,115,L"落月");
 GetMenu()->DeleteMenu(1,MF_BYPOSITION); //刪除子菜單
 GetMenu()->GetSubMenu(0)->DeleteMenu(2,MF_BYPOSITION);//刪除菜單項

手動添加 菜單項事件響應
1.在Resource.h中添加菜單項ID
2.在所在類頭文件中寫響應函數原型
例:afx_msg void onHello();
3.消息映射
對於命令消息 通過ON_COMMAND宏來完成

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
 ON_WM_CREATE()
END_MESSAGE_MAP()
中間加入ON_COMMAND(IDM_HELLO,onHello)

然後在下面寫響應函數實現  

*菜單屬於框架類 不屬於view類  在view類中GetParent()->GetMenu()->...

GetParent()->DrawMenuBar();是在view類裏進行菜單的重繪  

*CString::Find()  類似與C語言中strchr

*GetActiveView獲取當前view類指針
在CMainFrame中調用view類中的成員用到了這個函數
這時候要在前面include上view類的頭文件

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章