1. 程式人生 > >windows 程式設計 第三章讀書筆記(上)

windows 程式設計 第三章讀書筆記(上)

     孃的,今天晚上在陽臺做飯把水管一腳踢爆了,水流到下面的住戶的陽臺,讓個老孃們把我罵了一頓,本著做錯事的原則,我裝的很紳士還說了個對不起,擦,真是條純漢子,能屈能伸。    

    大爺,別看我年輪小,我都給總結了,第三章主要可以用兩句話來展開“建立和顯示視窗,接受和處理訊息”,真他孃的是個人才,多麼簡潔扼要,把這兩句的內容搞懂了,就算入門了。

    第一句“建立和顯示視窗”。

         首先,“建立”,想建立什麼樣的視窗?

你連丫的建立什麼視窗都不知道,還建立個毛,所以你首先明確自己要建立視窗的樣式,但你也不能亂建立,並不是想幹嘛就能幹嘛。windws中用WNDCLASS結構體來儲存你要建立視窗的樣式,這樣,用WNDCLASS結構體就既能讓你建立符合windows外觀型別的視窗,又限制了你天馬行空的啥都想建立。

              所以第一步,你要定義一個WNDCLASS結構體變數,建立之後幹啥? 丫的初始化呀,填充這個結構體變數中的值。

              WNDCLASS有10個欄位

,你可能說真他孃的多,我覺得你說的真有道理,我也覺得多,但是那群娃兒就是那麼設計的,木辦法啊兄弟們,忍忍吧,我這裡有一個記憶方法,“開啟一個視窗,把滑鼠放進去”,ok,現在從這個視窗的左上角到右下角來分析。

     開始左上角第一個之前,拿一個姑娘對比,你要確定你喜歡的型別(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++很少提這個,統統都是叫指標。

                 根據以上內容我們到現在為止劃拉的程式碼如下:


  
  1. #include <windows.h>
  2. int WINAPI WinMain(HINSTANCE hInstance,
  3. HINSTANCE hPrevInstance,
  4. PSTR szCmdLine,
  5. int iCmdLine)
  6. {
  7. TCHAR* className = "firstWindow";
  8. WNDCLASS wndClass;
  9. wndClass.hInstance = hInstance;
  10. wndClass.style = CS_HREDRAW|CS_VREDRAW;
  11. wndClass.lpszClassName = className;
  12. wndClass.hCursor = LoadCursor( NULL, IDC_ARROW);
  13. wndClass.hIcon = LoadIcon( NULL, IDI_APPLICATION);
  14. wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  15. wndClass.cbClsExtra = 0;
  16. wndClass.cbWndExtra = 0;
  17. wndClass.lpszMenuName = NULL;
  18. wndClass.lpfnWndProc = callBackWndProc //暫時假設回撥函式名字為callBackWndProc
  19. }