輕量級 MFC 皮膚庫,支援 Win9x~XP、Unicode/ANSI、標準控制項/系統選單/通用對話框換膚。非商業免費,官網 appface.com。核心檔案:appface.h、appface.dll、*.urf 皮膚檔。
| 方式 | API | 適用場景 | 優/缺點 |
|---|---|---|---|
| 磁碟檔案 | Start("skin.urf", GTP_LOAD_FILE, ...) | 使用者可自行更換皮膚 | +彈性 -需部署外部檔 |
| 資源內嵌 | Start("IDR_MY_URF", GTP_LOAD_RESOURCE, NULL, "MYTYPE", NULL) | 單一 EXE 部署、防竄改 | +零外部相依 -資源 ID 需雙引號 |
| 記憶體緩衝 | Start(pBuf, GTP_LOAD_MEMORY, size, NULL, NULL) | 動態解密/下載皮膚、加密保護 | +完全控制 -需自行管理記憶體 |
appface.h、appface.dll (輸出目錄)、gtclassic.urfgtclassic.urf → 類型 "MYRESTYPE"、ID "IDR_MY_URF" (含雙引號)CResSkinApp::InitInstance():
#include "appface.h"
BOOL CResSkinApp::InitInstance() {
// ... 既有初始化 ...
CAppFace af; // 1. 建立實例
af.Start(_T("IDR_MY_URF"), GTP_LOAD_RESOURCE, NULL, _T("MYTYPE"), NULL); // 2. 載入
CResSkinDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
// ... 既有清理 ...
af.Remove(); // 3. 釋放 (必須配對)
return FALSE; // 模態對話框結束
}
BOOL CResSkinApp::InitInstance() {
CAppFace af;
if (HRSRC hr = ::FindResource(NULL, "IDR_MY_URF", "MYTYPE")) {
ULONG nResSize = ::SizeofResource(NULL, hr);
if (HGLOBAL hg = ::LoadResource(NULL, hr)) {
char* p = (char*)LockResource(hg);
if (p)
af.Start(p, GTP_LOAD_MEMORY, nResSize, NULL, NULL);
}
}
// ... 同前 ...
af.Remove();
return FALSE;
}
此法可搭配加密:資源存加密資料 → InitInstance 解密到記憶體 → GTP_LOAD_MEMORY 載入。
若 Import 時 ID **未**加雙引號 (如 IDR_MY_URF),載入需用 MAKEINTRESOURCE:
af.Start(_T("IDR_MY_URF"), GTP_LOAD_RESOURCE, NULL,
MAKEINTRESOURCE(_T("MYTYPE")), NULL);
建議統一**加雙引號**,避免混淆。

標準控制項 (按鈕、編輯框、下拉框、分頁)、非客戶區 (標題列、選單、捲軸) 皆自動套用皮膚,零程式碼侵入。
appface.lib (若有)appface.dllInitInstance 最早處呼叫 af.Start,最晚處呼叫 af.RemoveInitInstance 呼叫,EXE 不重複呼叫免費版僅內建三款 URF,商業專案可購買授權或自行繪製 URF (官方提供編輯器)。