預設編譯的 MFC 應用程式在 Windows XP/Server 2003 上仍顯示 Windows 95 風格介面,原因在於連結的是 ComCtl32.dll 5.0 版而非 6.0 版。本文說明如何透過 Manifest 檔案啟用 Visual Styles(視覺風格),讓應用程式自動跟隨系統主題變化。
Microsoft.Windows.Common-Controls 版本 6.0.0.0 的組件。.rc 末尾 #endif 前加入:CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST ".\\res\\YourAppName.exe.manifest"YourAppName.exe.manifest 放入 res 目錄):<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
.manifest 檔,修改 name、version 對應專案名稱。RT_MANIFEST,ID 設為 CREATEPROCESS_MANIFEST_RESOURCE_ID (值為 1)。.rc 檔手工加入上述資源陳述句。CYourApp::InitInstance() 最開頭呼叫 InitCommonControls() 確保通用控制項初始化。UxTheme.lib 支援自訂控制項繪製主題部件,可查詢當前主題字型、色彩、背景等細節。SetWindowTheme(hwnd, L" ", L" "))。| 現象 | 可能原因 | 解決方案 |
|---|---|---|
| 無效果,仍為經典風格 | Manifest 未正確內嵌或 ID 錯誤 | 用 Resource Hacker 檢查 exe 是否包含 RT_MANIFEST 資源 ID=1 |
| 部分控制項無風格 | 控制項建立早於 InitCommonControls | 確保 InitCommonControls() 在任何視窗建立前呼叫 |
| XP 上正常,Win7/10 異常 | Manifest 缺少 processorArchitecture 或 DPI 感知宣告 | 補全 manifest 中的 <asmv3:application> DPI 區段 |
效果對比圖(經典 vs XP 主題):

啟用 Visual Styles 僅需正確部署 Manifest 宣告相依於 Common Controls 6.0,零代碼修改即可讓舊專案煥然一新。VC6 專案雖需手動操作,但一次設定永久受益。建議所有面向用戶的 MFC 應用程式均啟用此功能,提升使用者體驗一致性。