第一個windows視窗程式
視窗版的hello world
//HelloMsg.c
#include<Windows.h>
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
MessageBox(NULL,TEXT("hello,Windows!"),TEXT("HelloMsg"),0);
return 0;
}
分析
標頭檔案
類似命令列的#include<stdio.h>
,不過更像C++的#include<iostream>
,包含了其他許多的標頭檔案。視窗版也包含了一個頭檔案,它包含了其他Windows表頭檔案
其中:
- windef.h:基本型別定義
- winnt.h:支援Unicode的型別定義(但是我在裡面並沒有找到)
- winbase.h:Kernel函式。定義了32位Windows的基本APIs
- winuser.h:USER介面函式。使用者過程宣告,常量定義和巨集。
- wingdi.h : 圖形裝置介面函式。GDI過程宣告,常量定義和巨集
程式進入點
正如在C程式中的進入點是函式main一樣,Windows程式的進入點是WinMain,總是像這樣出現:
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
由作業系統為WinMain傳入引數
在winbase.h中WinMain的宣告如下:
WinMain (
_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nShowCmd
);
_In_表示為輸入引數,_In_opt_表示可選輸入引數,指示引數可能為NULL,參見批註函式引數和返回值
WinMain的宣告與HelloMsg.c中的第三個引數稍有不同,LP字首表示長指標,是16位Windows下的產物。HelloMsg.c
WINAPI識別符號定義在minwindef.h中(書上寫定義在windef.h中,時間太長Windows某些東西變了?)語句如下:
#define WINAPI __stdcall
__stdcall表示由被呼叫方清理堆疊,引數從右向左傳遞。參見引數傳遞和命名約定
WinMain的第一個引數被稱為執行實體控制代碼,在Windows中控制代碼指唯一標識某些東西的數字。
在Windows的早期版本中,當同時運行同一程式多次時,您便建立了該程式的「多個執行實體(multiple instances)」。同一應用程式的所有執行實體共享程式和只讀的記憶體(通常是例如選單和對話方塊模板的資源)。程式通過檢查hPrevInstance引數就能夠確定自身的其它執行實體是否正在執行。然後它可以略過一些繁雜的工作並從前面的執行實體將某些資料移到自己的資料區域。在32位Windows版本中,該概念已被拋棄。傳給WinMain的第二個引數總是NULL(定義為0)。
WinMain的第三個引數是用於執行程式的命令列。某些Windows應用程式利用它在程式啟動時將檔案載入記憶體。
WinMain的第四個引數指出程式最初顯示的方式,可以是正常的或者是最大化地充滿整個畫面,或者是最小化顯示在工作列中。
MessageBox函式
MessageBox函式用於顯示簡訊息。雖然,MessageBox顯示的小視窗不具有什麼功能,實際上它被認為是一個對話方塊。
MessageBox的第一個引數通常是視窗控制代碼(將在後面介紹,可能是附加在指定的視窗上?)
第二個引數是在訊息框主體中顯示的字串。
第三個引數是出現在訊息框標題列上的字串。TEXT()是一個巨集,作用是將字母'L'新增到字串前,變成L"HelloMsg",轉換成Unicode字串,每個字元佔用兩個位元組
第四個引數控制訊息框的按鈕型別。見Win APIs