###指針
我們知道,程序的運行是存在內存中的,因此,我們在代碼中聲明的所有變量都是存放在內存中的某塊區域中,所以,在C語言中,指針用來告訴我們,某個變量在內存中的首地址在哪。注意,是首地址,因為變量的長度不一定就是一個字節,有可能N多個字節,它在內存中是排列在一段連續的區域塊中。
**通過指針中存放的首地址,應用程序順利地找到某個變量**。就好像我最近認識了一位朋友,他叫我有空去他家坐坐,然后,他留下了地址。某個周末我正閑著,忽然想起這位朋友,于是,我就根據他留的地址去找他,結果,當我來到傻B街230號出租房時,里面走出一個我不認識的人,于是,我問他我這位朋友去哪了,陌生人說,我剛租了這房子,你找的可能是前一位租戶吧。
所以,指針所指向的地址,有可能是變量B,也有可能是變量F,或者變量S,指針是房東,可以把房子租給B,C,或F,它可以動態為變量分配內存,也可以把變量銷毀(delete),交不起房租就滾蛋(析構函數)。
從上面的故事中,我們看到指針的兩個用途:**索引內存和分配內存**。此外指針還有一個功能功能:**創建數組**。
我們怎么知道哪些參數是指針類型呢,技巧還是在命名上,以后,只要我們看到lp開頭的,都是指針類型。比如lpszClassName、lpszObjTitle等等。
~~~
.版本 2
.DLL命令 Ex_ObjCreate, 整數型, "libexdui.dll", "Ex_ObjCreate", 公開, 創建組件.
.參數 lpszClassName, 整數型, , 組件類名
.參數 lpszObjTitle, 整數型, , 組件標題
.參數 dwStyle, 整數型, , 組件風格
.參數 x, 整數型, , 左邊
.參數 y, 整數型, , 頂邊
.參數 width, 整數型, , 寬度
.參數 height, 整數型, , 高度
.參數 hParent, 整數型, , 父組件句柄
.參數 lParam, 整數型, , 參數
~~~
###創建窗口
窗口類注冊完成后,就應該創建窗口,然后顯示窗口,調用Ex_WndCreate創建窗口,如果成功,會返回一個窗口的句柄,我們對這個窗口的操作都要用到這個句柄。
什么是句柄呢?其實它就是一串數字,只是一個標識而已,內存中會存在各種資源,如圖標、文本等,為了可以有效標識這些資源,每一個資源都有其唯一的標識符,這樣,通過查找標識符,就可以知道某個資源存在于內存中哪一塊地址中,就好比你出身的時候,長輩都要為你取個名字,你說名字用來干嗎?名字就是用來標識你的,不然,你見到A叫小明,遇到B又叫小明,那誰知道哪個才是小明啊?就好像你上大學去報到號,會為你分配一個可以在本校學生中唯一標識你的學號,所有學生的學號都是不同的,這樣,只要通過索引學號,就可以找到你的資料。
~~~
.版本 2
.DLL命令 Ex_WndCreate, 整數型, "libexdui.dll", "Ex_WndCreate", 公開,
.參數 hWndParent, 整數型, ,
.參數 lpwzClassName, 整數型, ,
.參數 lpwzWindowName, 整數型, ,
.參數 x, 整數型, ,
.參數 y, 整數型, ,
.參數 Width, 整數型, ,
.參數 Height, 整數型, ,
.參數 dwStyle, 整數型, ,
.參數 dwStyleEx, 整數型, ,
~~~
###消息循環
Windows操作系統是基于消息控制機制的,用戶與系統之間的交互,程序與系統之間的交互,都是通過發送和接收消息來完成的。就好像軍隊一樣,命令一旦傳達,就要執行,當然,我們的應用程序和軍隊不一樣,我們收到指令不一定要執行,我們是可以選擇性地執行。
這樣消息循環就出現了,只要有與用戶交互,系統人不斷地向應用程序發送消息通知,因為這些消息是不定時不斷發送的,必須有一個綬沖區來存放,就好像你去銀行辦理手續要排隊一樣,我們從最前端取出一條一條消息處理,后面新發送的消息會一直在排隊,直到把所有消息處理完,這就是**消息隊列**。
~~~
.版本 2
.DLL命令 Ex_WndMsgLoop, 整數型, "libexdui.dll", "Ex_WndMsgLoop", 公開,
~~~
###程序退出
通常情況下,當我們的主窗口關閉后,應用程序應該退出(木馬程序除外),但是,我們剛才運行后發現,為什么我的窗口關了,但程序不退出呢?
要退出程序,就要先跳出消息循環,和關閉哪個窗口無關。因此,我們要解決兩個問題:
1、如何跳出消息循環;
2、什么時候退出程序。
其實兩個問題是可以合并到一起解決。
首先要知道,當窗口被關閉,為窗口所分配的內存會被銷毀,同時,我們會收到一條WM_DESTROY消息,因而,我們只要在收到這條消息時調用PostQuitMessage函數,這個函數提交一條WM_QUIT消息,而在消息循環中,WM_QUIT消息使GetMessage函數返回0,這樣一來,GetMessage返回FALSE,就可以跳出消息循環了,這樣應用程序就可以退出了。
所以,我們要做的就是捕捉WM_DESTROY消息,然后PostQuitMessage。

###繪圖
要進行繪制,首先要得到一個DC,啥是DC呢?按字面翻譯叫設備上下文,也可以翻譯為設備描述表,它主要指API為我們封裝了一些與顯示設備相關的交互操作,我們這里說的是圖形的繪制,自然指的是顯卡。
在許多情況下,我們繪圖都是遵循先GetDC-----〉繪圖------〉ReleaseDC,DC是一種資源,用完了要釋放,我們到圖書館借書,看完了要還書。不過,在處理WM_PAINT消息時,聲明一個ExsPaintStruct結構體的變量,然后傳給_canvas_beginpaint函數,之后就可以畫東西了。調用DLL命令名 _canvas_beginpaint 函數后,開始繪圖,畫完了調用_canvas_endpaint。其中
_canvas_beginpaint 函數會自動調用GetDC,_canvas_endpaint自動調用ReleaseDC。
~~~
.版本 2
.DLL命令 _canvas_beginpaint, 整數型, "libexdui.dll", "_canvas_beginpaint", 公開,
.參數 hcanvas, 整數型, ,
~~~
[資料來源>](http://www.hmoore.net/digest/win32-dev/165890)