<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-17  評(píng)論-64  文章-79  trackbacks-1

    ActiveSkin 4.3 軟件換膚在VC中的實(shí)現(xiàn)

      ActiveSkin是一款給軟件更換皮膚的ActiveX控件。它很還好的將軟件界面設(shè)計(jì)工作從繁瑣程序代碼編寫(xiě)中解放出來(lái),使得功能設(shè)計(jì)者可以專(zhuān)心于功能代碼的實(shí)現(xiàn),而把軟件界面交給美工人員處理。提高了界面設(shè)計(jì)的工作效率,是一種很好的軟件設(shè)計(jì)思想。

    下面通過(guò)三個(gè)示例來(lái)介紹他的一般使用。

    示例一:標(biāo)準(zhǔn)型皮膚SkinForm的對(duì)話(huà)框工程
      在VC環(huán)境下建立一個(gè)MFC基本對(duì)話(huà)框工程。在對(duì)話(huà)框的資源文件里Dlg.rc設(shè)計(jì)對(duì)話(huà)框界面中,刪去已有的按鈕Buttons和標(biāo)簽Lables,并插入ActiveSkin的ActiveX控件,命名為IDC_SKIN。右鍵點(diǎn)擊ActiveSkin控件,在ActiveX屬性里選擇LoadSkin菜單項(xiàng),可預(yù)先加載一個(gè)Skin文件。
    在StdAfx.h中 //{{AFX_INSERT_LOCATION}} 之前添加以下語(yǔ)句:

        //目的是導(dǎo)入ActiveSkin的函數(shù)接口庫(kù)。
        #include <atlbase.h>
        #import "actskn43.ocx" no_implementation raw_interfaces_only raw_native_types
        using namespace ACTIVESKINLib;
    
    接著,在Dlg.cpp文件里添加語(yǔ)句:
        CComQIPtr<ISkin> m_pSkin=GetDlgItem(IDC_SKIN)->GetControlUnknown();//m_pSkin是應(yīng)用程序全局量。
        m_pSkin->LoadSkin(L"皮膚文件X的路徑");//如果ActiveSkin控件中已有皮膚,此句可省略。
        m_pSkin->ApplySkin((int)m_hWnd);
    
      編譯運(yùn)行,可以看到皮膚文件X成為了程序的運(yùn)行界面。如果想要在程序運(yùn)行時(shí)更換皮膚,那也是可以的。在對(duì)話(huà)框上建立一個(gè)Button,并添加Click事件:
        void CMy1Dlg::OnBNewSkin() 
        {
          static char BASED_CODE szFilter[] = "ActiveSkin Files (*.skn)|*.skn||";//文件過(guò)濾器設(shè)置。
          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);//使當(dāng)前Skin生效。
          }
        } 
      你會(huì)發(fā)現(xiàn)運(yùn)行時(shí)主窗口已經(jīng)換膚成功了,但“關(guān)于”對(duì)話(huà)框等非主窗口并沒(méi)變化。需要在AboutDlg的OnInitDialog()事件中加入一句:
        m_pSkin->ApplySkin((int)m_hWnd);
    
    再運(yùn)行就一切Ok了!

    示例二:標(biāo)準(zhǔn)皮膚SkinForm的多文檔工程
      和示例一的做法類(lèi)似,不同的只是子窗體在ChildFrm.cpp的Create事件中要做修改:
        BOOL bRes = CMDIChildWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, pContext);
        m_pSkin->ApplySkin((long)m_hWnd);
        return bRes;
    
    這樣就可以了。

    示例三:自由皮膚SkinFreeForm的事件操作
      和上述的SkinForm不同,SkinFreeFrom是另一類(lèi)型的皮膚文件方案。因此它的操作方法上就有所不同了。可以參照ActiveSkin自帶樣例中的DesktopColorizer一例。SkinForm和SkinFreeFrom的主要區(qū)別在于SkinApply方法和事件的驅(qū)動(dòng)方式上。
        if(FAILED(m_pSkin->LoadSkin(Temp))||   //均使用LoadSkin()裝載某一Skin,參數(shù)是Skin文件的路徑名。
          FAILED(m_pSkin->ApplySkinByName((long)m_hWnd, L"FreeForm")))
    
          //SkinForm類(lèi)型的皮膚使用ApplySkin使其生效,
          //這種方式會(huì)自動(dòng)將某Skin中的所有SkinObject元素替代指定Handle的窗口。
          //SkinFreeForm類(lèi)型的皮膚使用ApplySkinByName()使其生效,
          //其中第一個(gè)參數(shù)是窗口句柄,第二個(gè)參數(shù)是SkinBuilder中一個(gè)Object的名字。 
        {
          MessageBox("Could not load or apply the skin.");
          PostMessage(WM_CLOSE); 
          return FALSE;
        }
    
      事件驅(qū)動(dòng)的區(qū)別:SkinForm換膚時(shí)不影響程序代碼的原事件工作方式,只是界面上的換膚,因而SkinForm::ApplySkin(Handle)就OK了;但是SkinFreeForm就不同了,它必須用一個(gè)消息泵,采用消息的方式使程序獲得Skin上的事件,而且在其事件中采用ISkinObject::GetName(BSTR *)獲得相關(guān)的皮膚元素,用GetSkinnedWindow(hWnd).FindObject("Screen")來(lái)獲取相應(yīng)的元素句柄設(shè)置元素狀態(tài)。簡(jiǎn)單的消息泵可以通過(guò)Skin控件上右鍵Event設(shè)置并編寫(xiě)。
      具體實(shí)現(xiàn)請(qǐng)看示例源代碼。示例在使用前請(qǐng)安裝好ActiveSkin4.3,可能還需要修改事例中Skin控件初始的LoadSkin(Skin文件)才能正常使用
    posted on 2007-03-08 18:38 飛鳥(niǎo) 閱讀(451) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): VC
    主站蜘蛛池模板: 久久精品国产亚洲沈樵| 国产高清免费在线| 亚洲国产第一站精品蜜芽| 一区免费在线观看| 免费A级毛片无码A| 成年大片免费视频播放一级| 一级毛片直播亚洲| 免费无码AV一区二区| 国产av无码专区亚洲av果冻传媒| 又硬又粗又长又爽免费看 | 亚洲中文字幕视频国产| 又大又硬又粗又黄的视频免费看 | 一级成人生活片免费看| 亚洲美女在线国产| 99久久免费国产精品热| 久久精品国产亚洲香蕉 | 免费无码看av的网站| 国产亚洲成在线播放va| 伊人亚洲综合青草青草久热| 今天免费中文字幕视频| 亚洲乱码在线播放| 国产99视频精品免费视频7| 国产精品无码免费专区午夜| 亚洲2022国产成人精品无码区| 狼群影院在线观看免费观看直播| 亚洲男人的天堂久久精品| 国产在线19禁免费观看国产| 一级视频免费观看| 亚洲精品免费在线| 免费在线观看视频a| 国产一区二区免费| 国产精品高清视亚洲精品| 国产免费人成在线视频| 怡红院免费全部视频在线视频| 久久亚洲精品无码aⅴ大香 | 午夜两性色视频免费网站| 中文字幕视频免费在线观看 | 老妇激情毛片免费| 亚洲三级电影网站| 日韩亚洲国产综合久久久| 日韩人妻一区二区三区免费|