1、ActiveSkin 的使用ActiveSkin 可以替你的软件作“ 换肤手术”,可以更换软件的外观,形状、颜色以及看起来的感觉。让软件界面不一定是长方形的,也可以是圆形、椭圆形或者不规则形状。不只是主窗口画面可以做变化,连软件的其他设定画面、对话框等等也都可以依照你的意思来设计,半透明、阴影等效果都可以。你还可以把软件设计得像是MAC、UNIX 等其他操作系统的软件的样子。设计步骤有四个:1. 先用绘图软件画出一张图,并且储存成 bmp 格式。 2.用文本编辑软件编辑一个 Skin.xml 文件。3.用 Visual Basic 设计一个对话框,并且把 ActiveSkin Control
2、放进去。你必须把 SkinPath 指定到放 Skin 文件的位置。 4.编辑 ActiveSkin Control 的 OnSkinNotify。注意:安装后请先执行 Install.bat,然后才能开始使用。相关连接: ActiveSkin 4.3 软件换肤在 VC 中的实现 ActiveSkin 作为一款优秀的 Win32 应用程序皮肤插件,有着使用简单,效果出色的诸多特点。正好这次在应用中用到了该插件,对使用中的注意事项做一个小结。 首先要找到一个 ActiveSkin 的软件,并且正确安装,这个很简单,另外说一下的就是它带的一些 Sample 效果十分出色,可以看看。对话框应用 在对
3、话框中的应用不是很复杂,应该可以看到很多中文例程,这里大概说一下。 在 Stdafx.h 中加入函数接口库。 #include #import “actskn43.ocx“ no_implementation raw_interfaces_only raw_native_types using namespace ACTIVESKINLib; 在 DlgApp.h 文件里添加语句 CComQIPtr m_pSkin;();在 Dlg.cpp 文件里添加语句 (YourApp*)AfxGetApp( )-m_pSkin=GetDlgItem(IDC_SKIN)-GetControlUnknown
4、();/m_pSkin 是应用程序全局量。 m_pSkin-LoadSkin(L“皮肤文件 X 的路径“);/如果 ActiveSkin控件中已有皮肤,此句可省略。 m_pSkin-ApplySkin(int)m_hWnd);基本上就可以看到基本的效果了,如果还要更多,可以看看附带的文章或者是ActiveSkin 附带的例子。 框架应用。 框架和对话框的应用有一些不同,应该是必须在对话框中将 m_pSkin 创建,然后框架才能够使用,于是必须增加一个对话框,并且在资源编辑器里面加入ActiveSkin 的控件,同时可以在这里指定 Skin 的路径。 在 app.h 中加入对话框的头文件,并且将
5、对话框的一个实例作为它的成员。然后在InitInstance()中加入以下代码: if (!m_dlgSkin.Create(IDD_SKINDIALOG) /创建对话框并应用Skin| !m_dlgSkin.m_hWnd | !m_pSkin) MessageBox(NULL, “Could not initialize ActiveSkin control.nPlease make sure it is installed properly.“, “Error“, MB_ICONEXCLAMATION); return false; 此句必须在 AfxEnableControlContai
6、ner();之后。 在对话框.cpp 文件的 OnInitDialog()里添加语句 (YourApp*)AfxGetApp()-m_pSkin = GetDlgItem(IDC_SKIN)-GetControlUnknown(); 对框架视图的切换,使用上还有一切问题,具体描述就是切换视图之后,视图上控件的皮肤会失去,需要修改一下代码,明天来做吧,今天太累了,玩几把War3再说,哈哈。 ActiveSkin 是一款给软件更换皮肤的 ActiveX 控件。它很还好的将软件界面设计工作从繁琐程序代码编写中解放出来,使得功能设计者可以专心于功能代码的实现,而把软件界面交给美工人员处理。提高了界面设
7、计的工作效率,是一种很好的软件设计思想。下面通过三个示例来介绍他的一般使用。示例一:标准型皮肤 SkinForm 的对话框工程在 VC 环境下建立一个 MFC 基本对话框工程。在对话框的资源文件里 Dlg.rc 设计对话框界面中,删去已有的按钮 Buttons 和标签 Lables,并插入 ActiveSkin 的ActiveX 控件,命名为 IDC_SKIN。右键点击 ActiveSkin 控件,在 ActiveX 属性里选择LoadSkin 菜单项,可预先加载一个 Skin 文件。在 StdAfx.h 中 /AFX_INSERT_LOCATION 之前添加以下语句: /目的是导入 Acti
8、veSkin 的函数接口库。i nclude #import “actskn43.ocx“ no_implementation raw_interfaces_only raw_native_typesusing namespace ACTIVESKINLib;接着,在 Dlg.cpp 文件里添加语句: CComQIPtr m_pSkin=GetDlgItem(IDC_SKIN)-GetControlUnknown();/m_pSkin 是应用程序全局量。m_pSkin-LoadSkin(L“皮肤文件 X 的路径“);/如果 ActiveSkin 控件中已有皮肤,此句可省略。m_pSkin-Ap
9、plySkin(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() =
10、 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
11、.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
12、一例。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 类型的皮肤使用 ApplySk
13、inByName()使其生效,/其中第一个参数是窗口句柄,第二个参数是 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 文件) 才能正常使用。