MFC Windows 程式設計 第四章 選單

2021-06-17 20:54:10 字數 3684 閱讀 7814

編譯一次後就不用再編譯了,而已加快程式編譯速度,一般將不更改的標頭檔案、c執行時標頭檔案和其他靜態型別標頭檔案包含在裡面。

2、基於檢視的應用程式體系結構wm_paint和使用者區滑鼠訊息、鍵盤訊息處理程式都必須在檢視中進行處理,所有在框架視窗使用onsetfocus(焦點傳遞給檢視)

和過載oncmdmsg(可以在框架視窗、檢視、應用程式類中均可處理命令處理程式和更新處理程式)。

3、可以在vc6工作區的resource view標籤裡直接編輯加速鍵、選單、圖示、對話方塊、字串資源、版本資訊,手工修改時,必須使用open as text 命令開啟。

4、頂層選單(無命令id)、下拉式選單、彈出式選單、選單項、系統選單(alt+空格可喚出),選單項由menu item ids(選單id)或command ids(命令id)唯一確定。

5、mfc類cmenu選單類的成員m_hmenu持有選單控制代碼,可以通過cmenu::trackpopupmenu顯示上下文選單,cmenu::enablemenuitem、drawitem和measureitem。

6、可以呼叫createmenu、insertmenu建立選單,另一種是通過cmenu::loadmenuindirect建立,常用的是用rc資源檔案定義,可以通過資源編輯器進行編輯,在應用程式執行時載入生成的選單。

7、資源檔案為二進位制物件,由rc.exe編譯鏈結到應用程式的exe檔案中,包含選單、圖示、位圖、字串資源,由乙個字串或者整形id唯一確定。

8、選單項由#define語句定義,在afxres.h標頭檔案中定義了一些常用的選單項,自定義選單項範圍建議在0x8000-0xdfff之間,選單項使用popup定義頂級選單,menuitem定義選單項,&定義與alt一起

使用的快捷鍵,separator定義小橫線分隔選單項,使用(...)表示該項選中後還需要進一步輸入,使用製表符(\t)分隔加速鍵,使文字對齊,使用grayed使選單項無效,使用checked使選單項複選。

9、選單項載入 cframewnd::create和cframewnd::loadframe和cmenu::loadmenu,使用cmenu可以載入多個選單。

10、選單項命令響應:wm_initmenu、wm_initmenupopub、wm_menuseect、wm_command,使用者選中選單會發生wm_command命令,wparam引數低位保留蓋選單項的id,mfc使用訊息對映巨集來處理選單命令,

命令處理程式:om_command(id_file_new, onfilenew),命令處理程式可以隨意命名,與訊息處理程式名稱固定不同,批量命令處理程式:on_command_range(id_first,id_end,oncommand)

ui更新處理程式:on_update_command_ui(command_id,onupdatecommand);批量ui更新處理程式:on_update_command_ui_range(command_first,command_end,onupdatecommand);

更新處理程式使用ccmdui的成員函式enable、setcheck、setradio、settext更新選單狀態,ccmdui.m_nid儲存選單項id,命令處理程式和更新處理程式可同時處理下拉列表和彈出的上下文選單等多個地方。

11、加速鍵:accelerators也引發wm_command命令,可以通過cframewnd::loadacceltable載入加速鍵(使用巨集makeintresource將整形轉換成字串),loadframe也可以載入,如果加速鍵資源id

和選單資源id相同,則可以通過這個命令一起載入,cframewnd對加速鍵做了處理,如果繼承自cwnd則必須與cframewnd一樣對加速鍵做處理,使用加速鍵可以確保命令發生到主視窗而不是擁有

輸入焦點的子視窗,加速鍵可以脫離選單使用。   

來編輯選單項,先通過cwnd::getmenu來獲取頂層選單,cmenu::getsubmenu可以獲取子選單,刪除選單時,可以通過位置(mf_byposition)和選單id(mf_bycommand)來進行,修改選單時,如果

修改的是子選單,則第三個引數使用選單控制代碼而不是選單id,控制代碼通過cmenu->m_hmenu獲得。

