亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 孫鑫vc++講座筆記-(6)菜單編程.txt

?? VC++技術內幕精講
?? TXT
字號:
1,彈出菜單(Pop-up)是不能用來作命令響應的。

2,MFC中菜單項消息如果利用ClassWizard來對菜單項消息分別在上述四個類中進行響應,則菜單消息傳遞順序:View類--Doc類--CMainFrame類--App類。菜單消息一旦在其中一個類中響應則不再在其它類中查找響應函數。
具體:
當點擊一個菜單項的時候,最先接受到菜單項消息的是CMainFrame框架類,CMainFrame框架類將會把菜單項消息交給它的子窗口View類,由View類首先進行處理;如果View類檢測到沒對該菜單項消息做響應,則View類把菜單項消息交由文檔類Doc類進行處理;如果Doc類檢測到Doc類中也沒對該菜單項消息做響應,則Doc類又把該菜單項消息交還給View類,由View類再交還給CMainFrame類處理。如果CMainFrame類查看到CMainFrame類中也沒對該消息做響應,則最終交給App類進行處理。

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

4,一個菜單攔可以有若干個子菜單,一個子菜單又可以有若干個菜單項等。對菜單欄的子菜單由左至右建立從0開始的索引。對特定子菜單的菜單項由上至下建立了從0開始的索引。訪問子菜單和菜單項均可以通過其索引或標識(如果有標識的話)進行。
相關重要函數:
CMenu* GetMenu( ) ;//CWnd::GetMenu得到窗口菜單欄對象指針。
CMenu* GetSubMenu(  ) ;//CMenu::GetSubMenu獲得指向彈出菜單對象指針
UINT CheckMenuItem( );//CMenu::CheckMenuItem Adds check marks to or removes check marks from menu items in the pop-up menu. 
BOOL SetDefaultItem();//CMenu::SetDefaultItem Sets the default menu item for the specified menu.
BOOL SetMenuItemBitmaps( );//CMenu::SetMenuItemBitmaps 設置位圖標題菜單。
UINT EnableMenuItem();//CMenu::EnableMenuItem使菜單項有效,無效,或變灰。
BOOL SetMenu( CMenu* pMenu );//CWnd::SetMenu在當前窗口上設置新菜單或移除菜單。
HMENU Detach( );//CMenu::Detach Detaches a Windows menu from a CMenu object and returns the handle. 
說明:
1)在計算子菜單菜單項的索引的時候,分隔欄符也算索引的。
2)int GetSystemMetrics()獲取系統信息度量。可以用它來獲取菜單標題的尺寸從而設置位圖標題菜單中位圖的大小。
3)在MFC中MFC為我們提供了一套命令更新機制,所有菜單項的更新都是由這套機制來完成的。所以要想利用CMenu::EnableMenuItem來自己控制菜單使用或不使用變灰等,必須要在CMainFrame的構造函數中將變量m_bAutoMenuEnable設置為FALSE。
4)Create a CMenu object on the stack frame as a local, then call CMenu’s member functions to manipulate the new menu as needed. Next, call CWnd::SetMenu to set the menu to a window, followed immediately by a call to the CMenu object’s Detach member function. The CWnd::SetMenu member function sets the window’s menu to the new menu, causes the window to be redrawn to reflect the menu change, and also passes ownership of the menu to the window. The call to Detach detaches the HMENU from the CMenu object, so that when the local CMenu variable passes out of scope, the CMenu object destructor does not attempt to destroy a menu it no longer owns. The menu itself is automatically destroyed when the window is destroyed.
5)You can use the LoadMenuIndirect member function to create a menu from a template in memory, but a menu created from a resource by a call to LoadMenu is more easily maintained, and the menu resource itself can be created and modified by the menu editor.
6)EXAMPLE:
CMenu menu;//定義為局部對象
menu.LoadMenu(IDR_MAINFRAME);
SetMenu(&menu);
menu.Detach();// 這里menu對象作為一個局部對象。使用Detach()從menu對象中分離窗口菜單句柄,從而當menu對象析構的時候窗口菜單資源不隨之銷毀。

