日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

VC++学习(6):菜单编程

發布時間:2025/3/15 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VC++学习(6):菜单编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


1.?????? MFC中的頂層菜單默認為彈出菜單(Pop-up),它是不能用來作命令響應的,當取消Pop-up選項后可接受命令響應。


2.?????? 消息的分類:標準消息,命令消息,通告消息。

[標準消息]:除WM_COMMAND之外,所有以WM_開頭的消息。從CWnd類派生的類都可以接收到這一消息;

[命令消息]:來自菜單、加速鍵或工具欄按鈕的消息。這類消息都以WM_COMMAND呈現。在MFC中,通過菜單項的標識(ID)來區分不同的命令消息;在SDK中,通過消息的wParam參數識別。CCmdTargetCWnd的父類)派生的類都可以接收到這一類消息;

[通告消息]:由控件產生的消息,例如,按鈕的單擊,列表框的選擇等均產生此類消息,為的是向其父窗口(通常是對話框)通知事件的發生。這類消息也是以WM_COMMAND形式呈現。CCmdTargetCWnd的父類)派生的類都可以接收到這一類消息

總結:

  凡是從CWnd派生的類,既可以接收標準消息,也要以接收命令消息和通告消息。

  而對于那些從CCmdTarget派生的類,則只能接收命令消息和通告消息,不能接收標準消息。

3.?????? MFC中菜單項消息如果利用ClassWizard來對菜單項消息分別在上述四個類中進行響應,則菜單消息傳遞順序:View--Doc--CMainFrame--App類。菜單消息一旦在其中一個類中響應則不再在其它類中查找響應函數。

菜單消息與前面介紹的標準消息的實現機制是相類似的,都是在消息響應函數原型(頭文件),消息映射宏(源文件)和消息函數實現(源文件)中添加代碼。注意:文檔類與應用程序類都是由CCmndTarget類派生,所以可以接收菜單命令消息,但不能接收標準消息(只能由CWnd類派生才可以)。

具體消息路由過程:

當點擊一個菜單項的時候,最先接受到菜單項消息的是CMainFrame框架類,CMainFrame框架類將會把菜單項消息交給它的子窗口View類,由View類首先進行處理;如果View類檢測到沒對該菜單項消息做響應,則View把菜單項消息交由文檔類Doc進行處理;如果Doc類檢測到Doc類中也沒對該菜單項消息做響應,則Doc類又把該菜單項消息交還給View類,由View類再交還給CMainFrame類處理。如果CMainFrame類查看到CMainFrame中也沒對該消息做響應,則最終交給App進行處理。

4.?????? 一個菜單欄可以有若干個子菜單,一個子菜單又可以有若干個菜單項等。對菜單欄的子菜單由左至右建立從0開始的索引。對特定子菜單的菜單項由上至下建立了從0開始的索引。訪問子菜單和菜單項均可以通過其索引或標識(如果有標識的話)進行。

相關重要函數:

CMenu* GetMenu( ) ;//CWnd::GetMenu得到窗口菜單欄對象指針。

CMenu* GetSubMenu(?) ;//CMenu::GetSubMenu獲得指向彈出菜單對象指針

UINT CheckMenuItem( );//CMenu::CheckMenuItem 添加選中標識

BOOL SetDefaultItem();//CMenu::SetDefaultItem 為指定菜單設置缺省菜單項(唯一)

BOOL SetMenuItemBitmaps( );//CMenu::SetMenuItemBitmaps 設置位圖標題菜單。

UINT EnableMenuItem();//CMenu::EnableMenuItem使菜單項有效,無效,或變灰。

BOOL SetMenu( CMenu* pMenu );//CWnd::SetMenu在當前窗口上設置新菜單或移除菜單。

HMENU Detach( );//CMenu::Detach;斷開一個菜單資源與相關的類對象句柄關聯,可以定義局部對象,在使用完后調用Detach函數,則不會因為局部對象影響使用

說明:

1)在計算子菜單菜單項的索引的時候,分隔欄符也算索引的。

2int GetSystemMetrics()獲取系統信息度量。可以用它來獲取菜單標題的尺寸(后面還會使用到獲取屏目尺寸)從而設置位圖標題菜單中位圖的大小。

3)在MFCMFC為我們提供了一套命令更新機制,所有菜單項的更新都是由這套機制來完成的。所以要想利用CMenu::EnableMenuItem來自己控制菜單使用或不使用變灰等,必須要在CMainFrame的構造函數中將變量m_bAutoMenuEnable設置為FALSE

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處理程序僅應用于彈出式菜單項上的項目,不能應用于永久顯示的頂級菜單項目。

說明:可以手工或用ClassWizard來給菜單項添加UPDATE_COMMAND_UI消息響應,利用響應函數中傳進來的CCmdUI對象指針可完成設置菜單項可使用,不可使用,變灰,設置標記菜單等操作。

6,如果要想讓工具欄上的某個圖標與菜單項的某個菜單相關聯,只需要將圖標的ID設置為該菜單項的ID。

工具欄圖標的索引記數順序是:從左至右從0開始,分隔符也算索引號

?

7,利用向項目中添加VC的POPMENU控件:Project->Add to Project->Components and Controls..

系統增加的內容:A,一個菜單資源;B,在派生View類中增加了OnContextMenu()函數

說明:

1CWnd::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.

2BOOL 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(..);//在指定位置以指定的方式顯示彈出菜單。

?

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

10,動態菜單編程:

所有的資源對象都有一個數據成員保存了資源的句柄。

下面的函數可以操作子菜單(Popup菜單)或者菜單項;

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,集合類:

CStringArrayCStringArrayCDWordArrayCPtrArrayCStringArrayCUIntArrayCWordArray

其中成員函數:

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類處理

}

?

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;//獲取當前視窗口指針(單文檔框架中)

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

?

轉載于:https://www.cnblogs.com/forlina/archive/2011/07/28/2119751.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的VC++学习(6):菜单编程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 扒开腿揉捏花蒂h | 翔田千里一区 | 97se亚洲综合| 成人免费影视网站 | 国产精品一区二三区 | 免费无遮挡无码永久在线观看视频 | 超碰中文字幕 | 精品人妻一区二区免费 | 99热这里只有精品在线观看 | 欧美激情成人网 | 久久久国产精品免费 | 在线播放国产精品 | 婷婷在线看| 免费在线看黄视频 | 天天草天天 | 色开心 | 久久影视一区 | 久色影视| 免费看黄色片视频 | 久久国产精品久久久久久电车 | 午夜999| 国产成人一区在线观看 | 91在线视频精品 | 青青草草| 日本一区二区三区视频在线观看 | 欧美日韩国产一区二区三区在线观看 | 在线观看免费视频黄 | 草草影院1 | 久久精品欧美一区二区三区不卡 | 欧美三级黄色 | 精品国产一二三四区 | 精品国产乱码久久久人妻 | 国产欧美日韩激情 | 三级黄色网络 | 国产一区久久久 | 国产成人久久精品 | 日韩和一区二区 | 一级片啪啪 | 欧美日韩一区二区三区电影 | 亚洲欧美日本另类 | 亚洲欧美综合久久 | 国内av在线 | 噼里啪啦动漫高清在线观看 | 爱爱精品视频 | 新呦u视频一区二区 | 国产精品免费网站 | 99热国产 | 亚洲天堂av线 | 国产精品视频成人 | 99国产精品久久久久久久 | 日本国产三级xxxxxx | 中文在线第一页 | 五月婷婷开心中文字幕 | 色悠悠网 | 久久8| 这里只有精品国产 | 久久成人动漫 | 精品国产精品网麻豆系列 | 人妻丰满熟妇av无码久久洗澡 | 欧美一区二三区 | 欧美性生活网站 | 91精品国产成人www | 黄色片视频免费观看 | 免费av的网站 | 天堂视频一区 | 图片区亚洲色图 | 黄色大片a级 | www.狠狠爱| 国产黄色大片网站 | av午夜精品| 成年视频在线播放 | 一区二区三区人妻 | 全程偷拍露脸中年夫妇 | 在线观看黄色免费视频 | 成人h动漫精品一区二区无码 | 美丽姑娘免费观看在线观看 | 强行挺进白丝老师里呻吟 | 天天舔天天射 | 国产成人精品av在线观 | 日本人妻熟妇久久久久久 | 亚洲熟女一区二区三区 | 中文字幕免费在线看线人 | av撸撸在线 | 自拍偷拍亚洲欧洲 | 最新中文字幕久久 | 亚洲综合狠狠 | 四虎永久免费影院 | 99热导航 | 人妻va精品va欧美va | 一区二区三区日韩精品 | 天天操人人射 | 福利姬在线观看 | 中文字幕在线看 | 爱爱视频在线免费观看 | 武林美妇肉伦娇喘呻吟 | 精彩视频一区二区三区 | 爱色成人网| 熟妇大屁股一区二区三区视频 | 男女国产精品 |