Windows訊息機制 1

2021-04-22 14:31:43 字數 3706 閱讀 5447

dos的過程驅動與windows的事件驅動

在講本程式的訊息迴圈之前,我想先談一下dos與windows驅動機制的區別:

dos程式主要使用順序的,過程驅動的程式設計方法。順序的,過程驅動的程式有乙個明顯的開始,明顯的過程及乙個明顯的結束,因此程式能直接控制程式事件或過程的順序。雖然在順序的過程驅動的程式中也有很多處理異常的方法,但這樣的異常處理也仍然是順序的,過程驅動的結構。

而windows的驅動方式是事件驅動,就是不由事件的順序來控制,而是由事件的發生來控制,所有的事件是無序的,所為乙個程式設計師,在你編寫程式時,你並不知道使用者先按哪個按紐,也不知道程式先觸發哪個訊息。你的任務就是對正在開發的應用程式要發出或要接收的訊息進行排序和管理。事件驅動程式設計是密切圍繞訊息的產生與處理而展開的,一條訊息是關於發生的事件的訊息。

windows程式設計的特點:

c語言程式設計至少有乙個主程式,其名字是main()。windows程式則至少兩個主程式,乙個是winmain(),

int winapi winmain( 

hinstance hinstance,   // handle to current instance 

hinstance hprevinstance,  // handle to previous instance 

lpstr lpcmdline,     // command line 

int ncmdshow     // show state 

);另乙個是視窗過程函式wndproc,它的函式原型為:

long far pascal wndproc(hwnd hwnd,word message,word wparam,long lparam);

windows應用程式的程式設計就圍繞這兩個部份進行的。其中winmain函式為應用程式的入口點,它的名字一定要是winmain。

在windows中,應用程式通過要求windows完成指定操作,而承擔這項通訊任務的api函式就是windows的相應視窗函式wndproc。在dos裡,程式能直接控制事件的發生順序,結果等。而在windows裡,應用程式不直接呼叫任何視窗函式,而是等待windows呼叫視窗函式,請求完成任務或返回資訊。為保證windows呼叫這個視窗函式,這個函式必須先向windows登記,然後在windows實施相應操作時**,所以視窗函式又稱為**函式。wndproc是乙個主**函式,windows至少有乙個**函式。

**函式wndproc在**定義的呢,請看這個語句:wc.lpfnwndproc = wndproc ;

將在第七講裡詳談.

例項:在windows中,能多次同時執行同乙個應用程式,即執行多個副本,每個副本叫做乙個「例項」。

現在讓我們把這個程式層層剝解開來,我把自己的理解慢慢地展示給你:

我把這個程式支解為四塊:

(一)建立,註冊視窗類.(二)建立視窗.(三)顯示和更新視窗.(四)建立訊息迴圈.(五)終止應用程式.(六)視窗過程.(七)處理訊息.

(一)註冊視窗類:

(1)建立視窗類

winmain()是程式的入口,它相當於乙個中介人的角色,把應用程式(指小視窗)介紹給windows.首要的一步是登記應用程式的視窗類.

視窗種類是定義視窗屬性的模板,這些屬性包括視窗式樣,滑鼠形狀,選單等等,視窗種類也指定處理該類中所有視窗訊息的視窗函式.只有先建立視窗種類,才能根據視窗種類來建立windows應用程式的乙個或多個視窗.建立視窗時,還可以指定視窗獨有的附加特性.視窗種類簡稱視窗類,視窗類不能重名.在建立視窗類後,必須向windows登記.

建立視窗類就是用wndclass結構定義乙個結構變數,在這個程式中就是指

wndclass wc ;然後用自己設計的視窗屬性的資訊填充結構變數wc的域.

要winmain登記視窗類,首先要填寫乙個wndclass結構,其定義如下所示:

typedef struct _wndclassa 

在vc6.0裡面,把游標定位在wndclass上,按f1,即可啟動msdn,在msdn裡你可看到這個結構原形.在下節講解這些引數在本程式中的具體用法.

(2)註冊視窗類

(1)第乙個引數:

成員style控制視窗的某些重要特性,在windows.h中定義了一些字首為cs的常量,在程式中可組合使用這些常量.也可把sytle設為0.本程式中為

wc.style = cs_hredraw | cs_vredraw,

它表示當視窗的縱橫座標發生變化時要重畫整個視窗。你看:無論你怎樣拉動視窗的大小,那行字都會停留在視窗的正中部,而假如把這個引數設為0的話,當改動視窗的大小時,那行字則不一定處於中部了。

(2)第二個引數:lpfnwndproc包括乙個指向該視窗類的訊息處理函式的指標,此函式稱為視窗過程函式。它將接收windows傳送給視窗的訊息,並執行相應的任務。其原型為:

long far pascal wndproc(hwnd ,unsigned,word,long);

並且必須在模快定義中**它。wndproc是乙個**函式(見第五節),如果暫時無法理解這個模糊的概念意味著什麼,可先放過,等到講訊息迴圈時再詳談。 

(3)第三,四個引數:cbwndextra域指定用本視窗類建立的所有視窗結構分配的額外位元組數。當有兩個以上的視窗屬於同一視窗類時,如果想將不同的資料和每個視窗分別相對應。則使用該域很有用。這般來講,你只要把它們設為0就行了,不必過多考慮。

(4)第五個引數:hinstance域標識應用程式的例項hinstance,當然,例項名是可以改變的。

wc.hinstance = hinstance ;

這一成員可使windows連線到正確的程式。

(5)第六個引數:

成員hicon被設定成應用程式所使用圖示的控制代碼,圖示是將應用程式最小化時出現在工作列裡的的圖示,用以表示程式仍駐留在記憶體中。windows提供了一些預設圖示,我們也可定義自己的圖示,vc裡面專有乙個製作圖示的工具。 

(6)第七個引數:

hcursor域定義該視窗產生的游標形狀。loadcursor可返回固有游標控制代碼或者應用程式定義的游標控制代碼。idc_arrow表示箭頭游標.

(7)第八個引數:

wc.hbrbackground域決定windows用於著色視窗背景的刷子顏色,函式getstockobject返回視窗的顏色,本程式中返回的是白色,你也可以把它改變為紅色等其他顏色.試試看

(8)第九個引數:

lpszmenuname用來指定選單名,本程式中沒有定義選單,所以為null。

(9)第十個引數:

lpszclassname指定了本視窗的類名。

當對wndclass結構域一一賦值後,就可註冊視窗類了,在建立視窗之前,是必須要註冊視窗類的,註冊視窗類用的api函式是

registerclass,註冊失敗的話,就會出現乙個對話方塊如程式所示,函式

registerclass返回0值,也只能返回0值,因為註冊不成功,程式已經不能再進行下去了。

在本程式中註冊視窗類如下:

if (!registerclass (&wc))  

windows訊息機制

一 windows中有乙個系統訊息佇列,對於每乙個正在執行的windows應用程式,系統為其建立乙個 訊息佇列 即應用程式佇列,用來存放該程式可能 建立的各種視窗的訊息。應用程式中含有一段稱作 訊息迴圈 的 用來從訊息佇列中檢索這些訊息並把它們分發到相應的視窗函式中。二 windows為當前執行的每...

windows訊息機制

一 windows中有乙個系統訊息佇列,對於每乙個正在執行的windows應用程式,系統為其建立乙個 訊息佇列 即應用程式佇列,用來存放該程式可能 建立的各種視窗的訊息。應用程式中含有一段稱作 訊息迴圈 的 用來從訊息佇列中檢索這些訊息並把它們分發到相應的視窗函式中。二 windows為當前執行的每...

Windows訊息機制

訊息佇列分為 系統訊息佇列 執行緒訊息佇列 應用程式訊息佇列 系統訊息佇列 這是系統唯一的佇列,輸入裝置 滑鼠 鍵盤等 的驅動程式把使用者的操作轉換成訊息的形式放置到系統佇列中,然後系統會把此訊息轉到目標視窗所在的執行緒訊息佇列中等待處理。執行緒訊息佇列 每個gui 圖形使用者 介面 graphic...