5,命令更新機制:
菜單項狀態的維護是依賴于CN_UPDATE_COMMAND_UI消息,誰捕獲CN_UPDATE_COMMAND_UI消息,MFC就在其中創建一個CCmdUI對象。
在后臺操作系統發出WM_INITMENUPOPUP消息,然后由MFC的基類如CFrameWnd接管并創建一個CCmdUI對象和第一個菜單項相關聯,調用對象成員函數DoUpdate()(注:這個函數在MSDN中沒有找到說明)發出CN_UPDATE_COMMAND_UI消息,這條消息帶有指向CCmdUI對象的指針。此后同一個CCmdUI對象又設置為與第二個菜單項相關聯,這樣順序進行,直到完成所有菜單項。
更新命令UI處理程序僅應用于彈出式菜單項上的項目,不能應用于永久顯示的頂級菜單項目。
說明:
1)可以手工或用ClassWizard來給菜單項添加UPDATE_COMMAND_UI消息響應,利用響應函數中傳進來的CCmdUI對象指針可完成設置菜單項可使用,不可使用,變灰,設置標記菜單等操作。

6,如果要想讓工具欄上的某個圖標與菜單項的某個菜單相關聯,只需要將圖標的ID設置為該菜單項的ID。
工具欄圖標的索引記數順序是:從做至右從0開始,分隔符也算索引號。

7,利用向項目中添加VC的POPMENU控件:Project->Add to Project->Components and Controls..
系統增加的內容:A,一個菜單資源;B,在派生View類中增加了OnContextMenu()函數
說明:
1)CWnd::OnContextMenu Called by the framework when the user has clicked the right mouse button (right clicked) in the window. You can process this message by displaying a context menu using the TrackPopupMenu.
2)BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL );
//CMenu::TrackPopupMenu Displays a floating pop-up menu at the specified location and tracks the selection of items on the pop-up menu. A floating pop-up menu can appear anywhere on the screen.

8,利用調用TrackPopupMenu函數,手工添加彈出菜單:
1)用資源管理器添加一個菜單資源
2)在鼠標右鍵消息響應函數中,加載菜單資源,并獲得要顯示的子菜單指針,并用該指針調用TrackPopupMenu函數便完成任務(但要注意:鼠標響應函數傳進來的坐標是客戶區坐標,而TrackPopupMenu函數中使用的是屏幕坐標,在調用TrackPopupMenu前要調用ClientToScreen客戶區坐標到屏幕坐標的轉換)
事例代碼:
CMenu menu;
menu.LoadMenu(IDR_MENU1);
CMenu *pPopup=menu.GetSubMenu(0);
ClientToScreen(&point);
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,this);
說明:
CWnd::ClientToScreen(..);//將一個坐標點或一個矩形區域坐標轉換成屏幕坐標。
CMenu::TrackPopupMenu(..);//在指定位置以指定的方式顯示彈出菜單。
CWnd::ScreenToClient(..);
//Converts the screen coordinates of a given point or rectangle on the display to client coordinates. 

9,當彈出菜單屬于框架窗口的時候(可在TrackPopupMenu函數參數中設置),彈出菜單上的消息,在路由的時候,仍然遵循View-DOC-MainFrame-APP的響應順序。

10,動態菜單編程:
所有的資源對象都有一個數據成員保存了資源的句柄。
CMenu::AppendMenu //Appends a new item to the end of a menu.
CMenu::CreatePopupMenu //Creates an empty pop-up menu and attaches it to a CMenu object.
CMenu::InsertMenu 
//Inserts a new menu item at the position specified by nPosition and moves other items down the menu. 
CMenu::GetSubMenu //Retrieves a pointer to a pop-up menu.
CWnd::GetMenu //Retrieves a pointer to the menu for this window.
CMenu::DeleteMenu //Deletes an item from the menu. 

11,手動給動態菜單項添加響應函數:
在Resource.h中可以添加資源的ID
在頭文件中寫消息函數原型
在代碼文件中添加消息映射和添加消息響應函數
說明:
可以先創建一個臨時的菜單項,設置它的ID和動態菜單項的一致,然后對它用向導進行消息響應,然后刪除臨時菜單。
再在代碼文件中把消息映射放到宏外(注意一定要放到宏外面,因為CLASSWIZARD發現菜單刪除了,同時要把其宏對里的消息映射也刪除掉的)

12,CWnd::DrawMenuBar 
//Redraws the menu bar. If a menu bar is changed after Windows has created the window, call this function to draw the changed menu bar

CWnd::GetParent //get a pointer to a child window’s parent window (if any). 
CWnd::Invalidate //注意其參數的作用

