首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Windows 程式設計基礎:從視窗架構到物件導向與句柄機制

     編輯:關於C語言

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.011985首個公開版,平鋪視窗、合作式多工、依賴 DOS
Windows 2.01987重疊視窗、改良鍵盤/滑鼠、擴充記憶體支援
Windows 3.0/3.11990/1992Program Manager、File Manager、TrueType 字型、大賣 1000 萬套
Windows NT 3.11993純 32 位元核心、HAL、安全子系統、POSIX/OS/2 子系統
Windows 951995開始功能表、工作列、Plug-and-Play、32 位元應用為主、長檔名
Windows NT 4.01996Shell 整合 IE4、GDI 移入核心模式、企業級穩定
Windows 2000 / XP2000/2001NT 核心統一消費者與企業市場、Active Directory、驅動簽名
Windows Vista / 72006/2009Aero、DWM 合成、UAC、BitLocker、Direct2D/DWrite
Windows 8 / 10 / 112012/2015/2021Modern/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參考計數
視窗CreateWindowExDestroyWindow無,單一擁有者
GDI 物件CreateSolidBrush, CreateFontIndirectDeleteObject有,GetObjectRefCount (僅除錯)
核心物件CreateFile, CreateThread, CreateMutexCloseHandle有,進程結束自動關閉
模組實例LoadLibrary, GetModuleHandleFreeLibrary有,引用計數

常見錯誤與最佳實務

❌ 錯誤: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 視窗程式、自繪控制項、多執行緒訊息泵,建立直覺後再轉向高階框架,方能游刃有餘。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved