ActiveSkin 4.3 软件换肤在VC中的实现

y被疼是种运气

y被疼是种运气

2016-01-29 11:58

ActiveSkin 4.3 软件换肤在VC中的实现,ActiveSkin 4.3 软件换肤在VC中的实现

ActiveSkin 4.3 软件换肤在VC中的实现

作者:南昌航空工业学院 杜晶

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)

下载源代码

  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文件)才能正常使用。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)
展开更多 50%)
分享

猜你喜欢

ActiveSkin 4.3 软件换肤在VC中的实现

C语言教程 C语言函数
ActiveSkin 4.3 软件换肤在VC中的实现

软件换肤技术在 BCB 中的实现

C语言教程 C语言函数
软件换肤技术在 BCB 中的实现

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

vc中使用免费界面换肤软件 USkin

编程语言 网络编程
vc中使用免费界面换肤软件 USkin

在VC中实现画任意方向椭圆

编程语言 网络编程
在VC中实现画任意方向椭圆

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

如何用VC实现软件注册

编程语言 网络编程
如何用VC实现软件注册

在VC++实现数据加密

C语言教程 C语言函数
在VC++实现数据加密

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

软件换肤技术在 BCB 中的实现

软件换肤技术在 BCB 中的实现

HTML彻底剖析:一般概念

HTML彻底剖析:一般概念
下拉加载更多内容 ↓