ActiveSkin 4.3 軟體換膚在VC中的實現

來源:互聯網
上載者:User
ActiveSkin是一款給軟體更換皮膚的ActiveX控制項。它很還好的將軟體介面設計工作從繁瑣程式碼編寫中解放出來,使得功能設計者可以專心於功能代碼的實現,而把軟體介面交給美工人員處理。提高了介面設計的工作效率,是一種很好的軟體設計思想。

下面通過三個樣本來介紹他的一般使用。

樣本一:標準型皮膚SkinForm的對話方塊工程
  在VC環境下建立一個MFC基本對話方塊工程。在對話方塊的資源檔裡Dlg.rc設計對話方塊介面中,刪去已有的按鈕Buttons和標籤Lables, 並插入ActiveSkin的ActiveX控制項,命名為IDC_SKIN。右鍵點擊ActiveSkin控制項,在ActiveX屬性裡選擇 LoadSkin功能表項目,可積極式載入一個Skin檔案。
在StdAfx.h中 //{{AFX_INSERT_LOCATION}} 之前添加以下語句:

    //目的是匯入ActiveSkin的函數介面庫。
#include <atlbase.h>
#import "actskn43.ocx" no_implementation raw_interfaces_only raw_native_types
using namespace ACTIVESKINLib;

接著,在Dlg.cpp檔案裡添加語句:

    CComQIPtr<ISkin> m_pSkin=GetDlgItem(IDC_SKIN)->GetControlUnknown();//m_pSkin是應用程式全域量。
m_pSkin->LoadSkin(L"皮膚檔案X的路徑");//如果ActiveSkin控制項中已有皮膚,此句可省略。
m_pSkin->ApplySkin((int)m_hWnd);

編譯運行,可以看到皮膚檔案X成為了程式的運行介面。如果想要在程式運行時更換皮膚,那也是可以的。在對話方塊上建立一個Button,並添加Click事件:

    void CMy1Dlg::OnBNewSkin() 
{
static char BASED_CODE szFilter[] = "ActiveSkin Files (*.skn)|*.skn||";//檔案過濾器設定。
CFileDialog dlg(FALSE, ".skn", NULL, OFN_HIDEREADONLY, szFilter);//Skin檔案選擇視窗。
if (dlg.DoModal() == IDOK)//Skin檔案選擇成功:
{
USES_CONVERSION;
m_pSkin->LoadSkin(T2W(dlg.GetPathName()));//載入指定的Skin檔案。
m_pSkin->ApplySkin((int)m_hWnd);//使當前Skin生效。
}
}

你會發現運行時主視窗已經換膚成功了,但“關於”對話方塊等非主視窗並沒變化。需要在AboutDlg的OnInitDialog()事件中加入一句:

    m_pSkin->ApplySkin((int)m_hWnd);

再運行就一切Ok了!

樣本二:標準皮膚SkinForm的多文檔工程
  和樣本一的做法類似,不同的只是子表單在ChildFrm.cpp的Create事件中要做修改:

    BOOL bRes = CMDIChildWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, pContext);
m_pSkin->ApplySkin((long)m_hWnd);
return bRes;

這樣就可以了。

樣本三:自由皮膚SkinFreeForm的事件操作
  和上述的SkinForm不同,SkinFreeFrom是另一類型的皮膚檔案方案。因此它的操作方法上就有所不同了。可以參照ActiveSkin 內建範例中的DesktopColorizer一例。SkinForm和SkinFreeFrom的主要區別在於SkinApply方法和事件的驅動方式 上。

    if(FAILED(m_pSkin->LoadSkin(Temp))||   //均使用LoadSkin()裝載某一Skin,參數是Skin檔案的路徑名。
FAILED(m_pSkin->ApplySkinByName((long)m_hWnd, L"FreeForm")))

//SkinForm類型的皮膚使用ApplySkin使其生效,
//這種方式會自動將某Skin中的所有SkinObject元素替代指定Handle的視窗。
//SkinFreeForm類型的皮膚使用ApplySkinByName()使其生效,
//其中第一個參數是視窗控制代碼,第二個參數是SkinBuilder中一個Object的名字。
{
MessageBox("Could not load or apply the skin.");
PostMessage(WM_CLOSE);
return FALSE;
}

事件驅動的區別:SkinForm換膚時不影響程式碼的原事件工作方式,只是介面上的換膚,因而SkinForm::ApplySkin (Handle)就OK了;但是SkinFreeForm就不同了,它必須用一個訊息泵,採用訊息的方式使程式獲得Skin上的事件,而且在其事件中採用 ISkinObject::GetName(BSTR *)獲得相關的皮膚元素,用GetSkinnedWindow(hWnd).FindObject("Screen")來擷取相應的元素控制代碼設定元素狀 態。簡單的訊息泵可以通過Skin控制項上右鍵Event設定並編寫。
  具體實現請看樣本原始碼。樣本在使用前請安裝好ActiveSkin4.3,可能還需要修改案例中Skin控制項初始的LoadSkin(Skin檔案)才能正常使用。  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.