MFC相關知識點

2021-08-26 23:02:59 字數 3156 閱讀 5212

本部落格內容:

一、mfc訊息對映機制

二、mfc單文件框架講述

三、mfc的基本類有哪些

四、windows程式執行

五、sendmessage 和postmessage的異同

參考:

mfc是windows下的乙個類庫,主要是封裝了win32 api函式,並設計了一套方便的訊息對映機制。

具體實現方法:在每個能接收和處理訊息的類中,定義乙個訊息和訊息對映表。

在訊息對映表中,訊息與對應的訊息處理函式指標是成對出現的,也就是他們是繫結在一起的。

當有訊息需要處理時,程式只要在訊息對映表中檢視是否含有該訊息,就知該類是否能處理此訊息。

大致講一下,windows sdk下的訊息機制實現

windows的訊息都是和執行緒相對應的,即windows會把訊息傳送給該訊息相對應的執行緒。

sdk模式下,程式是通過getmessage()函式從某個執行緒相對應的訊息佇列裡邊把訊息取出來並放到乙個特殊的結構體裡面,訊息結構體msg;引數有:

視窗過程相關的視窗控制代碼

訊息的id號

訊息相關的引數(2個)

時間

傳送時的滑鼠位置

然後translatemessage函式用來把虛鍵訊息翻譯成字元訊息並放到響應的訊息佇列中,最後由dispatchmessage函式把訊息分發到相關的視窗過程。然後視窗過程根據訊息的型別對不同的訊息進行分別的處理,相對比較麻煩,mfc把訊息呼叫的過程給封裝起來了,使得使用者能夠通過classwizard方便的使用和處理windows的各種訊息。

重點來了……………….

mfc框架結構下,可以進行訊息處理的類的標頭檔案中都含義declare_message_map()巨集,

主要進行訊息對映和訊息處理函式的宣告。

這類的實現檔案中都有:begin_message_map end_message_map

這裡主要進行訊息對映的實現和訊息處理函式的實現

注意:所有能夠進行訊息處理的類都是基於ccmdtarget類的,就是說ccmdtarget類是所有可以進行訊息處理類的父類。

ccmdtarget類是mfc處理命令訊息的基礎和核心。

同時mfc定義了2個主要的結構體:

afx_msgmap_entry

afx_msgmap

結構一包含了乙個訊息的所有相關資訊。包括:id號,訊息的動作標識,乙個指向和該訊息相應的執行函式的指標

結構二afx_msgmap主要作用是2個:1.用來得到基類的訊息對映入口位址,2.得到本身的訊息對映入口位址。

實際上,mfc把所有的訊息一條條地填入到afx_msgmap_entry結構體中,形成乙個陣列,同時通過afx_msgmap得到該陣列的首位址,同時得到基類的訊息對映入口位址,如果本身不響應,就呼叫基類的。

mfc如何讓視窗過程來處理訊息?(了解即可)

實際上所有mfc的視窗類都通過鉤子函式來截獲訊息,並且在鉤子函式中把視窗過程設定為afxwndproc。

1.函式afxwndproc接受windows作業系統傳送的訊息

2.它呼叫afxcallwndproc進行訊息處理

3.又會呼叫cwnd類的windowproc進行訊息處理。

4.又呼叫onwndmsg進行正式的訊息處理。

由classwazerd建立的單文件程式中主框架包含:

文件、檢視、框架、文件模板:

文件物件用於管理和維護資料,包括儲存資料,取出資料以及修改資料操作,資料修改之後,文件可以通知其對應的所有檢視更新顯示。

檢視:檢視物件將文件中資料視覺化,負責從文件物件中取出資料顯示給客戶,並接受使用者的輸入和編輯,將資料的改變反映給文件物件,檢視充當了文件和使用者之間媒介的角色。

框架:乙個文件可能有多個檢視介面,就需要框架來管理。框架就是管理文件和檢視的。框架視窗是應用程式的主視窗,程式執行時時會先建立乙個最頂層的框架視窗。

文件模板:文件模板中存放了與文件、檢視和框架相關的資訊,程式通過文件模板建立文件物件,框架視窗物件和檢視物件。

自動生成的**中,框架類繼承於cframewndex中,文件類繼承與cdocument類,檢視類繼承於cview類。

mfc構造順序:參考:

輸入裝置→產生事件→作業系統→發生訊息→應用程式→呼叫api→輸出裝置

windows程式主要是由訊息和事件進行驅動。

應用程式可以通知os執行某個具體的動作,如os控制音效卡發出聲音,但是並不知道何時發出聲音,得由應用程式告訴os何時發出什麼聲音。在應用程式中要完成某個功能,都是以函式呼叫的形式來實現的。os把它所有能完成的功能以函式的形式提供給應用程式使用,應用程式對這些函式的呼叫叫系統呼叫。這些函式的集合叫做windows api. 不可死記硬背。

windows是事件驅動的,所謂事件就是應用程式做了什麼事情或程式使用者通過輸入裝置做了哪些事情。

舉例:os能夠將輸入裝置的變化上傳給應用程式。如使用者在某個活動中,按了鍵盤,作業系統馬上感知該事件,並且知道使用者按了那個鍵,os並不決定對這個時間做反應,而是交給應用程式,由程式來做出反應。

通過訊息機制來實現的。

os為每個事件都包裝成乙個稱為訊息結構體msg來傳遞應用程式。

msg是乙個結構體。包括:控制代碼、訊息代號、引數、時間、點座標等

1. postmessage:只把訊息放入佇列,不管其他程式是否處理都返回,然後繼續執行,是個非同步訊息投放函式

而sendmessage必須等待其他程式處理訊息完了之後才返回,繼續執行,這是個同步訊息投放函式。

2. postmessage的返回值表示該函式是否執行正確。

sendmessage返回值表示其他程式處理訊息後的返回值。

3. 如果位於同乙個執行緒中,post傳送訊息時,訊息要先放入執行緒的訊息佇列,然後dispatch到目標視窗。

sendmessage傳送訊息時,系統直接呼叫目標視窗的訊息處理程式,並將結果返回,就是說sendmessage在同乙個執行緒中傳送訊息時並不入執行緒訊息佇列。

相關知識點

nweb inf uclasses uweb.xml ulib n 從httpservlet 繼承,重寫doget dopost方法 n部署web.xml n 只有乙個物件 n 第一次請求的時候被初始化,只一遍 n 初始化後先呼叫init 方法,只一遍 n 每個請求,呼叫一遍service serv...

自用MFC知識點記錄

第一次做mfc軟體,用到的相關知識記錄。1.控制項文字 cstring str getdlgitemtext idc str 獲得控制項文字 setdlgitemtext idc str 設定控制項文字 另外還能通過設定控制項變數來獲得文字值 updatedata true 從控制項獲取值 m ed...

MFC學習知識點20160715

1.sizeof 返回所查詢目標所占用位元組數 countof 返回所查詢目標所含有元素個數 countof 是 c 中計算乙個固定大小陣列長度的巨集,比如 t arr 10 for size t i 0 i countof arr i do something 2.可以用畫填充背景色矩形的方法來清...