系統選單通過getsystemmenu來獲得,引數為false時,指向系統選單副本,引數為true時,重置系統選單,系統選單命令在on_wm_syscommand(onsyscommand)訊息對映中執行,可以在此函式中對系統

選單做處理,第乙個引數nid包含選單id,使用(nid & 0xfff0)獲取選單id。

模板不支援mf_ownerdraw,使用cmenu::modifymenu實現傳統選單項到自製選單項的轉換,在自製選單第一次顯示時,會發生wm_measureitem訊息,詢問選單項的尺寸,

函式原型:afx_msg void onmeasureitem(int nidctl, lpmeasureitemstruct lpmis), lpmeasureitemstruct中的ctltype為odt_menu表示為選單,itemid為選單項id,itemwidth和itemheight

為高度和寬度,一般指定為lpmis->itemheight = ::getsystemmetrics(sm_cymenu)(系統選單欄高度),寬度為高度的4倍。之後wm_drawitem訊息會發生,在此函式中畫自製選單

函式原型:afx_msg void ondrawitem(int nidctl, lpdrawitemstruct lpdis),lpdis結構中的itemaction包含oda_drawentire時,重畫所有選單,oda_select加亮和不加亮顯示,畫部分選單,

itemstate包含ods_checked、ods_disabled、ods_grayed、ods_selected,另外可以直接使用cmenu::measureitem和cmenu::drawitem來重畫選單,在onmenuchar訊息處理函式中增加鍵盤快捷鍵。

14、使用巢狀的方式實現層疊選單,在模板中勾選pop-up選項,可新增層疊選單,上下文選單,在單擊右鍵時,windows會發生wm_contextmenu訊息,可在對應的訊息處理過程中實現右鍵選單,右鍵選單可

通過cmenu::trackpopupmenu函式來顯示,函式原型:bool trackpopupmenu(uint nflags, int x, int y, cwnd* pwnd lprect lprect = null),nflags包含tmp_leftalign以及tmp_leftbutton

和tmp_returncmd等標誌,x、y表示螢幕座標,pwnd確保視窗能收到選單各種操作引發的訊息(滑鼠下面的視窗),上下文選單可通過資源載入方式和cmenu成員函式來實現,tmp_leftalign表示對齊方式,tmp_leftbutton

表示使用滑鼠左右鍵啟用選單,tmp_returncmd表示選中選單項的命令id,預設情況下如果選單項沒有命令和更新處理程式,選單項則無效,如果使用tmp_returncmd,則必須將框架視窗的

m_bautomenuenable設定為false。

15、檢視建立時,傳遞afx_idw_pane_first表明活動視窗id,windows不允許直接把點陣圖「位塊傳送」(blit)到顯示表面,必須先選入記憶體dc,再把他複製到螢幕dc中,使用obm_check點陣圖id,

必須在stdafx.h標頭檔案中包含afxwin.h語句之前增加#define oemresource,在編輯選單時,可以使用id_color_red=10000,指定選單id,使用range巨集時,選單必須是連續的,框架視窗是選單的所有者

接收wm_measureitem和wm_drawitem訊息,自製上下文選單彈出時,也需傳送到框架視窗。   

第四章 程式設計

選擇語言的原則 最少的工作量原則 最少技巧性原則 最少錯誤原則 最少維護原則 減少記憶原則 總原則 先求正確後求快 先求清晰後求快 求快不忘保持程式正確性 保持程式整潔以求快 不要因效率而犧牲清晰 好程式標準 易於測試和除錯 易於維護 易於修改 設計簡單 高效率結構化程式設計主要包括兩方面 在編寫程...

程式設計珠璣第四章

正文裡面涉及到程式設計方法學的內容。不再細述 1 加及條件是0 l u n 1 2 這個函式可以寫成如下形式 int bs int a,int begin,int end,int v if e a end e v return e a return 1 再給一段測試 include include ...

Python核心程式設計 第四章

1.所有的python物件都擁有三個特性 身份,型別和值。型別 物件的型別決定了該物件可以儲存什麼型別的值,可以進行什麼樣的操作。可以用type 檢視python物件的型別。值 物件表示的資料項。2.物件的一系列固有行為和特性 比如支援哪些運算,具有哪些方法 必須事先定義好。從這個角度看,型別正是儲...