青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 47, 文章 - 10, 評論 - 8, 引用 - 0
數據加載中……

孫鑫VC++講座筆記-(6)菜單編程

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開始的索引。訪問子菜單和菜單項均可以通過其索引或標識(如果有標識的話)進行。
相關重要函數:

1 CMenu * ?GetMenu(?)?; // CWnd::GetMenu得到窗口菜單欄對象指針。
2 CMenu * ?GetSubMenu(??)?; // CMenu::GetSubMenu獲得指向彈出菜單對象指針
3 UINT?CheckMenuItem(?); // CMenu::CheckMenuItem?Adds?check?marks?to?or?removes?check?marks?from?menu?items?in?the?pop-up?menu.?
4 BOOL?SetDefaultItem(); // CMenu::SetDefaultItem?Sets?the?default?menu?item?for?the?specified?menu.
5 BOOL?SetMenuItemBitmaps(?); // CMenu::SetMenuItemBitmaps?設置位圖標題菜單。
6 UINT?EnableMenuItem(); // CMenu::EnableMenuItem使菜單項有效,無效,或變灰。
7 BOOL?SetMenu(?CMenu * ?pMenu?); // CWnd::SetMenu在當前窗口上設置新菜單或移除菜單。
8 HMENU?Detach(?); // CMenu::Detach?Detaches?a?Windows?menu?from?a?CMenu?object?and?returns?the?handle.?
9

說明:
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:
1CMenu?menu;//定義為局部對象
2menu.LoadMenu(IDR_MAINFRAME);
3SetMenu(&menu);
4menu.Detach();//?這里menu對象作為一個局部對象。使用Detach()從menu對象中分離窗口菜單句柄,從而當menu對象析構的時候窗口菜單資源不隨之銷毀。
5

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客戶區坐標到屏幕坐標的轉換)
事例代碼:

?1CMenu?menu;
?2menu.LoadMenu(IDR_MENU1);
?3CMenu?*pPopup=menu.GetSubMenu(0);
?4ClientToScreen(&point);
?5pPopup->TrackPopupMenu(TPM_LEFTALIGN?|?TPM_RIGHTBUTTON,?point.x,?point.y,this);
?6//說明:
?7CWnd::ClientToScreen(..);//將一個坐標點或一個矩形區域坐標轉換成屏幕坐標。
?8CMenu::TrackPopupMenu(..);//在指定位置以指定的方式顯示彈出菜單。
?9CWnd::ScreenToClient(..);
10//Converts?the?screen?coordinates?of?a?given?point?or?rectangle?on?the?display?to?client?coordinates.?
11

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

10,動態菜單編程:
所有的資源對象都有一個數據成員保存了資源的句柄。

1CMenu::AppendMenu?//Appends?a?new?item?to?the?end?of?a?menu.
2CMenu::CreatePopupMenu?//Creates?an?empty?pop-up?menu?and?attaches?it?to?a?CMenu?object.
3CMenu::InsertMenu?
4//Inserts?a?new?menu?item?at?the?position?specified?by?nPosition?and?moves?other?items?down?the?menu.?
5CMenu::GetSubMenu?//Retrieves?a?pointer?to?a?pop-up?menu.
6CWnd::GetMenu?//Retrieves?a?pointer?to?the?menu?for?this?window.
7CMenu::DeleteMenu?//Deletes?an?item?from?the?menu.?
8

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

12,CWnd::DrawMenuBar

1//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
2
3CWnd::GetParent?//get?a?pointer?to?a?child?window’s?parent?window?(if?any).?
4CWnd::Invalidate?//注意其參數的作用
5

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

14,命令消息是到OnCommand函數的時候完成路由的。
由于CWnd::OnCommand 是個虛函數,可以在框架類中重寫OnCommand函數,從而可以截獲菜單消息使它不再往下(VIEW類)路由。
例:

?1BOOL?CMainFrame::OnCommand(WPARAM?wParam,?LPARAM?lParam)?
?2{
?3?//?TODO:?Add?your?specialized?code?here?and/or?call?the?base?class
?4?int?MenuCmdId=LOWORD(wParam);//取命令ID
?5?CMenu2View?*pView=(CMenu2View*)GetActiveView();//獲取當前VIEW類指針
?6?if(MenuCmdId>=IDM_PHONE1?&&?MenuCmdId<IDM_PHONE1+pView->m_strArray.GetSize())//消息范圍判斷
?7?{
?8??CClientDC?dc(pView);
?9??dc.TextOut(0,0,pView->m_strArray.GetAt(MenuCmdId-IDM_PHONE1));
10??return?TRUE;?
11???//函數返回,避免調用CFrameWnd::OnCommand函數,在CFrameWnd::OnCommand中截獲的消息會交由VIEW類處理
12?}

13?return?CFrameWnd::OnCommand(wParam,?lParam);
14??//調用基類OnCommand函數,在CFrameWnd::OnCommand中截獲的消息會交由VIEW類處理
15}

16

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宏

?1WORD?LOWORD(
?2??DWORD?dwValue??//?value?from?which?low-order?word?is?retrieved
?3);
?4WORD?HIWORD(
?5??DWORD?dwValue??//?value?from?which?high-order?word?is?retrieved
?6);
?7
?8//The?LOWORD?macro?retrieves?the?low-order?word?from?the?given?32-bit?value.?
?9//The?HIWORD?macro?retrieves?the?high-order?word?from?the?given?32-bit?value.?
10
11
16,CFrameWnd::GetActiveView
CView* GetActiveView( ) const;//獲取當前視窗口指針(單文檔框架中)

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

