第六講,選單程式設計

2021-06-18 08:57:44 字數 1793 閱讀 6700

訊息的捕獲流程:

標準訊息:除wm_command之外,所有wm_開頭的訊息,從cwnd派生的類,都可以接收到該類訊息;

命令訊息:來自選單、加速鍵或工具欄按鈕的訊息,這類訊息都以wm_command呈現。在mfc中,通過選單項的標識(id)來區分不同的命令訊息;在sdk中,通過訊息的wparam引數識別。從ccmdtarget派生的類,都可以接收到這類訊息。

通告訊息:由控制項產生的訊息,比如按鈕的單擊,列表框的選擇等均產生該類訊息,為的是向其父視窗(通常是對話方塊)通知事件的發生,這類訊息也是以wm_command呈現的。從ccmdtarget派生的類,都可以接收到該類訊息。

標準訊息和命令訊息是向本視窗傳送的訊息;通告訊息是由子視窗向父視窗傳送的訊息,如按鈕等本身也是乙個視窗,當本身狀態改變時向其父類傳送訊息。

下面,我們以menu這個程式為例,來看看

響應選單項命令的順序依次是:視類、文件類、框架類,最後才是應用程式類。

選單命令訊息路由的具體過程:當單擊某個選單項時,最先接收到這個選單命令訊息的是框架類。框架類將把接收到的這個訊息交給它的子視窗。即視類,由視類首先進行處理。視類首先格局命令訊息對映機制查詢自身是否對此訊息進行了響應,如果響應了,就呼叫相應響應函式對這個訊息進行處理,訊息路由過程結束;如果視類沒有對此命令訊息做出響應,就交由文件類,文件類同樣查詢自身是否對這個選單命令進行了響應,如果響應了,就有文件類的命令訊息響應函式進行處理,路由過程結束。如果文件類也未做響應,就把這個命令訊息交還給視類,後者又把該訊息交還給框架類。框架類檢視自己是否對這個命令訊息進行了響應,如果它也沒有做出響應,就把這個選單命令訊息交給應用程式類,由後者來進行處理。

訪問子選單只能夠通過索引進行訪問,訪問子選單項可以通過子選單項的索引或者它的標識進行訪問。

getmenu():返回框架視窗的選單欄cmenu的指標。

cmenu有乙個函式getsubmenu()返回乙個指向子選單的cmenu指標。

getmenu()->getsubmenu(0)->checkmenuitem(0,mf_byposition|mf_checked);
getmenu獲取選單欄,getsubmenu獲取子選單,checkmenuitem對子選單項進行操作,建立乙個標記選單。

設定乙個圖形標記選單:setmenuitembitmaps()。

設定預設選單:setdefaultitem(),乙個子選單中只能有乙個預設選單項。

選單項狀態的維護是依賴於cn_update_command_ui訊息,誰捕獲cn_update_command訊息,mfc就在其中建立乙個ccmdui物件,我們可以通過手工活利用class wizard在訊息對映中新增on_update_command_ui巨集來捕獲cn_update_command_ui訊息。

在後台所做的工作是:作業系統發出wm_initmenepopup訊息,然後由mfc的基類如cframewnd接管,它建立乙個ccmdui物件,並與第乙個選單項相關聯,呼叫物件的乙個函式doupdate(),這個函式發出cn_update_command_ui訊息,這個訊息帶有指向ccmdui物件的指標。同乙個ccmdui物件就設定為與第二個選單項相關聯,這樣順序執行,直到完成所有選單項。

從第乙個選單項開始更新,一直更新到最後乙個,如果該選單項捕獲了該訊息,就對該選單項進行更新。

更新命令ui處理程式僅應用於彈出式選單項上的專案,不能應用於永久顯示的頂級選單專案。

第六講 if 語句

格式 單分支if 條件測試命令 then 命令序列 fi 多分支 if then 命令序列 else 命令序列 fi bin bash data new create if f file then echo exist file cat file wc l rm file else touch fi...

第六講感悟

方法是處理業務邏輯的 滿足使用者需求,有開發者設計的具有一定邏輯的 鄙人認為可以把方法看作是數學中的方程式,帶入因變數進行計算,得到所要求得的值 方法應盡可能單 一 簡單 容易理解。因此關於方法的返回值 有return語句的方法有可能還需被呼叫到其他方法中去使用 類似於三元一次方程兩兩相消後再求一次...

第六講 堆疊操作

本節中的例子其結構和例1一樣,僅改變mydisplay和myreshape。例4 利用堆疊繪製三個物體 乙個綠色的茶壺,乙個藍色的茶壺,乙個紅色的立方體 部分 void mydisplay void void myreshape glsizei w,glsizei h 執行後,我們可以看到左邊為乙個...