Windows程式設計學習筆記(三) 視窗和訊息

2021-08-01 18:14:02 字數 4361 閱讀 6037

messagebox函式會建立乙個『視窗』。在windows中,乙個視窗就是螢幕上乙個矩形區域,它接收使用者的輸入並以文字或圖形的格式顯示輸出內容。

messagebox函式建立乙個視窗,但只是乙個功能有限的特殊視窗。訊息視窗有乙個帶關閉按鈕的標題列、乙個選項圖示、一行或多行文字,以及最多四個按鈕。當然必須選擇windows提供的。

要新增選單,或是在訊息框中顯示圖形,就需要建立自己的視窗。

自己的視窗

建立視窗很簡單,只需呼叫createwindow。第乙個引數就是『視窗類別名稱』,並且該視窗類別連線所謂的『視窗訊息處理程式』

總體結構

windows程式設計實際上是在進行一種物件導向的程式設計(oop)。視窗:應用程式視窗和對話方塊。『子視窗』、『控制項視窗』、『子視窗控制項』。

『windows給程式傳送訊息』是指windows呼叫程式中的乙個函式,該函式的引數描述了這個特定訊息。這種位於windows程式中的函式稱為『視窗訊息處理程式』。

訊息佇列:用來存放改程式可能建立的各種不同視窗的訊息。訊息迴圈:指一小段程式**,用來從佇列中取出訊息,並將它們傳送給相應的視窗訊息處理程式。當然,有些訊息直接傳送給視窗訊息處理程式,不用放在佇列裡。

hellowin程式

建立乙個視窗首先需要註冊乙個視窗類別,那需要乙個視窗訊息處理程式來處理視窗訊息。處理視窗訊息對每個windows程式都來了負擔。

通盤考量

包含乙個winmain函式和乙個wndproc(視窗訊息處理程式)。

windows函式呼叫

大寫字母識別符號

在hellowin.c程式中,有幾個大寫的識別符號,這些識別符號是在windows表頭檔案中定義的。有些識別符號含有兩個字母或者三個字母的字首,這些字首後頭接著乙個底線。這都是簡單的數值常數。字首指示該常數所屬的類別:cs,視窗類別樣式;cw,建立視窗;dt,繪製文字;idt,圖示id;idc游標id;mb,訊息框;snd,聲音;wm,視窗訊息;ws,視窗樣式。

新的資料型態

其它新的資料型態也在windows表頭檔案中使用typedef敘述或#define敘述加以定義了。

有時這些新的資料型態是方便縮寫,例如用於wndproc的第二個引數的uint資料型態只是乙個unsigned int(無正負號整數),用於winmain的第三個引數的pstr資料型態是指向乙個字串的指標,即是乙個char*。

而wndproc的第三和第四個引數分別被定義為wparam和lparam,這些名字的**有點歷史背景。

wndproc函式傳回了乙個型態為lresult的值,該值簡單地被定義為乙個long。winmain函式被指定了乙個winapi型態(在表頭檔案中定義的所有windows函式都被指定這種型態),而wndproc函式被指定乙個callback型態。這兩個識別符號都被定義為_stdcall,表示在windows本身和使用者的應用程式之間發生的函式呼叫的呼叫引數傳遞方式。

hellowin還使用了windows表頭檔案中定義的四種資料結構:msg,訊息結構;wndclass,視窗類別結構;paintstruct,繪圖結構;rect,矩形結構。前兩個在winmain中使用,後兩個在wndproc中使用。

控制代碼簡介

最後還有三個大寫識別符號,用於不同形態的『控制代碼』:hinstance,執行實體(程式自身)控制代碼;hwnd,視窗控制代碼;hdc,裝置內容控制代碼。

另外會遇到hicon(圖示控制代碼)、hcursor(滑鼠游標控制代碼)和hbrush(畫刷控制代碼)。

控制代碼是乙個(通常32位)證書,代表乙個物件。程式幾乎總是通過呼叫windows函式取得控制代碼。

匈牙利表示法

變數名以乙個或者多個小寫的字母開始,這些字母表示變數的資料型態。例如szcmdline的sz代表『以0結尾的字串』。在hinstance和hprevinstance中的h字首表示『控制代碼』;在icmdshow中的i字首表示『整數』。wndproc的後兩個引數也使用匈牙利表示法。

在命名結構變數時,可以用結構名(或結構名的一種縮寫)的小寫作為變數名的字首,或者用作整個變數名。例如,在hell.c的winmain函式中,msg變數時msg型態的結構;wndclass是wndclas***型態的乙個結構。在wndproc函式中,ps是乙個paintstruct結構,rect是乙個rect結構。

常用的變數字首:c,char或wchar或tchar;by,byte(無正負號字元);n,short;i,int;x,y,int分別用作x座標和y座標;cx,cy,int分別用作x長度和y長度;c代表『計數器』;b或f,bool(int);f代表『旗標』;w,word(無正負號短整數);l,long(長整數);dw,dword(無正負號長整數);fn,function(函式);s,string(字串);sz,以位元組值0結尾的字串;h,控制代碼;p,指標。

註冊視窗類別

視窗依照某一視窗類別建立,視窗類別用以標識處理視窗訊息的視窗訊息處理程式。

不同視窗可以依照同一種視窗類別建立。例如,windows中的所有按鈕視窗-包括按鍵、核取方塊,以及單選按鈕-都是一句同一種視窗類別建立的。視窗類別定義了視窗訊息處理程式和依據此類別建立的視窗的其他特徵。在建立視窗時,要定義一些該視窗所獨有的特徵。

在為程式建立視窗之前,必須首先呼叫registerclass註冊乙個視窗類別。該函式只需要乙個引數,即指向型態為wndclass的結構指標。此結構包括兩個指向字串的字段,因此結構在winuser.h表頭檔案中定義了兩種不同的方式,第乙個是ascii版的wndclassa

typedef struct tagwndclassa

wndclassa,*pwndclassa,near *npwndclassa,far*lpwndclassa;

提示一下資料型態和匈牙利表示法:lpfn字首代表『指向函式的長指標』。(在win32 api中,長指標和短指標(或者近程指標)沒有區別。這只是16位windows的遺物。)

cb字首代表『位元組數』而且通常作為乙個常數來表示乙個位元組的大小。h字首是乙個控制代碼。而hbr字首代表『乙個畫刷的代號』。lpsz字首代表『指向以0結尾符號串的指標』。

unicode 版的結構定義如下

typedef struct tagwndclassw

wndclassw, *pwndclassw,near * npwndclassw, far * lpwndclassw;

與前者唯一的區別在於最後兩個字段定義為指向寬字串常數,而不是指向ascii字串常數。

winuser.h定義了wndclassa和wndclassw結構(以及指向結構的指標)以後,表頭檔案依據對unicode識別符號的解釋,定義了wndclass和指向wndclass的指標(包括一些向後相容的程式**):

#ifdef unicode

typedef  wndclassw  wndclass;

typedef  pwndclassw  pwndclass;

typedef   npwndclassw  npwndclass;

typedef  lpwndclassw  lpwndclass;

#else

typedef  wndclassa   wndclass;

typedef  pwndclassa  pwndclass;

typedef  npwndclassa  npwndclass;

typedef  lpwndclassa  lpwndclass;

#endif

本書後面列出結構時,將只列出功用相同的結構定義,對wndclass就像這樣:

typedef struct

wndclass,* pwndclass;

乙個程式寫作者的程式不應該因為使用以lp或np為字首的不同指標型態而被攪亂。

在winmain中為wndclass定義乙個結構,通常像這樣:

wndclass  wndclass;

然後,就可以初始化該結構的10個字段,並呼叫registerclass。

在wndclass結構中最重要的兩個欄位是第二個和最後乙個,第二個字段(lpfnwndproc)是依據這個類別來建立的所有視窗所使用的視窗訊息處理程式的位址。在hellowin.c中,這是

wndproc函式。最後乙個欄位是視窗類別的文字名稱,程式寫作者可以隨意定義其名稱。在只建立乙個視窗的程式中,視窗類別名稱通常設定為程式名稱。

wndclass結構中的每個字段:

wndclass.style = cs_hredraw | cs_vredraw;

使用c的位『或』運運算元結合了兩個『視窗類別樣式』識別符號。在表頭檔案winuser.h中,已定義了一整組以cs為字首的識別符號:

(未完待續)《windows程式設計(第五版)》

windows驅動程式設計學習筆記 (三)IRP

一,irp的概念 i o request package 當乙個應用程式呼叫函式去操作某個裝置時,比如呼叫createfile,deviceiocontrol,等等時,i o管理器為此函式建立乙個irp資料結構物件和乙個irp stack location資料結構物件陣列,陣列個數等於驅動程式堆疊上...

windows 程式設計 學習筆記(一)

最近看這本書,順便寫下筆記,做了有兩年的windows 開發 一直自學 打算看下基本經典的書,查缺補漏,我這人有強迫症 必須得系統學,話說這中文版的翻譯也太爛了 將就著看吧,誰讓咱英語不好呢,錯了不要噴 純粹是筆記。include int winapi winmain hinstance hinst...

Windows程式設計 學習筆記(一)

由於windows程式是多工的,每個程式並不能獨佔視窗,為了區分使用者和不同程式之間的互動,設計了事件導向機制。這樣每個應用程式都有兩個主要的部件 winmain函式,程式的入口點 和winproc函式,程式的 函式,用於系統呼叫。每個windows程式在建立的時候,作業系統都會建立乙個相應的訊息佇...