windows 程式設計 第三章讀書筆記(上)
孃的,今天晚上在陽臺做飯把水管一腳踢爆了,水流到下面的住戶的陽臺,讓個老孃們把我罵了一頓,本著做錯事的原則,我裝的很紳士還說了個對不起,擦,真是條純漢子,能屈能伸。
大爺,別看我年輪小,我都給總結了,第三章主要可以用兩句話來展開“建立和顯示視窗,接受和處理訊息”,真他孃的是個人才,多麼簡潔扼要,把這兩句的內容搞懂了,就算入門了。
第一句“建立和顯示視窗”。
首先,“建立”,想建立什麼樣的視窗?
所以第一步,你要定義一個WNDCLASS結構體變數,建立之後幹啥? 丫的初始化呀,填充這個結構體變數中的值。
WNDCLASS有10個欄位
開始左上角第一個之前,拿一個姑娘對比,你要確定你喜歡的型別(style),上她之前你要給人家名分(lpszClassName),玩了之後你要告訴人家你是誰(hInstance)
左上角第一個是圖示,沒錯!WNDCLASS其中一個變數就是設定圖示值,LoadIcon(),這個函式用的最多的就是兩種情況。
第一種:使用windows系統自身圖示資源,LoadIcon(NULL,IDI_APPLICATION);就是這樣,第一個引數是NULL,第二個是預定義好的ID,這個不用記住,直接百度就行。
第二種:使用.RC檔案中的ICON圖示,也就是在VS資原始檔中自定義的圖示,這個圖示都有個ID,LoadIcon(hInstance, MAKEINTRESOURCE(圖示ID)); 其中hInstance就是WinMain函式引數中的那個hInstance,MAKEINTRESOURCE()可以自己百度一下。
緊接著圖示下面是選單,有人說他孃的那不是標題嗎,操,我說的是從左上角到右下角,不是從左到右,這個選單就是指定選單的名字,lpszMenuName,現在的程式不使用選單,所以設定為NULL。
緊接著選單下面是客戶區,客戶區就需要設定背景色,(HBRUSH)GetStockObject(WHITE_BRUSH);我估計微軟那幫人裝修房子都喜歡自己刷牆,所以按他們的理解設定背景色就跟用刷子刷牆一樣一樣地,所以設定背景色就用畫刷BRUSH,使用的什麼顏色的畫刷就能刷什麼顏色的背景。GetStockObject該函式檢索預定義的畫刷、字型等的控制代碼。之所以前面加上(HBRUSH)強制轉換,你想GetStockObject既獲取畫刷,又獲取字型等的控制代碼,返回值肯定是一個通用值,為HGDIOBJ,這是一個圖形影象的控制代碼。
再往右下角看,是你剛才拉大或拉小視窗的滑鼠,對,WNDCLASS有設定滑鼠的欄位,需要用LoadCursor,LoadCursor得用法跟LoadIcon一樣一樣滴,這裡我們用LoadIcon(NULL,IDC_ARROW);
好了差不多了,視窗控制代碼,名字,型別,圖示,滑鼠,背景,選單設定了,還有三個欄位,cbClsExtra,cbWndExtra和lpfnWndProc,其中“cbClsExtra,cbWndExtra“是為這個類結構和視窗結構預留的額外空間,一般都設定為0,lpfnWndProc是要設定回撥函式,這個現在只需要記住設定回撥函式就行了,要問為啥現在不解釋,因為午夜12點了,鍋鍋我要睡覺了。
到此,WNDCLASS各個欄位都解釋完了,可能有的新手覺得很麻煩,尤其是各個欄位的名字,希奇古怪,比如lpfnWndProc,lpfn是啥個字首啊,下面我copy了一個常用字首,看看就容易記住了。
字首 | 含義 |
c | char,字元型 |
by | byte,無符號字元 |
i | int,整形 |
x, y | 座標 |
cx, cy | 長度 |
h | 控制代碼 |
l | long,常整形 |
n | short,短整形 |
fn | 函式 |
w | word,無符號短整形 |
dw | double word,無符號長整形 |
p | pointer,指標 |
s | string,字串 |
sz | string with zero,以\0結束的字串 |
b或f | b代表bool, f表示flag |
按上面的理解,lpfnWndProc,就是標識指向函式(fn)的長指標(lp),又有人可能問,媽的,什麼是長指標?我們知道windows程式設計比較底層,涉及到很多很原始的程式碼,可能你還在孃胎一堆水的時候這些程式碼就有了,遙記當年電腦還是16位的時候,定址範圍為2^16地址範圍之內的指標叫做短指標,定址範圍超過前述範圍的叫做長指標,至於再往下搞什麼是定址範圍,你可以看看王爽的《組合語言》,想買這本二手實體書的找我!三成新,隨便給點錢就行。後來你出生之後,電腦就變成32位了,並且使用“flat“記憶體模型,2^32地址範圍(也就是4GB範圍內的記憶體地址)內做定址都不用修改段暫存器,就沒有人再說長、短指標了,所以現在的C語言,c++很少提這個,統統都是叫指標。
根據以上內容我們到現在為止劃拉的程式碼如下:
-
#include <windows.h>
-
-
int WINAPI WinMain(HINSTANCE hInstance,
-
HINSTANCE hPrevInstance,
-
PSTR szCmdLine,
-
int iCmdLine)
-
{
-
-
TCHAR* className =
"firstWindow";
-
WNDCLASS wndClass;
-
-
wndClass.hInstance = hInstance;
-
wndClass.style = CS_HREDRAW|CS_VREDRAW;
-
wndClass.lpszClassName = className;
-
wndClass.hCursor = LoadCursor(
NULL, IDC_ARROW);
-
wndClass.hIcon = LoadIcon(
NULL, IDI_APPLICATION);
-
wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
-
wndClass.cbClsExtra =
0;
-
wndClass.cbWndExtra =
0;
-
wndClass.lpszMenuName =
NULL;
-
wndClass.lpfnWndProc = callBackWndProc
//暫時假設回撥函式名字為callBackWndProc
-
-
-
}