隨筆-17  評論-64  文章-79  trackbacks-1

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

            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文件)才能正常使用
          posted on 2007-03-08 18:38 飛鳥 閱讀(451) 評論(0)  編輯  收藏 所屬分類: VC
          主站蜘蛛池模板: 南昌市| 易门县| 阜康市| 镇安县| 谢通门县| 榆社县| 连云港市| 太白县| 宁夏| 睢宁县| 铁岭市| 托克逊县| 芒康县| 荆州市| 永嘉县| 营口市| 红河县| 古蔺县| 康平县| 大渡口区| 芜湖市| 迭部县| 平谷区| 醴陵市| 楚雄市| 安泽县| 青冈县| 清丰县| 岳阳市| 海口市| 临高县| 弋阳县| 阿鲁科尔沁旗| 大埔县| 和平县| 太湖县| 肃北| 泸州市| 封开县| 阜城县| 女性|