/*------------------------------------------------------------------HelloMsg.c -- Displays "Hello, Windows 98!" in a message box(c) Charles Petzold, 1998--------------------------------------------------------------------*/#include <windows.h>int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ MessageBox (NULL, TEXT ("Hello, Windows 98!"), TEXT ("HelloMsg"), 0); return 0 ;}
幾乎每一個使用C/C++編寫的Windows程式在開頭都會使用include引入"windows.h"標頭檔,WINDOWS.H是主要的含入檔案,
它包含了其它Windows表標頭檔,這些表標頭檔的某些也包含了其它表標頭檔.這些表標頭檔中最重要的和最基本的是:
WINDEF.H 基本型態定義。
WINNT.H 支援Unicode的型態定義。
WINBASE.H Kernel函數。
WINUSER.H 使用者介面函數。
WINGDI.H 圖形裝置介面函數。
這些表標頭檔定義了Windows的所有資料型態、函數呼叫、資料結構和常數標識符,它們是Windows檔案中的一個重要部分.
每一個C/C++程式都有一個程式入口(main函數),Windows程式的也有進入點:WinMain,該函數總是像這樣出現:
int WINAPI WinMain ( HINSTANCE hInstance,HINSTANCE hPrevInstance, PSTR szCmdLine,int iCmdShow)
WinMain在WINBASE.H中有如下聲明:
intWINAPIWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd );
其中第三個參數在WINBASE.H中定義為LPSTR,樣本中為PSTR.這兩種資料型態都定義在WINNT.H中,作為指向字串的指標.LP首碼代表「長指標」,這是16位Windows下的寫法.
WinMain函式宣告為返回一個int值.WINAPI標識符在WINDEF.H定義,語句如下:
#define WINAPI __stdcall
該語句指定了一個呼叫約定,包括如何生產機械碼以在堆棧中放置函數呼叫的參數.許多Windows函數呼叫聲明為WINAPI.
WinMain的第1個參數被稱作「執行實體控制代碼」.在Windows程式設計中,控制代碼僅是一個應用程式用來識別某些東西的數字.在這種情況下,該控制代碼唯一地標識該程式,還需要它在其它Windows函數呼叫中作為參數.
在Windows的早期版本中,當同時運行同一程式多次時,便建立了該程式的「多個執行實體(multiple instances)」.同一應用程式的所有執行實體共用程式和唯讀記憶體(通常是例如菜單和對話方塊模板的資源).程式通過檢查hPrevInstance參數就能夠確定自身的其它執行實體是否正在運行,然後它可以略過一些繁雜的工作並從前面的執行實體將某些資料移到自己的資料區域,在32位Windows版本中,該概念已被拋棄,故傳給WinMain的第2個參數總是NULL(定義為0).
WinMain的第3個參數是用於執行程式的命令列,如某些Windows應用程式利用它在程式啟動時將檔案載入記憶體.
WinMain的第4個參數指出程式最初顯示的方式,可以是正常的或者是最大化地充滿整個畫面,或者是最小化顯示在工作列中.
MessageBox函數用於顯示簡訊息,雖然,MessageBox顯示的小視窗不具有什麼功能,實際上被認為是一個對話方塊.
MessageBox的第1個參數通常是視窗控制代碼.
第2個參數是在訊息框主體中顯示的字串.
第3個參數是出現在訊息框標題列上的字串,在樣本程式中,這些文字字串的每一個都被封裝在一個TEXT宏中.
MessageBox的第4個參數用於在對話方塊中顯示按鈕,它可以是在WINUSER.H中定義的一組以首碼MB_開始的常數的組合,有以下內容:
#define MB_OK 0x00000000L#define MB_OKCANCEL 0x00000001L#define MB_ABORTRETRYIGNORE 0x00000002L#define MB_YESNOCANCEL 0x00000003L#define MB_YESNO 0x00000004L#define MB_RETRYCANCEL 0x00000005L
如果在樣本程式中將第4個參數設定為0,則僅顯示「OK」按鈕.可以使用OR(|)操作符號將上面顯示的一個常數與代表內定按鈕的常數組合:
#define MB_DEFBUTTON1 0x00000000L#define MB_DEFBUTTON2 0x00000100L#define MB_DEFBUTTON3 0x00000200L#define MB_DEFBUTTON4 0x00000300L
還可以使用一個常數指出訊息框中圖示的外觀:
#define MB_ICONHAND 0x00000010L#define MB_ICONQUESTION 0x00000020L#define MB_ICONEXCLAMATION 0x00000030L#define MB_ICONASTERISK 0x00000040L
這些圖示中的某些有替代名稱:
#define MB_ICONWARNING MB_ICONEXCLAMATION#define MB_ICONERROR MB_ICONHAND#define MB_ICONINFORMATION MB_ICONASTERISK#define MB_ICONSTOP MB_ICONHAND
在樣本程式中,MessageBox返回數值1,但更嚴格地說它返回IDOK,IDOK在WINUSER.H中定義,等於1。根據在訊息框中顯示的其它按鈕,MessageBox函數還可返回IDYES、IDNO、IDCANCEL、IDABORT、
IDRETRY或IDIGNORE。