1 安装skinmagic
下载地址,http://download.csdn.net/detail/moonshine99/3916884,安装文件及例子还有破解的dll都有
2 安装后破解:去C:\Program Files\Appspeed\SkinMagic Toolkit 2.4 trial\Bin,将
SkinMagicTrial.dll覆盖
3 打开vs2008(我用的是vs2008测试的)
复制到工程目录下skinmagiclib.h,skinmagic.lib,skinmagic.dll
4 在stdafx.h中加入头文件和库的引用,如下:
#include "SkinMagicLib.h"
#pragma comment(lib, "SkinMagic.lib")
5 初始化SkinMagic库:
在 CxxxApp::InitInstance()中加入初始化SkinMagic库的代码:
VERIFY( 1 == InitSkinMagicLib(AfxGetInstanceHandle(), NULL, NULL, NULL));
6、调入皮肤文件:
皮肤的调用有两种方法,一是直接从皮肤文件中调用,另一种方法是从资源文件中调用,分别说明如下
:
1) 从皮肤文件中调用皮肤:
int __stdcall LoadSkinFile( LPCTSTR lpSkinFile );
2)从资源文件中调用皮肤:
int __stdcall LoadSkinFromResource(HMODULE hModule, LPCTSTR lpSkinName , LPCTSTR lpType);
现在CxxxApp::InitInstance()中的代码如下:
BOOL CxxxApp::InitInstance()
{
VERIFY( 1 == InitSkinMagicLib(AfxGetInstanceHandle(), NULL, NULL, NULL));
VERIFY( 1 == LoadSkinFile("corona.smf"));
//或者添加资源,然后载入资源 VERIFY( 1 == LoadSkinFromResource( AfxGetInstanceHandle(),
//"DEFAULT" ,"MagicSkin") ); //其中DEFAULT为皮肤的资源名,MagicSkin为皮肤资源的目录
AfxEnableControlContainer();
//…..下略
}
7 将皮肤应用到程序上
int __stdcall SetWindowSkin( HWND hWnd , LPCTSTR lpSkinName );
int __stdcall SetDialogSkin( LPCTSTR szSkinName );
1)对话框程序代码位置:
BOOL CxxxApp::InitInstance()
{
//...上略
m_pMainWnd = &dlg;
VERIFY( 1 == SetWindowSkin( m_pMainWnd->m_hWnd , "MainFrame" ));
VERIFY( 1 == SetDialogSkin( "Dialog" ) );
int nResponse = dlg.DoModal();
//…下略
}
2)文档视图程序代码的位置
BOOL CxxxApp::InitInstance()
{
//…上略
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
VERIFY( 1 == SetWindowSkin( m_pMainWnd->m_hWnd , "MainFrame" ));
VERIFY( 1 == SetDialogSkin( "Dialog" ) );
return TRUE;
}
8 释放SkinMagic资源
void __stdcall ExitSkinMagicLib();
重载应用程序的ExitInstance()函数,添加如下代码:
int CxxxApp::ExitInstance()
{
ExitSkinMagicLib();
return CWinApp::ExitInstance();
}
源文档 <http://hi.baidu.com/%B2%AE%B2%AE%D1%CC%B3%
BE/blog/item/24e6f60b90232adc63d986e2.html>
SkinMagic使用的基本方法及高级方法 (转载)
1. SkinMagic使用的方法
1.1 初始化皮肤控件 InitSkinMagicLib
例: nInitSkinMagicLib=InitSkinMagicLib( AfxGetInstanceHandle(),_T("LSA") ,NULL,NULL);加载皮
肤文件 LoadSkinFile(根据文件路径进行加载)或LoadSkinFromResource(根据资源名称进行加载)。
例:nLoadSkinFile=LoadSkinFile(sSkinFilePath);
1.2 使用SetDialogSkin或者SetSingleDialogSkin或者SetShapeWindowSkin给窗体加载皮肤
这三者是有区别的。
1.3.1 SetDialogSkin是给所有的窗体均加载同样的皮肤。不建议使用这个函数。除非你的软件均使用同
样的皮肤。
1.3.2 SetSingleDialogSkin给单个指定的窗体加载皮肤。窗口的显示方式是规则窗体。
1.3.3 SetShapeWindowSkin 给单个指定的窗体加载皮肤。窗口的显示方式为非规则窗体。
2.SkinMagic使用的高级方法
2.1 RemoveWindowSkin去掉指定窗体上的皮肤
当某个窗体或者控件不需要皮肤时可以使用此函数
2.2 RemoveDialogSkin 停止自动给窗体加载皮肤。主要是针对SetDialogSkin的。
2.3 EnableWindowScrollbarSkin 给指定窗体加载滚动条皮肤。比较适用于自绘的控件。
例:nSkin=EnableWindowScrollbarSkin(GetDlgItem(IDC_DLGTREE_EXPORT)->m_hWnd,SB_BOTH);
2.4 DisableWindowScrollbarSkin 使指定窗体停止加载滚动条皮肤。
2.5 如何给Splitter加载皮肤
2.5.1 皮肤文件中自定义Splitter
2.5.2 打开Splitter
例:m_hSkin = OpenSkinData( _T("SkinSplitter") );
2.5.3重载函数OnDrawSplitter
详见系统管理源代码中类AW_CMultiViewSplitter
2.6 如何从皮肤文件中获取图片 CreateBitmapFromSkinImage
例:m_hBitMap=CreateBitmapFromSkinImage(_T("listheader.bmp"));
2.7 当一个窗体上同样的控件类型同时既有自绘也有加载皮肤的处理方法
在皮肤文件新建一个窗体,名称比如叫做FrmWnd-D,上面放置皮肤控件,例如是个Static控件,叫做Static
-D。使用的例子如下: nSkin=SetControlSkin(GetDlgItem(IDC_STATIC_MAIN_TITLE)->m_hWnd,_T
("Static-D"),_T("FrmWnd-D"));
nSkin=SetControlSkin(GetDlgItem(IDC_STATIC_SUB_TITLE)->m_hWnd,_T("Static-D"),_T
("FrmWnd-D"));
2.8 当自绘控件与加载皮肤的窗体冲突时的解决方法
解决方法是先对窗体加载皮肤,再建立控件自绘的功能。
具体的做法是:
1. DoDataExchange取消自绘控件实例与资源控件ID的关联
2. 在SetSingleDialogSkin之后自绘控件实例采用SubclassDlgItem的方法与资源控件ID关联。
例:VERIFY( 1 == SetSingleDialogSkin(this->GetSafeHwnd(), _T("Dialog") ) );
m_list.SubclassDlgItem(IDC_LIST1,this);
源文档 <http://www.sciencenet.cn/m/user_content.aspx?id=287235>