1.1 Windows 核心特性
- 圖形使用者介面 (GUI) 標準化:統一選單、對話方塊、捲軸、圖示、控制項外觀與鍵盤/滑鼠互動模型,降低使用者學習成本,也減輕開發者繪製基本 UI 的負擔。
- 硬體抽象層 (HAL):應用程式透過 GDI/User32 呼叫繪圖、輸入、列印、序列埠、系統時鐘,無需關心顯示卡、印表機、滑鼠的具體驅動細節。
- 多工 (Preemptive Multitasking):多行程同時執行,單一前景行程接收輸入焦點,背景行程持續運算。Windows 95 起支援 32 位元預防性多工,NT 核心更完善支援 SMP。
- 動態連結庫 (DLL) 共享:系統服務以 DLL 形式提供 (
kernel32.dll, user32.dll, gdi32.dll),行程載入時動態連結,節省記憶體並利於系統更新。
1.2 Windows 版本演進脈絡
| 版本 | 年份 | 關鍵里程碑 |
| Windows 1.01 | 1985 | 首個公開版,平鋪視窗、合作式多工、依賴 DOS |
| Windows 2.0 | 1987 | 重疊視窗、改良鍵盤/滑鼠、擴充記憶體支援 |
| Windows 3.0/3.1 | 1990/1992 | Program Manager、File Manager、TrueType 字型、大賣 1000 萬套 |
| Windows NT 3.1 | 1993 | 純 32 位元核心、HAL、安全子系統、POSIX/OS/2 子系統 |
| Windows 95 | 1995 | 開始功能表、工作列、Plug-and-Play、32 位元應用為主、長檔名 |
| Windows NT 4.0 | 1996 | Shell 整合 IE4、GDI 移入核心模式、企業級穩定 |
| Windows 2000 / XP | 2000/2001 | NT 核心統一消費者與企業市場、Active Directory、驅動簽名 |
| Windows Vista / 7 | 2006/2009 | Aero、DWM 合成、UAC、BitLocker、Direct2D/DWrite |
| Windows 8 / 10 / 11 | 2012/2015/2021 | Modern/WinRT/UWP、OneCore 統一核心、WSL、WinUI 3、ARM64 原生 |
1.3 視窗結構拆解
標準視窗組件:標題列、選單列、工具列、用戶區、捲軸、狀態列
| 組件 | 功能 | 程式存取 |
| 邊框 | 視窗邊界、拖曳調整大小 | WM_NCHITTEST, WM_SIZING |
| 標題列 | 顯示應用程式名稱、圖示、系統選單 | SetWindowText, WM_NCPAINT |
| 控制方塊 (系統選單) | 還原/移動/大小/最小化/最大化/關閉 | GetSystemMenu, WM_SYSCOMMAND |
| 最小化/最大化/關閉鈕 | 快速視窗狀態切換 | WM_SYSCOMMAND (SC_MINIMIZE 等) |
| 垂直/水平捲軸 | 瀏覽超出用戶區的內容 | SB_VERT/SB_HORZ, SetScrollInfo |
| 選單列 | 下拉式命令選單,支援熱鍵 (Alt+字母) | LoadMenu, WM_COMMAND |
| 用戶區 | 應用程式繪圖、互動主區域 | WM_PAINT, WM_MOUSEMOVE, WM_KEYDOWN |
1.4 物件導向思維在 Windows API 中的體現
Windows API 雖為 C 風格,但核心設計貫徹 OO 概念:
- 物件 = 句柄 (Handle) + 內部狀態:
HWND、HDC、HBRUSH、HINSTANCE 皆為不透明指標/整數,代表內核管理的實體。
- 封裝:內部結構 (如
WNDCLASS, LOGFONT) 由開發者填寫,系統負責解讀與維護內部資料。
- 訊息傳遞 = 多型分派:
SendMessage(hwnd, WM_PAINT, ...) — 同一訊息針對不同視窗類別觸發不同 WndProc 實作,實現執行期多型。
- 繼承/組合:自訂控制項透過
RegisterClassEx 繼承系統類別 (如 "BUTTON", "EDIT"),或組合多個子視窗構成複合控制項。
- 類別工廠:
CreateWindowEx 依類別名實例化視窗物件,每個實例擁有獨立狀態 (位置、大小、資料),共享同一 WndProc 程式碼。
1.5 句柄機制深度解析
// 句柄本質:32/64 位元不透明值,實為內核物件表索引
typedef HANDLE HWND; // 視窗
typedef HANDLE HDC; // 裝置內容
typedef HANDLE HBRUSH; // 刷子
typedef HANDLE HPEN; // 畫筆
typedef HANDLE HFONT; // 字型
typedef HANDLE HBITMAP; // 位圖
typedef HANDLE HINSTANCE; // 模組實例
typedef HANDLE HMENU; // 選單
typedef HANDLE HCURSOR; // 游標
typedef HANDLE HICON; // 圖示
句柄分類與生命週期
| 類別 | 建立 API | 銷毀 API | 參考計數 |
| 視窗 | CreateWindowEx | DestroyWindow | 無,單一擁有者 |
| GDI 物件 | CreateSolidBrush, CreateFontIndirect | DeleteObject | 有,GetObjectRefCount (僅除錯) |
| 核心物件 | CreateFile, CreateThread, CreateMutex | CloseHandle | 有,進程結束自動關閉 |
| 模組實例 | LoadLibrary, GetModuleHandle | FreeLibrary | 有,引用計數 |
常見錯誤與最佳實務
❌ 錯誤:GDI 物件洩漏
// 錯誤:每次 WM_PAINT 建立新筆刷未刪除
HBRUSH hBrush = CreateSolidBrush(RGB(255,0,0));
SelectObject(hdc, hBrush); // 舊刷子洩漏
Rectangle(hdc, ...);
// 缺少 DeleteObject(hBrush);
✅ 正確:建立一次、重複使用、銷毀時釋放
// 視窗建立時
hBrushRed = CreateSolidBrush(RGB(255,0,0));
// WM_PAINT
HBRUSH hOld = SelectObject(hdc, hBrushRed);
Rectangle(hdc, ...);
SelectObject(hdc, hOld); // 還原
// 視窗銷毀時
DeleteObject(hBrushRed);
1.6 從 Win32 到現代開發
- MFC (Microsoft Foundation Classes):C++ 薄封裝,文檔/視圖架構,訊息映射宏,1992 年推出,仍廣泛用於既有企業應用。
- WTL (Windows Template Library):ATL 為基礎的輕量級範本庫,無 MFC 運行時依賴,適合小型工具。
- WinForms / WPF / UWP / WinUI 3:.NET 生態的托管 UI 框架,底層仍呼叫 Win32/API (User32/GDI/DirectX)。
- Rust/Go/Zig 綁定:
windows-rs, golang.org/x/sys/windows, zig-windows 提供類型安全的 FFI 封裝。
結語
Windows 程式設計的基石在於理解「視窗、訊息、句柄、GDI」四大支柱,以及其背後的物件導向建模。雖然現代開發多使用高階框架,但遇到效能調校、跨語言互操作、驅動開發、安全性研究、舊系統維護時,扎實的 Win32 功力不可或缺。建議開發者以 Petzoid 風格手寫純 Win32 視窗程式、自繪控制項、多執行緒訊息泵,建立直覺後再轉向高階框架,方能游刃有餘。