易語言、程式設計原理
工具/原料
易語言開發環境
windows程式設計教材
方法/步驟
動態連結
Windows運作機制的核心是一個稱作「動態連結」的概念。Windows提供了應用程式豐富
的可呼叫函式,大多數用於實作其使用者介面和在視訊顯示器上顯示文字和圖形。這些函式
採用動態連結庫(Dynamic Linking Library,DLL)的方式撰寫。這些動態連結庫是些
具 有 .DLL 或 者 有 時 是 .EXE 擴 展 名 的 文 件 , 在 Windows 98 中 通 常 位 於
\WINDOWS\SYSTEM子目錄中,在Windows NT中通常位於\WINNT\SYSTEM和
\WINNT\SYSTEM32子目錄中。
在早期,Windows的主要部分僅通過三個動態連結庫實作。這代表了Windows的三個主要
子系統,它們被稱作Kernel、User和GDI。當子系統的數目在Windows最近版本中增多時,
大多數典型的Windows程式產生的函式呼叫仍對應到這三個模組之一。Kernel(日前由16
位的KRNL386.EXE和32位的KERNEL32.DLL實現)處理所有在傳統上由作業系統核心
處理的事務-記憶體管理、檔案I/O和多工管理。User(由16位的USER.EXE和32位的
USER32.DLL實作)指使用者介面,實作所有視窗運作機制。GDI(由16位的GDI.EXE整理編撰:Defoe.Tu [email protected]
和32位的GDI32.DLL實作)是一個圖形裝置介面,允許程式在螢幕和印表機上顯示文字和
圖形。
Windows 98支援應用程式可使用的上千種函式呼叫。每個函式都有一個描述名稱,例如
CreateWindow。該函式(如您所猜想的)為程式建立新視窗。所有應用程式可以使用的
Windows函式都在表頭檔案裡預先宣告過。
在Windows程式中,使用Windows函式的方式通常與使用如strlen等C語言連結庫函式的
方式相同。主要的區別在於C語言連結庫函式的機械碼連結到您的程式程式碼中,而Windows
函式的程式程式碼在您程式執行檔案外的DLL中。
當您執行Windows程式時,它通過一個稱作「動態連結」的過程與Windows相接。一個
Windows的.EXE檔案中有使用到的不同動態連結庫的參考資料,所使用的函式即在那些動
態連結庫中。當Windows程式被載入到記憶體中時,程式中的呼叫被指向DLL函式的入口。
如果該DLL不在記憶體中,就把它載入到記憶體中。
當您連結Windows程式以產生一個可執行檔案時,您必須連結程式開發環境提供的特定「引
用連結庫(import library)」。這些引用連結庫包含了動態連結庫名稱和所有Windows函
數呼叫的引用資訊。連結程式使用該資訊在.EXE檔案中建立一個表格,在載入程式時,
Windows使用它將呼叫轉換為Windows函式。
表頭檔案
HELLOMSG.C以一個前置處理器指示命令開始,實際上在每個用C編寫的Windows程式
的開頭都可看到:
#include
WINDOWS.H是主要的含入檔案,它包含了其它Windows表頭檔案,這些表頭檔案的某些
也包含了其它表頭檔案。這些表頭檔案中最重要的和最基本的是:
WINDEF.H 基本型態定義。
WINNT.H 支援Unicode的型態定義。
WINBASE.H Kernel函式。
WINUSER.H 使用者介面函式。
WINGDI.H 圖形裝置介面函式。
這些表頭檔案定義了Windows的所有資料型態、函式呼叫、資料結構和常數識別符號,它們
是Windows檔案中的一個重要部分。使用Visual C++ Developer Studio的Edit選單中的
Find in Files搜尋這些表頭檔案非常方便。您還可以在Developer Studio中開啟這些表頭
檔案並直接閱讀它們。
Windows表頭檔案型別
正如您在第一章所看到的那樣,一個Windows程式包括表頭檔案WINDOWS.H。該檔案包
括許多其它表頭檔案,包括WINDEF.H,該檔案中有許多在Windows中使用的基本型態定整理編撰:Defoe.Tu [email protected]
義,而且它本身也包括WINNT.H。WINNT.H處理基本的Unicode支援。
WINNT.H的前面包含C的表頭檔案CTYPE.H,這是C的眾多表標頭檔案之一,包括wchar_t
的定義。WINNT.H定義了新的資料型態,稱作CHAR和WCHAR:
typedef char CHAR ;
typedef wchar_t WCHAR ; // wc
當您需要定義8位字元或者16位字元時,推薦您在Windows程式中使用的資料型態是
CHAR和WCHAR。WCHAR定義後面的註釋是匈牙利標記法的建議:一個基於WCHAR數
據型態的變數可在前面附加上字母wc以說明一個寬字元。
WINNT.H表頭檔案進而定義了可用做8位字串指標的六種資料型態和四個可用做const
8位字串指標的資料型態。這裡精選了表頭檔案中一些實用的說明資料型態語句:
typedef CHAR * PCHAR, * LPCH, * PCH, * NPSTR, * LPSTR, * PSTR ;
typedef CONST CHAR * LPCCH, * PCCH, * LPCSTR, * PCSTR ;
字首N和L表示「near」和「long」,指的是16位Windows中兩種大小不同的指標。在Win32
中near和long指標沒有區別。
類似地,WINNT.H定義了六種可作為16位字串指標的資料型態和四種可作為const 16
位字串指標的資料型態:
typedef WCHAR * PWCHAR, * LPWCH, * PWCH, * NWPSTR, * LPWSTR, * PWSTR ;
typedef CONST WCHAR * LPCWCH, * PCWCH, * LPCWSTR, * PCWSTR ;
至此,我們有了資料型態CHAR(一個8位的char)和WCHAR(一個16位的wchar_t),
以及指向CHAR和WCHAR的指標。與TCHAR.H一樣,WINNT.H將TCHAR定義為一般的
字元型別。如果定義了識別符號UNICODE(沒有底線),則TCHAR和指向TCHAR的指標就
分別定義為WCHAR和指向WCHAR的指標;如果沒有定義識別符號UNICODE,則TCHAR
和指向TCHAR的指標就分別定義為char和指向char的指標:
#ifdef UNICODE
typedef WCHAR TCHAR, * PTCHAR ;
typedef LPWSTR LPTCH, PTCH, PTSTR, LPTSTR ;
typedef LPCWSTR LPCTSTR ;
#else
typedef char TCHAR, * PTCHAR ;
typedef LPSTR LPTCH, PTCH, PTSTR, LPTSTR ;
typedef LPCSTR LPCTSTR ;
#endif
如果已經在某個表頭檔案或者其它表頭檔案中定義了TCHAR資料型態,那麼WINNT.H和
WCHAR.H表頭檔案都能防止其重複定義。不過,無論何時在程式中使用其它表頭檔案時,
都應在所有其它表頭檔案之前包含WINDOWS.H。
WINNT.H表頭檔案還定義了一個巨集,該巨集將L新增到字串的第一個引號前。如果定義了整理編撰:Defoe.Tu [email protected]
UNICODE識別符號,則一個稱作 __TEXT的巨集定義如下:
#define __TEXT(quote) L##quote
如果沒有定義識別符號UNICODE,則像這樣定義__TEXT巨集:
#define __TEXT(quote) quote
此外, TEXT巨集可這樣定義:
#define TEXT(quote) __TEXT(quote)
這與TCHAR.H中定義_TEXT巨集的方法一樣,只是不必操心底線。我將在本書中使用這個巨集
的TEXT版本。
這些定義可使您在同一程式中混合使用ASCII和Unicode字串,或者編寫一個可被ASCII
或Unicode編譯的程式。如果您希望明確定義8位字元變數和字串,請使用CHAR、
PCHAR(或者其它),以及帶引號的字串。為明確地使用16位字元變數和字串,請使
用WCHAR、PWCHAR,並將L新增到引號前面。對於是8位還是16位取決於UNICODE標
識符的定義的變數或字串,要使用TCHAR、PTCHAR和TEXT巨集。
總體結構
進行Windows程式設計,實際上是在進行一種物件導向的程式設計(OOP)。這一點在
Windows中使用得最多的物件上表現最為明顯。這種物件正是Windows之所以命名為
「Windows」的原因,它具有人格化的特徵,甚至可能會在您的夢中出現,這就是那個叫
做「視窗」的東西。
桌面上最明顯的視窗就是應用程式視窗。這些視窗含有顯示程式名稱的標題列、選單甚至可
能還有工具列和滾動條。另一類視窗是對話方塊,它可以有標題列也可以沒有標題列。
裝飾對話方塊表面的還有各式各樣的按鍵、單選按鈕、複選框、清單方塊、滾動條和文字輸入
區域。其中每一個小的視覺物件都是一個視窗。更確切地說,這些都稱為「子視窗」或「控
件視窗」或「子視窗控制元件」。
作為物件,使用者會在螢幕上看到這些視窗,並通過鍵盤和滑鼠直接與它們進行互動操作。
更有趣的是,程式寫作者的觀點與使用者的觀點極其類似。視窗以「訊息」的形式接收視窗
的輸入,視窗也用訊息與其它視窗通訊。對訊息的理解將是學習如何寫作Windows程式所
必須越過的障礙之一。
這有一個Windows的訊息範例:我們知道,大多數的Windows程式都有大小合適的應用程整理編撰:Defoe.Tu [email protected]
序視窗。也就是說,您能夠通過滑鼠拖動視窗的邊框來改變視窗的大小。通常,程式將通過
改變視窗中的內容來響應這種大小的變化。您可能會猜測(並且您也是正確的),是Windows
本身而不是應用程式在處理與使用者重新調整視窗大小相關的全部雜亂程式。由於應用程式
能改變其顯示的樣子,所以它也「知道」視窗大小改變了。
應用程式是如何知道使用者改變了視窗的大小的呢?由於程式寫作者習慣了往常的文字模
式程式,作業系統沒有設定將此類訊息通知給使用者的機制。問題的關鍵在於理解Windows
所使用的架構。當使用者改變視窗的大小時,Window給程式傳送一個訊息指出新視窗的大
小。然後程式就可以調整視窗中的內容,以響應大小的變化。
「Windows給程式傳送訊息。」我們希望讀者不要對這句話視而不見。它到底表達了什麼意
思呢?我們在這裡討論的是程式程式碼,而不是一個電子郵件系統。作業系統怎麼給程式傳送
訊息呢?
其實,所謂「Windows給程式傳送訊息」,是指Windows呼叫程式中的一個函式,該函式
的引數描述了這個特定訊息。這種位於Windows程式中的函式稱為「視窗訊息處理程式」。
無疑,讀者對程式呼叫作業系統的做法是很熟悉的。例如,程式在開啟磁碟檔案時就要使用
有關的系統呼叫。讀者所不習慣的,可能是作業系統呼叫程式,而這正是Windows物件導
向架構的基礎。
程式建立的每一個視窗都有相關的視窗訊息處理程式。這個視窗訊息處理程式是一個函式,
既可以在程式中,也可以在動態連結庫中。Windows通過呼叫視窗訊息處理程式來給視窗
傳送訊息。視窗訊息處理程式根據此訊息進行處理,然後將控制傳回給Windows。
更確切地說,視窗通常是在「視窗類別」的基礎上建立的。視窗類別標識了處理視窗訊息的
視窗訊息處理程式。使用視窗類別使多個視窗能夠屬於同一個視窗類別,並使用同一個視窗
訊息處理程式。例如,所有Windows程式中的所有按鈕均依據同一個視窗類別。這個視窗
類別與一個處理所有按鈕訊息的視窗訊息處理程式(位於Windows的動態連結庫中)聯結。
在物件導向的程式設計中,物件是程式與資料的組合。視窗是一種物件,其程式是視窗訊息
處理程式。資料是視窗訊息處理程式儲存的資訊和Windows為每個視窗以及系統中那個窗
口類別儲存的信息。
視窗訊息處理程式處理給視窗傳送訊息。這些訊息經常是告知視窗,使用者正使用鍵盤或者
滑鼠進行輸入。這正是按鍵視窗知道它被「按下」的奧妙所在。在視窗大小改變,或者視窗
表面需要重畫時,由其它訊息通知視窗。
Windows程式開始執行後,Windows為該程式建立一個「訊息佇列」。這個訊息佇列用來
存放該程式可能建立的各種不同視窗的訊息。程式中有一小段程式程式碼,叫做「訊息迴圈」,
用來從佇列中取出訊息,並且將它們傳送給相應的視窗訊息處理程式。有些訊息直接傳送給
視窗訊息處理程式,不用放入訊息佇列中。
如果您對這段Windows架構過於簡略的描述將信將疑,就讓我們去看看在實際的程式中,
視窗、視窗類別、視窗訊息處理程式、訊息佇列、訊息迴圈和視窗訊息是如何相互配合的。
這或許會對您有些幫助。
HELLOWIN程式
建立一個視窗首先需要註冊一個視窗類別,那需要一個視窗訊息處理程式來處理視窗訊息。
處理視窗訊息對每個Windows程式都帶來了些負擔。程式3-1所示的HELLOWIN程式中整整理編撰:Defoe.Tu [email protected]
個做的事情差不多就是料理這些事情。
程式3-1 HELLOWIN
HELLOWIN.C
/*------------------------------------------------------------------------
HELLOWIN.C -- Displays "Hello, Windows 98!" in client area
(c) Charles Petzold, 1998
-----------------------------------------------------------------------*/
#include
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HelloWin") ;
HWND hwnd ;
MSG msg ;
WNDCLASwndclass ;
wndclass.style = CS_HREDRAW CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuNam = NULL ;
wndclass.lpszClassName= szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox ( NULL, TEXT ("This program requires Windows NT!"), 整理編撰:Defoe.Tu [email protected]
szAppName, MB_ICONERROR) ;
return 0 ;
}
hwnd = CreateWindow( szAppName, // window class name
TEXT ("The Hello Program"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT,// initial x position
CW_USEDEFAULT,// initial y position
CW_USEDEFAULT,// initial x size
CW_USEDEFAULT,// initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
switch (message) 整理編撰:Defoe.Tu [email protected]o.com.cn
{
case WM_CREATE:
PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME SND_ASYNC) ;
return 0 ;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rect) ;
DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
DT_SINGLELINE DT_CENTER DT_VCENTER) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
程式建立一個普通的應用程式視窗,如圖3-1所示。在視窗顯示區域的中央顯示「Hello,
Windows 98!」。如果安裝了音效卡,那麼您還可以聽到相應的朗讀聲音。
通盤考量
實際上,每一個Windows程式程式碼中都包括HELLOWIN.C程式的大部分。沒人能真正記住
此程式的全部寫法;通常,Windows程式寫作者在開始寫一個新程式時總是會複製一個現
有的程式,然後再做相應的修改。您可以按此習慣自由使用本書附帶光碟中的程式。
上面提到,HELLOWIN將在其視窗的中央顯示字串。這種說法不是完全正確的。文字實
際顯示在程式顯示區域的中央,它在圖3-1中是標題列和邊界範圍內的大片白色區域。這區
別對我們來說很重要;顯示區域就是程式自由繪圖並且向使用者顯示輸出結果的視窗區域。
如果您認真思考一下,將會發現雖然只有80行程式程式碼,這個視窗卻令人驚訝地具有許多
功能。您可以用滑鼠按住標題列,在螢幕上移動視窗;可以按住大小邊框,改變視窗的大小。整理編撰:Defoe.Tu [email protected]
在視窗大小改變時,程式自動地將「Hello, Windows 98!」字串重新定位在顯示區域的
中央。您可以按最大化按鈕,放大HELLOWIN以充滿整個螢幕;也可以按最小化按鈕,將
程式縮小成一個圖示。您可以在系統選單中執行所有選項(就是按下在標題列最左端的小圖
示);也可以從系統選單中選擇 Close選項,或者單擊標題列最右端的關閉按鈕,或者雙擊
標題列最左端的圖示,來關閉視窗以終止程式的執行。
我們將在本章的餘下部分對此程式作一詳細的檢查。當然,我們首先要從整體上看一下。
與前兩章中的範例程式一樣,HELLOWIN.C也有一個WinMain函式,但它還有另外一個函
數,名為WndProc。這就是視窗訊息處理程式。注意,在HELLOWIN.C中沒有呼叫WndProc
的程式程式碼。當然,在WinMain中有對WndProc的參考,而這就是該函式要在程式開頭附
近宣告的原因。
Windows函式呼叫
HELLOWIN至少呼叫了18個Windows函式。下面以它們在HELLOWIN中出現的次序列出
這些函式以及各自的簡明描述:
LoadIcon 載入圖示供程式使用。
LoadCursor 載入滑鼠游標供程式使用。
GetStockObject 取得一個圖形物件(在這個例子中,是取得繪製視窗背景的畫刷物件)。
RegisterClass 為程式視窗註冊視窗類別。
MessageBox 顯示訊息框。
CreateWindow 根據視窗類別建立一個視窗。
ShowWindow 在螢幕上顯示視窗。
UpdateWindow 指示視窗自我更新。
GetMessage 從訊息佇列中取得訊息。
TranslateMessage 轉譯某些鍵盤訊息。
DispatchMessage 將訊息傳送給視窗訊息處理程式。
PlaySound 播放一個聲音檔案。
BeginPaint 開始繪製視窗。
GetClientRect 取得視窗顯示區域的大小。
整理編撰:Defoe.Tu [email protected]
DrawText 顯示字串。
EndPaint 結束繪製視窗。
PostQuitMessage 在訊息佇列中插入一個「退出程式」訊息。
DefWindowProc 執行內定的訊息處理。
這些函式均在Platform SDK檔案中說明,並在不同的表頭檔案中宣告,其中絕大多數宣告
在WINUSER.H中。
大寫字母識別符號
讀者可能注意到,HELLOWIN.C中有幾個大寫的識別符號,這些識別符號是在Windows表頭文
件中定義的。有些識別符號含有兩個字母或者三個字母的字首,這些字首後頭接著一個底線:
這些是簡單的數值常數。字首指示該常數所屬的類別,如表3-1所示。
表3-1
字首 類別
CS 視窗類別樣式
CW 建立視窗
DT 繪製文字
IDI 圖示ID
IDC 遊標ID
MB 訊息框
SND 聲音
WM 視窗訊息
WS 視窗樣式
奉勸程式寫作者不要費力氣去記憶Windows程式設計中的數值常數。實際上,Windows中
使用的每個數值常數在表頭檔案中均有相應的識別符號定義。
新的資料型態
HELLOWIN.C中的其它識別符號是新的資料型態,也在Windows表頭檔案中使用typedef敘整理編撰:Defoe.Tu [email protected]
述或者#define敘述加以定義了。最初是為了便於將Windows程式從原來的16位系統上移
植到未來的使用32位(或者其它)技術的作業系統上。這種作法並不如當時每個人想象的那樣
順利,但是這種概念基本上是正確的。
有時這些新的資料型態只是為了方便縮寫。例如,用於WndProc的第二個引數的UINT資料
型態只是一個unsigned int (無正負號整數),在Windows 98中,這是一個32位的值。
用於WinMain的第三個引數的PSTR資料型態是指向一個字串的指標,即是一個char *。
其它資料型態的含義不太明顯。例如,WndProc的第三和第四個引數分別被定義為
WPARAM和LPARAM,這些名字的來源有點歷史背景:當Windows還是16位系統時,
WndProc的第三個引數被定義為一個WORD,這是一個16位的 無正負號短(unsigned
short)整數,而第四個引數被定義為一個LONG,這是一個32位有正負號長整數,從而導
致了文字「PARAM」前面加上了前置字首「W」和「L」。當然,在32位的Windows中,
WPARAM被定義為一個UINT,而LPARAM被定義為一個LONG(這就是C中的long整數型
態),因此視窗訊息處理程式的這兩個引數都是32位的值。這也許有點奇怪,因為WORD
資料型態在Windows98中仍然被定義為一種16位的 無正負號整數,因此「PARAM」前的
「W」就有點誤用了。
WndProc函式傳回一個型態為LRESULT的值,該值簡單地被定義為一個LONG。WinMain
函式被指定了一個WINAPI型態(在表頭檔案中定義的所有Windows函式都被指定這種型
態),而WndProc函式被指定一個CALLBACK型態。這兩個識別符號都被定義為_stdcall,
表示在Windows本身和使用者的應用程式之間發生的函式呼叫的呼叫引數傳遞方式。
HELLOWIN還使用了Windows表頭檔案中定義的四種資料結構(我們將在本章稍後加以討
論)。這些資料結構如表3-2所示。
表3-2
結構 含義
MSG 訊息結構
WNDCLASS 視窗類別結構
PAINTSTRUCT 繪圖結構
RECT 矩形結構
前面兩個資料結構在WinMain中使用,分別定義了兩個名為msg和wndclass的結構,後面
兩個資料結構在WndProc中使用,分別定義了ps和rect結構。
控制代碼簡介
最後,還有三個大寫識別符號(見表3-3),用於不同型態的「控制代碼」:
表3-3
識別符號 含義
HINSTANCE 執行實體(程式自身)控制代碼
HWND 視窗控制代碼
HDC 裝置內容控制代碼
控制代碼在Windows中使用非常頻繁。在本章結束之前,我們將遇到HICON(圖示控制代碼)、
HCURSOR(滑鼠游標控制代碼)和HBRUSH(畫刷控制代碼)。 整理編撰:Defoe.Tu [email protected]
控制代碼是一個(通常為32位的)整數,它代表一個物件。Windows中的控制代碼類似傳統C或者
MS-DOS程式設計中使用的檔案控制代碼。程式幾乎總是通過呼叫Windows函式取得控制代碼。程
序在其它Windows函式中使用這個控制代碼,以使用它代表的物件。代號的實際值對程式來說
是無關緊要的。但是,向您的程式提供代號的Windows模組知道如何利用它來使用相對應
的物件。
匈牙利表示法
讀者可能注意到,HELLOWIN.C中有一些變數的名字顯得很古怪。如szCmdLine,它是傳
遞給WinMain的引數。
許多Windows程式寫作者使用一種叫做「匈牙利表示法」的變數命名通則。這是為了紀念
傳奇性的Microsoft程式寫作者Charles Simonyi。非常簡單,變數名以一個或者多個小寫
字母開始,這些字母表示變數的資料型態。例如,szCmdLine中的sz代表「以0結尾的字元
串」。在hInstance和hPrevInstance中的h字首表示「控制代碼」;在iCmdShow中的i字首表示
「整數」。WndProc的後兩個引數也使用匈牙利表示法。正如我在前面已經解釋過的,儘管
wParam應該更適當地被命名為uiParam(代表「無正負號整數」),但是因為這兩個引數
是使用資料型態WPARAM和LPARAM定義的,因此保留它們傳統的名字。
在命名結構變數時,可以用結構名(或者結構名的一種縮寫)的小寫作為變數名的字首,或
者用作整個變數名。例如,在HELLOWIN. C的WinMain函式中,msg變數是MSG型態的
結構;wndclass是WNDCLASSEX型態的一個結構。在WndPmc函式中,ps是一個
PAINTSTRUCT結構,rect是一個RECT結構。
匈牙利表示法能夠幫助程式寫作者及早發現並避免程式中的錯誤。由於變數名既描述了變數
的作用,又描述了其資料型態,就比較容易避免產生資料型態不合的錯誤。
表3-4列出了在本書中經常用到的變數字首。
表3-4
字首 資料型態
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程式設計看起來枯燥乏味,只有程式設計才能感受快樂
windows程式設計一看就想睡覺,把你所知道的寫成上課筆記,分享給每一位易語言學習者。