一、什么是 Win32
Win32 是指 Microsoft Windows 操作系統的 32 位環境,與 Win64 都為 Windows 常見環境。
這里再介紹下 Win32 Application 和 Win32 Console Application 之間的區別:
1、程序不同
-
Win32 Application 是標准 windows 程序,完全擁有 windows 的特性,可以通過鼠標點擊窗口來完成控制。
-
Win32 Console Application 是控制台應用程序,類似於 MS-DOS 窗口,只能運行命令行程序,不具備消息響應機制。
2、入口函數不同
-
Win32 Application 入口函數是 WinMain(),它具有消息響應機制,可以運行圖形化的 C++ 程序。
-
Win32 Console Application 入口函數是 main(),可以訪問部分 windows API 函數,如果你編寫傳統的 C 程序,必須建立 Win32 Console 程序。
二、最簡單的程序
創建一個 win32 應用程序 工程,功能是顯示一個消息框,隨便提示一些文字就可以了。具體的創建工程的步驟可以參考:創建一個最簡單的win32應用程序 。代碼如下:
#include <Windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
MessageBox(
NULL,
TEXT("隨便提示一些內容就可以了!哈哈哈!"), // 內容
TEXT("這里是標題!"), // 標題名稱
0);
return 0;
}
我們再看一下效果:

接下來我們從頭開始剖析這個簡單的小程序。
三、分析一下
3.1 頭文件
#include <Windows.h>
windows.h 是一個最重要的包含文件,它囊括了若干其他 Windows 頭文件,其中的某些頭文件又包含另外的一些頭文件。
下列幾個是最重要也是最基本的頭文件:
WINDEF.H基本數據類型定義。WINNT.H支持 Unicode的類型定義。WINBASE.H內核函數。WINUSER.H用戶界面函數。WINGDI.H圖形設備接口函數。
這些頭文件定義了 Windows 的所有數據類型、函數調用、數據結構以及常量標識符。
3.2 程序入口
main 是 C 程序的入口,而 Windows 程序的入口是 WinMain,它總是這個樣子的:
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)
WinMain 函數的返回值被定義為 int。WINAPI 標識符在 WINDEF.H 中定義,它規定了一種函數調用約定。而我們絕大多數 Windows 函數調用都定義成 WiNAPI。
我們再來研究一下它的參數部分:
- 第一個參數一般叫做 “實例句柄”(Instance Handle)。在 Windows 程序中,句柄無非就是一個數值,程序里用它來標識某些東西。比如在我們這個例子里,這個句柄就唯一標識了我們的這個程序,代表程序本身。實際上在某些Windows程序中,把句柄當作調用參數是必須的。比如在早期的 Windows 版本中,當多路並發運行同一個程序時,就需要為那個程序創建多個實例。同一程序的所有的實例都共享代碼和只讀存儲。
- 一個程序可以通過查看 hPrevInstance,也就是第二個參數從而知道是否有它的其他實例正在運行。它也就可以因此跳過某些零散雜務步驟,把一些數據從前一個實例搬到自己的數據區來。但是在 32 位Windows 中,這一概念已不再采用。 因此 WinMain 的第二個參數通常總是 NULL(定義為 0)。
- WinMain 的第三個參數是用來運行程序的命令行(Command Line)。有些 Windows 程序在啟動時用它來把文件裝入內存。
- WinMain 的第四個參數用來指明程序最初如何顯示或正常顯示,或最大化到全屏,或最小化顯示在任務欄上。
3.2 MessageBox函數
最后我們看一下最主要的 MessageBox 函數。
MessageBox 函數是用來顯示短信息的。盡管形式比較單一,MessageBox 所顯示的小
小窗口實際上也是一個對話框。
我們也研究一下它的幾個參數:
-
MessageBox的第一個參數通常是一個窗口句柄。我們先不管它。
-
第二個參數就是將要在信息框里出現的文本字符串。
-
第三個參數是將要在標題欄上顯示的文本字符串。而且在這個程序中,我們把所有的字符串都打包到 TEXT 宏代碼里面,就是用
TEST("XXX")把它包裹起來。一般來說,並不需要把所有的字符串都打包到 TEXT 宏代碼里面,之所以這樣做是因為這樣在把程序轉換成 Unicode 時會方便很多。 -
第四個參數是以前綴
MB_打頭的一些常量的組合。WINUSER.H 中定義了這些相關常量。比如下面的這些,你可以任選一個來表示在對話框里希望用哪種按鈕:#define MB_OK 0X00000000L // ok #define MB_OKCANCEL 0x00000001L // ok和取消 #define MB_ABORTRETRYIGNORE 0x00000002L // 中止、重試和取消 #define MB_YESNOCANCEL 0x00000003L // yes/no/取消 #define MB_YESNO 0X00000004L // yes和no #define MB_RETRYCANCEL 0x00000005L // 重試和取消
參考:
