Win32 MFC的基本概念

2022-07-18 03:39:08 字數 4773 閱讀 8760

一、mfc的基本概念

單文件、多文件和對話方塊框架的區別

mfc中的類繼承圖的基本框架

cview類與cdocument的關係

onpaint()和ondraw()的關係

hdc-cdc區別聯絡

runtime_class是什麼

declare_dynamic 和 implement_dynamic

declare_dyncreate 和 implement_dyncreate

declare_serial 和 implement_serial

runtime_class巨集的定義是這樣的:

#define runtime_class(class_name)

((cruntimeclass*)(&class_name::class##class_name))

其中##的意思是把##兩邊的符號都進行巨集擴充套件(如果它們是巨集的話),然後把擴充套件

後的內容連線在一起,中間不加空格。例如:runtime_class(cview)將被擴充套件成

:(cruntimeclass*)(&cview::classcview)

但這個classcview是什麼意思?原來,classcview是由declare_dynamic(cview)

引入的乙個public屬性的cruntimeclass型別的靜態成員變數:

static const afx_data cruntimeclass classcview;

原來runtime_class的作用就是引用由declare_dynamic巨集引入的靜態成員變數。

二、win32的基本問題:

1.sdk建立視窗的過程

2.getmessage函式與peekmessage函式的區別:

(1)getmessage的主要功能是從訊息佇列中「取出」訊息,訊息被取出以後,就從訊息佇列中將其刪除;而peekmessage的主要功能是「窺視」訊息,如果有訊息,就返回true,否則返回false。也可以使用peekmessage從訊息佇列中取出訊息,這要用到它的乙個引數(uint wremovemsg),如果設定為pm_remove,訊息則被取出並從訊息佇列中刪除;如果設定為pm_noremove,訊息就不會從訊息佇列中取出。

(2)getmessage每次都會等待訊息,直到取到訊息才返回;而peekmessage只是查詢訊息佇列,沒有訊息就立即返回,從返回值判斷是否取到了訊息。

sendmessage()和postmessage()的區別

3. 傳送wm_quit訊息使程式終止的內部過程:

wm_close:

在系統選單裡選擇了「關閉」或者點選了視窗右上角的「x」按鈕,你的視窗過程就會收到wm_close。defwindowproc對 wm_close的處理是調destroywindow。 當然,你可以不讓defwindowproc處理,而是自己處理,例如詢問使用者是否儲存更改等。如果使用者選擇「取消」,你忽略此訊息,那麼程式照常執行;如果使用者確認要退出,你就呼叫destroywindow。

wm_destroy:

接下來,destroywindow完成視窗的清理工作,最後向視窗過程傳送wm_destroy。對於 wm_destroy,defwindowproc不會處理。也就是說,你如果不處理這個訊息,雖然你的視窗已經銷毀,但程序並不會結束。一般處理 wm_destroy時都是釋放資源(例如申請的記憶體等),然後呼叫postquitmessage。

wm_quit:

postquitmessage會傳送wm_quit給訊息佇列。注意,wm_quit永遠不會到達視窗過程,因為getmessage得到wm_quit後就會返回false,從而結束訊息迴圈,最後程序結束,程式退出。

4.translatemessage及 dispatchmessage的作用

mfc的訊息處理機制:

winsows訊息佇列把得到的訊息傳送到執行緒訊息佇列, 執行緒訊息佇列每次取出一條訊息傳送到指定視窗,不斷迴圈直到程式退出.

這個迴圈就是靠訊息

while(getmessage())

translatemessage();

dispatchmessage();

}    

實現的。

getmessage()只是從執行緒訊息中取出一條訊息,而dispatchmessage 則把取出的訊息傳送到目的視窗。

translatemessage是翻譯需要翻譯的訊息   dispatchmessage()則會把翻譯好的訊息傳送到系統的訊息處理函式中,而這個函式又會把這個訊息傳遞到註冊窗體時使用者指定的訊息處理函式中。

5. 有模式對話方塊與無模式對話方塊的區別,建立步驟。收到的建立訊息是什麼

使用上的區別:模式對話方塊建立後,程式的其他視窗便不能進行操作,必須將該視窗關閉後,其他視窗才能進行操作。而非模式對話方塊則無需這樣,它不強制要求使用者立即反應,而是與其他視窗同時接受使用者操作。

建立上的差別:在mfc或是wtl中,模式對話方塊一般是使用domodal,而非模式對話方塊的建立則是使用create。

在訊息響應方面,模式對話方塊和非模式對話方塊之間又有著很大的區別。模式對話方塊工作的時候,它有內部的訊息幫浦機制,控制項之間的互動不用我們人為的去控制,系統會幫助我們去處理。非模式對話方塊則像普通視窗一樣,則由winmain中書寫的訊息迴圈驅動。但由於是對話方塊,它對一些訊息有特殊的處理。因此,在訊息迴圈中,需要先對對話方塊提供截獲訊息的機會。

銷毀的差別:模式對話方塊的銷毀是使用enddialog,而非模式對話方塊的銷毀是使用destroywindow.。所以我們在銷毀對話方塊的時候,也要對其進行區別。

非模式對話方塊,使用者關閉對話方塊時,對話方塊訊息處理函式將收到wm_close訊息,接到後呼叫destroywindow以銷毀非模式對話方塊。

模式對話方塊,則一般響應idok和idcancel。在ppc上,我們對於ok鍵和x鍵的處理要注意這點。

6. 試比較_beginthreadex、_beginthread 和 createthread的區別。關閉執行緒和關閉程序的函式分別是什麼?試比較_endthreadex、_endthread 和 exitthread的區別。

1:_beginthreadex與createthread的區域

在 win32

api 中,建立執行緒的基本函式是

createthread,而

_beginthread(ex) 是c++

執行庫的函式。為什麼要有兩個呢?因為c++ 執行庫裡面有一些函式使用了全域性量,如果使用

createthread 的情況下使用這些c++

執行庫的函式,就會出現不安全的問題。而

_beginthreadex 為這些全域性變數做了處理,使得每個執行緒都有乙份獨立的「全域性」量。

所以,如果你的程式設計只呼叫 win32

api/sdk ,就放心用

createthread;如果要用到c++

執行時間庫,那麼就要使用

_beginthreadex ,並且需要在編譯環境中選擇

use multithread lib/dll。_beginthreadex內部呼叫了createthread。

2:_beginthread()和_beginthreadex()的區別

beginthread()和_beginthreadex()的執行緒執行函式的定義是不一樣的。

對於_beginthread()建立的執行緒,其執行緒函式定義為:

void threadpro(void * parguments );

對於_beginthreadex()建立的執行緒,其執行緒函式定義為:

unsigned __stdcallthreadfunc( void* parguments )

(1)兩者建立執行緒函式方式不同,_beginthreadex()的執行緒函式必須使用__stdcall呼叫方式,而且必須返回乙個unsigned型的退出碼。

(2)_beginthreadex()在建立執行緒失敗時返回0,而_beginthread()在建立執行緒失敗時返回-1,這一點在檢測返回結果時必須注意。

(3)如果是呼叫_beginthread()建立執行緒,並相應地呼叫_endthread()結束執行緒時,系統將自動關閉執行緒控制代碼。而呼叫_beginthreadex()建立執行緒,並相應地呼叫_endthreadex()結束執行緒時,系統不能自動關閉執行緒控制代碼。

(4)由於_beginthread()建立執行緒引數比較簡單,不能控制線程的初始啟動狀態,且不返回建立的執行緒控制代碼,也不能呼叫

waitforsingleobject()/waitformultipleobjects()函式。所以一般不常用,而_beginthreadex()與creatthread()函式比較相似。能方便控制線程。

7.執行緒同步的四種方式的機制

1、臨界區:通過對多執行緒的序列化來訪問公共資源或一段**,速度快,適合控制資料訪問。在任意時刻只允許乙個執行緒對共享資源進行訪問,如果有多個執行緒試圖訪問公共資源,那麼在有乙個執行緒進入後,其他試圖訪問公共資源的執行緒將被掛起,並一直等到進入臨界區的執行緒離開,臨界區在被釋放後,其他執行緒才可以搶占。

2、互斥量:採用互斥物件機制。 只有擁有互斥物件的執行緒才有訪問公共資源的許可權,因為互斥物件只有乙個,所以能保證公共資源不會同時被多個執行緒訪問。互斥不僅能實現同一應用程式的公共資源安全共享,還能實現不同應用程式的公共資源安全共享

3、訊號量:它允許多個執行緒在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大執行緒數目

4、事 件: 通過通知操作的方式來保持執行緒的同步,還可以方便實現對多個執行緒的優先順序比較的操作

8.簡述winsock的六種主要io處理模式

有阻塞,select,非同步選擇,事件選擇,重疊模型,完成埠模型。

9.tcp和udp的區別。建立基於tcp的網路程式設計客戶端和伺服器的基本過程是什麼

筆記本上有。

win32 MFC中捕獲滑鼠資訊

第一種方法 視窗控制代碼 hwnd lhwnd hcursorlhcursor dword dwthreadid getwindowthreadprocessid hwnd,null dword dwcurthreadid getcurrentthreadid if dwthreadid dwcur...

01 MFC 基本概念解析

我們在編寫標準c程式的時候,經常會呼叫各種庫函式來輔助完成某些功能 初學者使用得最多的c庫函式就是printf了,這些庫函式是由你所使用的編譯器廠商提供的。在windows平台下,也有類似的函式可供呼叫 不同的是,這些函式是由windows作業系統本身提供的。sdk 軟體開發工具包 software...

Win 32 多執行緒程式設計學習筆記之一 基本概念

1.從win32角度看,程序含有記憶體和資源。被程序擁有的記憶體,理論上可以高達2gb。資源則包括核心物件 如file handles和執行緒 user資源 如對話方塊和字串 gdi資源 如devives context和brushes 2.程序本身並不能夠執行,它只是提供乙個安置記憶體和執行緒的地...