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

AppFace 庫從資源載入 URF 皮膚:三種載入方式與實戰技巧

     編輯:關於VC++

AppFace 簡介

輕量級 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)動態解密/下載皮膚、加密保護+完全控制 -需自行管理記憶體

方式一:資源內嵌 (官方標準做法)

  1. 專案加入 appface.h、appface.dll (輸出目錄)、gtclassic.urf
  2. 資源視圖 → 右鍵 Import → 選 gtclassic.urf → 類型 "MYRESTYPE"、ID "IDR_MY_URF" (含雙引號)
  3. 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 載入。

資源 ID 雙引號陷阱

若 Import 時 ID **未**加雙引號 (如 IDR_MY_URF),載入需用 MAKEINTRESOURCE:


af.Start(_T("IDR_MY_URF"), GTP_LOAD_RESOURCE, NULL,
         MAKEINTRESOURCE(_T("MYTYPE")), NULL);

建議統一**加雙引號**,避免混淆。

執行效果

標準控制項 (按鈕、編輯框、下拉框、分頁)、非客戶區 (標題列、選單、捲軸) 皆自動套用皮膚,零程式碼侵入。

遷移既有專案檢查清單

  • [ ] 專案設定 → Linker → Input → Additional Dependencies 加 appface.lib (若有)
  • [ ] 輸出目錄放 appface.dll
  • [ ] InitInstance 最早處呼叫 af.Start,最晚處呼叫 af.Remove
  • [ ] 若用 MFC 擴充 DLL,需在 DLL InitInstance 呼叫,EXE 不重複呼叫
  • [ ] 測試高 DPI / 多顯示器 / 遠端桌面 相容性

免費版僅內建三款 URF,商業專案可購買授權或自行繪製 URF (官方提供編輯器)。

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