13,集合類:
CStringArray,CStringArray,CDWordArray,CPtrArray,CStringArray,CUIntArray,CWordArray
其中成員函數:
CArray::GetAt 
CArray::Add

14,命令消息是到OnCommand函數的時候完成路由的。
由于CWnd::OnCommand 是個虛函數,可以在框架類中重寫OnCommand函數,從而可以截獲菜單消息使它不再往下(VIEW類)路由。
例:
BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam) 
{
 // TODO: Add your specialized code here and/or call the base class
 int MenuCmdId=LOWORD(wParam);//取命令ID
 CMenu2View *pView=(CMenu2View*)GetActiveView();//獲取當前VIEW類指針
 if(MenuCmdId>=IDM_PHONE1 && MenuCmdId<IDM_PHONE1+pView->m_strArray.GetSize())//消息范圍判斷
 {
  CClientDC dc(pView);
  dc.TextOut(0,0,pView->m_strArray.GetAt(MenuCmdId-IDM_PHONE1));
  return TRUE; 
   //函數返回,避免調用CFrameWnd::OnCommand函數,在CFrameWnd::OnCommand中截獲的消息會交由VIEW類處理
 }
 return CFrameWnd::OnCommand(wParam, lParam);
  //調用基類OnCommand函數,在CFrameWnd::OnCommand中截獲的消息會交由VIEW類處理
}
 
MSDN說明:
virtual BOOL OnCommand( WPARAM wParam, LPARAM lParam );
//The framework calls this member function when the user selects an item from a menu, when a child control sends a notification message, or when an accelerator keystroke is translated. 
OnCommand processes the message map for control notification and ON_COMMAND entries, and calls the appropriate member function. 
Override this member function in your derived class to handle the WM_COMMAND message. An override will not process the message map unless the base class OnCommand is called.

15,LOWORD與HIWORD宏
WORD LOWORD(
  DWORD dwValue  // value from which low-order word is retrieved
);
WORD HIWORD(
  DWORD dwValue  // value from which high-order word is retrieved
);

//The LOWORD macro retrieves the low-order word from the given 32-bit value. 
//The HIWORD macro retrieves the high-order word from the given 32-bit value. 


16,CFrameWnd::GetActiveView 
CView* GetActiveView( ) const;//獲取當前視窗口指針(單文檔框架中)

