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

思勤無邪

上學時,因我年齡最小,個頭也最小,上課時,就像大猩猩堆里的猴一般。如今,這猴偶爾也把最近的一些情況寫在這里。

   :: 首頁 :: 聯系 :: 聚合  :: 管理
  132 Posts :: 1 Stories :: 178 Comments :: 0 Trackbacks

公告

     吾日常三省吾身,曰思、曰勤、曰無邪。

積分與排名

  • 積分 - 187330
  • 排名 - 140

最新隨筆

最新評論

閱讀排行榜

評論排行榜

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 .源文件是單獨參與編譯的。

posted on 2006-05-31 17:45 思勤無邪 閱讀(6864) 評論(3)  編輯 收藏 引用 所屬分類: C++

Feedback

# re: VC++菜單編程[未登錄] 2011-04-13 16:43 路人甲
彈出菜單(pop up)可以做響應!  回復  更多評論
  

# re: VC++菜單編程[未登錄] 2011-04-13 16:45 路人甲
對OnContextMenu事件進行響應就行,在這個事件中創建CMenu,調用CMenu的成員函數TrackPopupMenu,另外對這個Menu的各個項進行響應就行了。  回復  更多評論
  

# re: VC++菜單編程[未登錄] 2011-05-17 19:32
果然2,人家說菜單無法進行事件響應,偏要扯到彈出窗口上去。@路人甲
  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一本色道久久综合亚洲91| 欧美精品午夜视频| 欧美国产在线视频| 欧美 日韩 国产在线 | 欧美日韩另类一区| 欧美女激情福利| 国产精品久久久久久亚洲调教| 欧美性猛交视频| 国产精品专区h在线观看| 国产伦精品一区二区三区视频黑人 | 亚洲国产欧洲综合997久久| 国产一区二区三区在线观看免费| 欧美日韩一区自拍| 国产精品久久久久影院色老大| 国产精品日韩欧美一区二区三区 | 尤物yw午夜国产精品视频| 亚洲国产婷婷综合在线精品| 日韩亚洲欧美综合| 欧美在线免费视屏| 欧美大色视频| 亚洲亚洲精品在线观看| 久久免费黄色| 国产精品二区三区四区| 在线视频国内自拍亚洲视频| 亚洲免费在线观看视频| 欧美.www| 性欧美精品高清| 欧美日韩福利视频| 欧美吻胸吃奶大尺度电影| 亚洲午夜精品久久久久久app| 欧美在线视频一区| 欧美日韩不卡合集视频| 一区二区三区在线免费播放| 亚洲欧美日韩爽爽影院| 亚洲激情网站| 一区二区三区产品免费精品久久75| 久久九九全国免费精品观看| 欧美日韩精品一二三区| 亚洲国产99精品国自产| 欧美在线一区二区三区| 99re6热在线精品视频播放速度| 久久久久欧美精品| 国产欧美亚洲一区| 亚洲一区日韩| 亚洲人成网站999久久久综合| 久久久久在线观看| 国产日韩欧美自拍| 香蕉国产精品偷在线观看不卡| 亚洲第一毛片| 美女日韩欧美| 亚洲国产精品一区二区第四页av | 一本色道久久综合亚洲精品婷婷 | 亚洲欧美日韩成人| 欧美私人网站| 在线视频一区观看| 亚洲国产精品久久人人爱蜜臀| 久久精品人人做人人爽电影蜜月| 国产精品毛片在线看| 中文在线不卡| av成人毛片| 欧美日韩国产亚洲一区| 99国产精品私拍| 亚洲国产精品久久久久婷婷884 | 国产欧美一区二区三区在线看蜜臀 | 久久成人免费| 亚洲少妇在线| 国产精品久久久一本精品| 亚洲女ⅴideoshd黑人| 亚洲婷婷综合色高清在线| 国产精品久久久一本精品| 中日韩高清电影网| 夜夜爽av福利精品导航 | 欧美伊久线香蕉线新在线| 国产视频精品va久久久久久| 久久久噜噜噜久噜久久| 国产亚洲精品v| 91久久一区二区| 久久看片网站| 亚洲国产高潮在线观看| 亚洲国产精品成人精品| 欧美日韩午夜激情| 亚洲欧美日韩精品久久| 亚洲欧美一级二级三级| 国内成人自拍视频| 亚洲福利久久| 国产精品成人一区二区网站软件| 性久久久久久久| 久久男女视频| 亚洲视频在线播放| 欧美一区二区三区免费视| 伊人精品成人久久综合软件| 最新中文字幕亚洲| 国产日韩亚洲欧美综合| 欧美激情视频给我| 国产精品极品美女粉嫩高清在线 | 亚洲国产欧美日韩| 国产精品高清在线| 久久综合影视| 欧美日韩一级黄| 麻豆精品在线观看| 国产精品电影观看| 亚洲第一级黄色片| 国产视频一区欧美| 99国产精品视频免费观看| 韩国av一区二区三区在线观看| 亚洲国产精品视频一区| 国产欧美综合在线| 一本久道久久综合婷婷鲸鱼| 永久免费精品影视网站| 亚洲在线观看视频网站| 99亚洲精品| 久久久久久久97| 午夜精品免费| 欧美日韩三级| 亚洲国产天堂久久综合网| 国产一区二区三区丝袜| 在线视频精品一| 亚洲免费播放| 毛片精品免费在线观看| 久久青草久久| 国产欧美日韩免费看aⅴ视频| 亚洲精品专区| 亚洲美女免费视频| 免费在线亚洲欧美| 免费看的黄色欧美网站| 国产在线精品一区二区中文| 亚洲综合二区| 欧美一二区视频| 国产精品久久久久国产精品日日| 亚洲精品国产系列| 亚洲欧洲日产国码二区| 久久色中文字幕| 免播放器亚洲一区| 一区精品在线| 久久麻豆一区二区| 欧美视频精品一区| 亚洲图片欧洲图片日韩av| 亚洲免费精彩视频| 一区二区三区免费观看| 欧美日韩999| 亚洲最新视频在线| 亚洲一区二区高清视频| 国产精品福利在线观看| 亚洲综合三区| 久久精品视频在线观看| 狠狠色综合网| 蜜桃av噜噜一区二区三区| 欧美大片免费看| 一区二区不卡在线视频 午夜欧美不卡在| 久久尤物视频| 亚洲国产日韩欧美| 亚洲少妇自拍| 国产乱人伦精品一区二区 | 亚洲一二三区在线| 性欧美暴力猛交69hd| 国产亚洲成av人在线观看导航| 久久精品国产一区二区三区免费看| 老司机精品福利视频| 91久久精品久久国产性色也91| 欧美精品www| 中文在线一区| 久久夜色撩人精品| 日韩视频免费在线| 国产精品一区二区你懂的| 久久福利毛片| 亚洲乱码国产乱码精品精可以看 | 一区二区三区成人精品| 久久激五月天综合精品| 亚洲国内自拍| 国产精品扒开腿做爽爽爽软件| 亚洲综合电影| 亚洲国产精品久久久久| 欧美在线免费看| 日韩手机在线导航| 国产日韩欧美一区二区三区在线观看| 久久久久久久久综合| 亚洲色图制服丝袜| 亚洲第一二三四五区| 午夜久久久久| 99热精品在线观看| 狠狠色狠狠色综合日日91app| 欧美va天堂| 欧美在线精品一区| 日韩亚洲欧美在线观看| 免费日本视频一区| 亚洲欧美另类国产| 亚洲看片网站| 一区二区在线视频| 国产精品午夜国产小视频| 欧美黑人在线观看| 久久久久久久一区二区| 亚洲主播在线| 日韩视频一区二区在线观看 | 欧美剧在线观看| 久久久精品免费视频| 亚洲一区二区精品视频| 亚洲久久在线| 一区二区三区www| 亚洲高清网站| 老司机午夜免费精品视频 |