MFC學習之windows內部運行機制

一、基本概念

windows的程序離不開窗口,那麼一個窗口是靠什麼來標識的呢,就是窗口句柄。

句柄是一個很重要的概念,通俗的說,系統 中有各種的資源,比如窗口,圖標等等,當我們要創建這些資源的時候,系統就會爲這些資源分配內存並且返回一個標識這些資源的標號,這個標號就是所謂的句柄。我覺得類似指針的概念,當我們在創建資源的時候,我們一定要返回一個標識符,不然的話我們創建的這個在以後的程序中找不到了還創建他做什麼呢。句柄的概念主要是針對資源來說的,不同的資源有着不同的句柄。比如。窗口句柄,光標句柄等等。


消息和消息隊列

函數和系統之前可能會存在相互的調用,那麼這種調用就是靠着消息來進行的。通過消息的傳遞實現調用

在程序中,消息是有msg結構體來表示的。

MSG的結構可以參照MSDN中的實例。(學windows不裝msdn就是傻叉)


消息隊列:

每個應用程序開始執行之後系統都會爲他創建一個小弟隊列, 用來接收消息。程序會從消息隊列中取出消息然後進行響應。程序會不斷的從消息隊列中取出消息來處理。


WinMain函數

WinMain函數就相當於windows程序中的主函數。也就是說,當系統開始執行這個程序的時候首先執行的是這個程序的WinMain函數。




二、窗口的創建

窗口的創建基本分爲幾個步驟

1、窗口類的創建

2、註冊窗口類

3、創建窗口

3、顯示以及更新窗口

窗口類的創建,就類似於一個窗口的骨架的創建,在創建窗口的時候並不是什麼東西都需要我們自己來定義,而是有很多東西都是windows爲我們寫好的,我們只要把我們想設置這個窗口的特性的相關參數像填空一樣填寫進去就可以。

那麼在C語言中,我們很自然的就要用到的是結構體這種類型。在用C語言去實現面向對象特性的時候,類這個概念在C語言中就是用結構體來實現的。

一個窗口的特徵就是用wndclass這個結構體來定義的。

這個結構體有很多的變量,分別就代表了這個窗口的一些屬性,我們可以自由的設置這些屬性。


我們在使用一些變量的時候,可能會遇到一些用位表示的變化來說明不同特性的變量。假設一個字節有8位,那麼這八位的位模式將有很多種組合,如果讓每一種組合(位模式只有一位爲1的組合)代表一個特性的話,那麼僅僅用一個字節就能夠表示很多種不同的類型提供我們使用。但是這些數字都不是很好記,那麼千萬別忘了我們在C語言中還有一個神奇就是宏定義,我們可以將這些數字常量宏定義位不同的名字,以便我們能夠很容易的使用。

由於每一種位模式只有一個位唯一,每一種位模式如果都代表一種窗口類型的話,那麼在真正的繪製窗口的過程中,如果我們想讓這個窗口同時擁有幾種樣式,那麼我們就用或運算符|來組合這些位模式,達到同時設置幾個類型的目的。

由於每種類型的位模式只有一位爲1,那麼如果我想去掉一種類型的話,就用這個類型的位模式取反再做與的操作,那麼由於0&&1 == 0所以我們就會達到取消一種類型的目的。


在每一個窗口中,比如我們點擊窗口的某個位置等等,都會生成一個消息,那麼這個消息在窗口中怎麼被處理呢,就會調用與這個窗口綁定的回調函數,也成爲窗口過程函數。當窗口收到I一個消息的時候,就會自動調用這個回調函數,以便處理這個消息。


在對窗口類的其他的成員賦值之後,我們就要註冊窗口類,我理解的註冊窗口類的功能可能就是讓操作系統去得知和了解一下我們已經建立了這個窗口類的一些信息,比如在註冊窗口類之後,他會知道我們爲回調函數指定的函數地址。

窗口類設計好了,也被註冊了,那麼現在就可以利用這個窗口類的一些功能來創建一個真正的窗口了。


創建窗口主要用到的就是createwindow,裏面的很多參數可以去MSDN查找,很好寫。

創建窗口完成之後,窗口並沒有顯示出來,這就證明我們需要調用showwindow和updatewindow這兩個函數來表示和更新窗口,這樣我們創建的窗口才會顯示出來。


創建了窗口之後,我們難免會對這個窗口做出一些動作,觸發一些事件。

我們知道window程序都是用消息來傳遞信息的。每一個應用程序也都有一個消息隊列,這個應用程序會不斷的從消息隊列中取出消息進行響應。

程序是用getmessage這個函數來從消息隊列中取出數據的,這個函數只有取到wm_quit也就是這個程序要退出的消息時纔會返回一個0值,其餘的正常情況下返回大於0的非0值,出現錯誤的時候可能會返回一個負數值。

在消息隊列這一塊,和他一起搭配使用的還有兩個函數

一個是translatemessage,另外一個是dispathmessage。前一個函數會把我們做出操作的虛擬按鍵轉化爲字符消息,也就是我們按下按鍵的那個鍵盤上面的字符是什麼,他會產生一個新的wm_char消息投遞到消息隊列裏面且不會改變原有的消息。後一個則會將一個消息傳遞給操作系統,又操作系統調用我們之前定義的一個過程函數進行處理。

在窗口過程函數中一般來說都會用switch語句進行處理不同的消息。


在書寫窗口過程函數的時候,如果我們需要在窗口上畫圖形,或者寫文字的時候,通常會用到一個叫做DC的結構體,它是設備描述表。因爲不同的底層設備會有不同的驅動以及使用方式,在畫圖的時候如果沒有DC那我們就需要去學習每一種設備的用法。但是有了DC對象之後,我們可以讓DC去與各種圖形設備打交道到,我們只要告訴DC要畫一個什麼圖形就可以了,這樣剩下的工作就有DC和圖形繪製設備來負責了。DC也是一種資源。DC就相當於程序員和物理設備之間交流的媒介,他屏蔽了很多底層設備的複雜性,能夠讓我們更好的使用。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章