17,源文件是單獨參與編譯的。

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人99久久亚洲综合精品| 欧美日韩精品三区| 国产精品一线二线三线精华| 久久国产精品72免费观看| 日韩国产欧美在线视频| 天天综合日日夜夜精品| 亚洲成人手机在线| 午夜成人在线视频| 蜜桃精品视频在线| 国模套图日韩精品一区二区| 极品少妇xxxx精品少妇| 国产一区二区三区在线观看精品| 国内精品久久久久影院色| 国产在线视频一区二区| 国产精品99久久久| 成人av电影免费在线播放| 99久久精品99国产精品 | 91精品国产麻豆| 欧美一区二区三区白人| 日韩免费视频线观看| 久久久精品国产免费观看同学| 中文字幕免费观看一区| 亚洲精品高清在线观看| 性欧美大战久久久久久久久| 日本成人超碰在线观看| 国产一区二区在线看| 成人小视频免费在线观看| 色综合久久久久综合体桃花网| 欧美三级电影网| 亚洲品质自拍视频| 日本欧美加勒比视频| 国产精品自在在线| 色噜噜久久综合| 91精品在线免费观看| 国产三级欧美三级| 亚洲一二三四久久| 精品一区免费av| 成a人片亚洲日本久久| 欧美在线视频你懂得| 欧美大片在线观看一区二区| 国产精品对白交换视频| 亚洲成人黄色小说| 国产大陆亚洲精品国产| 欧美三级电影一区| 精品国产麻豆免费人成网站| 中文字幕佐山爱一区二区免费| 性欧美大战久久久久久久久| 国产精品538一区二区在线| 日本精品免费观看高清观看| 精品欧美一区二区在线观看| 亚洲色大成网站www久久九九| 日韩国产欧美三级| 北条麻妃一区二区三区| 69成人精品免费视频| 中文乱码免费一区二区| 日日嗨av一区二区三区四区| 国产不卡在线视频| 欧美精品三级日韩久久| 中文字幕日韩一区| 麻豆91在线播放免费| 91蝌蚪porny| 久久久综合精品| 亚洲成人一区在线| 91一区二区三区在线播放| 欧美精品一区在线观看| 亚洲图片有声小说| 91社区在线播放| 久久精品一二三| 奇米一区二区三区| 91精彩视频在线观看| 国产日韩欧美综合一区| 日韩黄色免费电影| 在线免费不卡电影| 中文字幕中文字幕在线一区| 精品制服美女久久| 欧美日产在线观看| 亚洲综合清纯丝袜自拍| 成人高清视频免费观看| 精品日韩一区二区三区| 午夜a成v人精品| 欧美性感一区二区三区| 亚洲免费色视频| 成人久久视频在线观看| 久久精品亚洲麻豆av一区二区 | 亚洲国产精品传媒在线观看| 日本欧美久久久久免费播放网| 欧美影院一区二区| 亚洲精品久久久久久国产精华液| 成人小视频免费在线观看| 精品毛片乱码1区2区3区| 日本不卡一区二区| 欧美精品高清视频| 亚洲午夜精品17c| 欧美在线色视频| 亚洲激情在线播放| 日本韩国欧美国产| 亚洲精品你懂的| 色综合久久中文综合久久牛| 1区2区3区国产精品| aaa亚洲精品| 中文字幕一区二区三区四区不卡 | 91国产免费看| 亚洲日本乱码在线观看| 99久久国产综合精品麻豆| 国产精品伦一区| 91视频一区二区| 日韩毛片视频在线看| 日本久久电影网| 亚洲福利一区二区三区| 欧美日韩精品系列| 美女在线一区二区| 欧美精品一区二区三区在线| 精品一区二区影视| 久久久不卡网国产精品二区 | 欧美videossexotv100| 韩国三级电影一区二区| 国产日韩av一区| av高清不卡在线| 夜夜爽夜夜爽精品视频| 欧美亚洲国产一区二区三区 | 蜜臀av一区二区在线免费观看 | 一区二区高清视频在线观看| 色悠悠久久综合| 亚洲3atv精品一区二区三区| 7777精品伊人久久久大香线蕉的| 久久精品国产亚洲高清剧情介绍| 欧美不卡一区二区三区四区| 国产成人免费视频精品含羞草妖精| 中文字幕乱码一区二区免费| 91天堂素人约啪| 午夜欧美电影在线观看| www一区二区| 成人av片在线观看| 亚洲一级不卡视频| 精品嫩草影院久久| 91色综合久久久久婷婷| 同产精品九九九| 久久久夜色精品亚洲| 91色porny在线视频| 午夜精品久久久久久| 欧美成人在线直播| 成人精品国产一区二区4080| 一区二区三区国产精品| 欧美一区二区三区视频| 国产成人av一区二区| 亚洲三级小视频| 日韩欧美国产一区在线观看| 成人精品国产一区二区4080| 午夜日韩在线观看| 国产欧美日韩三区| 欧美日本不卡视频| 高清国产一区二区三区| 亚洲尤物在线视频观看| 久久久精品国产免大香伊| 欧美熟乱第一页| 国产**成人网毛片九色| 午夜成人在线视频| 亚洲欧洲成人自拍| 精品日产卡一卡二卡麻豆| 色婷婷精品大在线视频| 极品销魂美女一区二区三区| 亚洲精品网站在线观看| 精品国产sm最大网站免费看| 91精品福利在线| 成人性生交大合| 麻豆成人综合网| 亚洲一区二区三区激情| 欧美国产一区视频在线观看| 日韩午夜在线观看| 色婷婷亚洲精品| 国产99精品在线观看| 免费成人深夜小野草| 亚洲综合免费观看高清完整版在线| 久久婷婷国产综合精品青草| 欧美日韩免费观看一区三区| 成+人+亚洲+综合天堂| 精品夜夜嗨av一区二区三区| 亚洲不卡一区二区三区| 中文字幕二三区不卡| 欧美成人三级在线| 欧美视频在线不卡| 97精品电影院| 成人毛片老司机大片| 狠狠色综合日日| 日韩国产欧美在线视频| 亚洲一区二区三区四区在线观看| 国产精品色哟哟网站| 久久久99久久| 精品免费视频.| 日韩精品一区在线观看| 欧美一卡二卡三卡| 欧美久久久久久蜜桃| 欧美性videosxxxxx| 色狠狠色狠狠综合| 色综合网色综合| 成人午夜视频在线观看| 国产精品影音先锋| 国产精品一区二区无线| 国产在线一区二区| 国产精品影视在线|