posted on 2006-04-04 11:09 編程之道 閱讀(259) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美激情第五页| 欧美 日韩 国产 一区| 欧美成人在线免费观看| 午夜精品福利一区二区三区av| 亚洲国产裸拍裸体视频在线观看乱了中文 | 国产亚洲精品综合一区91| 欧美午夜不卡在线观看免费 | 在线精品一区二区| 1000部国产精品成人观看| 亚洲国产视频一区| 亚洲精品之草原avav久久| 夜夜爽夜夜爽精品视频| 午夜精品久久久久99热蜜桃导演| 久久久www成人免费毛片麻豆| 久久九九热re6这里有精品| 乱中年女人伦av一区二区| 欧美freesex8一10精品| 欧美日韩午夜剧场| 国产一区高清视频| 亚洲精品在线免费| 欧美在线影院| 亚洲日本电影| 性欧美1819sex性高清| 看欧美日韩国产| 亚洲欧美日韩网| 国产一区自拍视频| 亚洲精品国精品久久99热一| 亚洲影院高清在线| 国产精品久久一区主播| 欧美xart系列高清| 国产精品成人一区二区| 黄色一区二区三区| av成人福利| 久久久最新网址| 一区二区三区黄色| 久久偷窥视频| 亚洲精品美女91| 午夜精品久久久久久久蜜桃app| 欧美**字幕| 亚洲中字在线| 欧美日韩视频在线| 亚洲级视频在线观看免费1级| 亚洲欧美久久久| 亚洲国产va精品久久久不卡综合| 一区二区三区欧美| 免费不卡视频| 国模精品一区二区三区色天香| 亚洲乱码国产乱码精品精可以看| 久久久久久国产精品mv| 一区二区欧美激情| 欧美日韩18| 亚洲国产婷婷| 免费黄网站欧美| 欧美在线观看天堂一区二区三区 | 欧美成人国产| 久久久国产91| 国产一区香蕉久久| 欧美一区二区视频在线观看2020| 亚洲人成网站在线观看播放| 久久影视精品| 亚洲国产精品久久91精品| 玖玖玖国产精品| 久久国产主播| 红桃视频一区| 卡一卡二国产精品| 久久久亚洲欧洲日产国码αv | 一区二区三区 在线观看视| 欧美成人精品在线视频| 久久久久国产成人精品亚洲午夜| 国产精品自在欧美一区| 欧美一区二区精品久久911| 亚洲影院在线观看| 国产日韩欧美高清免费| 久久综合99re88久久爱| 久久久视频精品| 亚洲欧洲美洲综合色网| 国产精品红桃| 亚洲欧洲日产国产网站| 久久综合色婷婷| 久久久久久久久久久久久9999| 国色天香一区二区| 欧美激情精品久久久久久久变态 | 欧美精品一区二区久久婷婷| 一区视频在线看| 牛牛影视久久网| 欧美.www| 亚洲无毛电影| 香蕉av777xxx色综合一区| 黄页网站一区| 欧美国产日韩精品| 亚洲日本激情| 一区二区三区精品| 国产视频不卡| 欧美激情在线| 国产美女精品在线| 欧美二区乱c少妇| 欧美婷婷六月丁香综合色| 欧美在线视频免费| 免费高清在线视频一区·| 亚洲素人在线| 最新国产精品拍自在线播放| 亚洲国产婷婷香蕉久久久久久99 | 午夜久久福利| 欧美va天堂在线| 欧美国产精品人人做人人爱| 国内外成人在线视频| 久久综合狠狠综合久久综合88| 蜜桃av噜噜一区| 一区二区精品在线| 韩国av一区二区三区四区| 美女视频网站黄色亚洲| 久久综合中文字幕| 中文精品视频| 国产亚洲精品资源在线26u| 久久国产精品第一页| 午夜国产精品视频免费体验区| 国产日韩精品电影| 欧美精品一区二区高清在线观看| 免费永久网站黄欧美| 日韩午夜电影av| 亚洲天堂网站在线观看视频| 99精品久久久| 亚洲国产欧美一区二区三区久久| 亚洲深夜激情| 亚洲精美视频| 久久精品国产99国产精品澳门| 亚洲视频网在线直播| 欧美gay视频| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产精品国产福利国产秒拍| 亚洲欧洲一区二区三区| 在线精品一区二区| 久久久夜精品| 米奇777在线欧美播放| 在线国产精品播放| 久久亚洲精品一区二区| 久久蜜桃资源一区二区老牛| 国产欧美一区二区白浆黑人| 亚洲影院高清在线| 欧美一激情一区二区三区| 国产精品久久激情| 一区二区三区视频在线| 欧美a级一区二区| 激情久久影院| 久久久久久九九九九| 久久综合给合| 一区二区三区中文在线观看| 久久久久久久性| 美女主播精品视频一二三四| 在线日韩电影| 欧美黄污视频| 一区二区三区欧美日韩| 欧美一区二区私人影院日本| 国产一区二区三区最好精华液| 久久成人免费电影| 欧美成人午夜| 亚洲精品久久视频| 欧美日韩一区自拍| 亚洲视频碰碰| 久久久久网址| 亚洲经典视频在线观看| 欧美久久久久久久久久| 一区二区三区欧美日韩| 久久久久国产精品厨房| 影音先锋久久| 欧美精品久久久久久久| 亚洲天堂偷拍| 鲁大师影院一区二区三区| 亚洲精品免费观看| 国产精品久久久久一区二区| 久久av一区二区三区| 亚洲国产你懂的| 欧美影院在线| 亚洲精品在线一区二区| 国产欧美日韩精品丝袜高跟鞋| 欧美伊人久久大香线蕉综合69| 免费一级欧美片在线播放| 亚洲深夜福利| 国产婷婷色综合av蜜臀av| 欧美久久一级| 欧美一级二区| 日韩视频一区二区三区在线播放免费观看 | 欧美在线播放| 91久久精品一区| 亚洲欧美综合网| 亚洲高清一二三区| 国产精品一二| 欧美激情一区| 久久国产一区| 亚洲欧美日韩成人| 亚洲精品视频在线观看免费| 久久亚洲精品一区二区| 亚洲欧美一区二区三区在线| 亚洲精品一二区| 黄色在线成人| 国产欧美日韩高清| 国产精品v欧美精品v日韩精品 | 99热免费精品| 另类亚洲自拍| 久久精品在线观看|