MFC 應用開發中 複習

2022-07-20 09:36:11 字數 2081 閱讀 7016

//hwnd 和 cwnd

hwnd是windows系統中對所有視窗的一種標識,即視窗控制代碼,這是乙個sdk概念

cwnd是mfc類庫中所有視窗類的基類,微軟在mfc中將所有視窗的通用操作都封裝到了這個類中,如:showwindow等等,同時它封裝了視窗控制代碼即m_hwnd

由hwnd得到cwnd*

cwnd wnd;

hwnd hwnd;

wnd.attach(hwnd)

通常乙個視窗資源已經和乙個cwnd類的物件關聯起來的,由於一般來說,這個類是自己建立的,所以自然知道,怎麼得到指向這個類的指標。

如果沒有就cwnd物件,將這個物件與視窗資源的hwnd控制代碼關聯起來,(如上面的attach)

如果用static cwnd* cwnd::fromhandle(hwnd hwnd);

則返回值是乙個暫時的cwnd物件,並且我們確保返回值為非空,也就是hwnd有效的。

static cwnd* cwnd::fromhandlepermanent(hwnd hwnd) ;

返回的是乙個永久的物件。只有在返回的cwnd在類表裡已經存在是返回值為非空。

由cwnd獲得hwnd就容易的多了,因為它的乙個成員m_hwnd就是視窗對應的控制代碼。

wnd->m_hwnd;

hdc 與 cdc 同上

hdc 為裝置控制代碼, cdc為抽象的類, hdc為cdc的乙個成員變數

//sendmessage postmessage原理

1、sendmessage、postmessage的執行機制

sendmessage可以理解為,sendmessage函式傳送訊息,等待訊息處理完成後,sendmessage才返回,稍稍深入一些,是等待視窗處理函式返回後,sendmessage就返回了

postmessage可以理解為,postmessage函式傳送訊息,不等待訊息處理完成,立刻返回,稍稍深入一些,postmessage只管傳送訊息,訊息有沒有被送到並不關心,

只要傳送了訊息,便立刻返回。

2、sendmessage、postmessage的執行內幕

sendmessage的msdn解釋:sendmessage傳送訊息到指定的訊息視窗,它呼叫特定視窗的視窗處理函式,並且不立即返回,直到視窗處理函式處理了這個訊息。

postmessage的msdn解釋:postmessage函式將乙個訊息放入與建立這個視窗的訊息佇列相關的執行緒中,並立刻返回,不等待執行緒處理。

sendmessage確實是傳送訊息,然後等待處理完成返回,但傳送訊息的方法為直接呼叫訊息處理函式(即wndproc函式),按照函式呼叫規則,肯定會等待訊息處理函式

返回後sendmessage才返回。而postmessage卻沒有傳送訊息,postmessage是將訊息放入到訊息佇列中, 然後立刻返回,至於訊息何時被處理,postmessage完全不知道

此時只有訊息迴圈知道被postmessage的訊息何時被處理了。

2、sendmessage、postmessage的內部實現

訊息迴圈從訊息佇列裡取訊息

訊息迴圈:

while (getmessage(&msg, null, 0, 0))

{translatemessage(&msg);

dispatchmessage(&msg);

translatemessage

函式功能描述:將虛擬鍵訊息轉換為字元訊息。字元訊息被送到呼叫執行緒的訊息佇列中,在下一次執行緒呼叫函式getmessage或peekmessage時被讀出。

dispatchmessage函式

函式功能:該函式排程乙個訊息給視窗程式。通常排程從getmessage取得的訊息。訊息被排程到的視窗程式即是mainproc()函式。

總結:translatemessage函式將鍵盤訊息轉化,dispatchmessage函式將訊息傳給窗體函式去處理.

關於自定義訊息響應函式 的返回值,在vs中返回值必須為lresult ,不然的話會報錯的。

自定訊息4步:

1、自定義訊息號

2、自定義訊息響應函式 在vs中返回值用lresult

3、將訊息號與訊息響應函式繫結on_message()

4、呼叫::sendmessage 傳送訊息

移動應用開發複習重點

中的表示式可以是函式和變數的呼叫 function name let str i love because he is handsome.i love songcubi,because he is handsome.let a karry wang let str2 i love because h...

mfc中的socket應用

自動上報資料 int stdcall apientry k1getdata long cbaddress,inta localport 獲得本地ip char hostname 255 myerror gethostname hostname,sizeof hostname if myerror 0...

MFC中多執行緒的應用

做專案中涉及到多執行緒的操作,所以學習了一下mfc中多執行緒的用法!包括控制代碼的定義 初始化,執行緒函式的定義 初始化,鎖的使用。控制代碼的定義 cwinthread thread1 執行緒函式的定義 static uint thread1 func lpvoid lpparam 加static表...