返回> 网站首页
[转载]VC使用VCLSkin美化界面
yoours2011-03-18 16:24:57
简介一边听听音乐,一边写写文章。
实验准备:
1.Delphi 7和Visual C++
2.VCLSkin
开始实验:
1.新建一个DLL工程。打开Delphi 7→菜单栏→File→New→Other→DLL Wizard,自动生成一些代码,然后点击保存所有,新建一个文件夹改名为“vcskin”,保存在此文件夹下,工程名改为vcskin.dpr。
2.复制VCLSkin一些文件。从VCLSKIN\source文件夹下复制以下文件到vcskin工程目录下,记住不用复制WinSkinReg.pas,如下图所示:
3.把PAS文件添加到vcskin工程里。菜单栏→Project→Add to Project,然后全选全部的pas文件添加进来。然后在单元头uses Windows,具体源代码如下:
uses
SysUtils,
Classes,
Windows,
ImgUtil in 'ImgUtil.pas',
SkinRead in 'SkinRead.pas',
WinCheckLst in 'WinCheckLst.pas',
WinConvert in 'WinConvert.pas',
WinSkinCollection in 'WinSkinCollection.pas',
WinSkinData in 'WinSkinData.pas',
WinSkinDlg in 'WinSkinDlg.pas',
WinSkinForm in 'WinSkinForm.pas',
WinSkinIni in 'WinSkinIni.pas',
WinSkinMenu in 'WinSkinMenu.pas',
WinSkinStore in 'WinSkinStore.pas',
WinSubClass in 'WinSubClass.pas';
{$R *.res}
function LoadSkin(szName: PChar): Integer; stdcall;
begin
if (GSkinData = nil) then GSkinData := TSkinData.Create(nil);
GSkinData.SkinFile := szName;
GSkinData.Active := TRUE;
Result := 1;
end;
procedure DllHandler(Reason: Integer);
begin
case Reason of
DLL_PROCESS_DETACH:
begin
GSkinData.Free();
end;
end;
end;
exports
LoadSkin;
begin
DLLProc := @DllHandler;
DllHandler(DLL_PROCESS_ATTACH);
end.
编译运行后,在工程文件夹下就可以看到vcskin.dll文件生成。
4.打开Visual Studio 2008,新建MFC对话框工程VcSkinTest,点击编译运行,可以看到没有加载任何东西的对话框程序占有内存大概1276K(根本电脑不同而不同),如下图所示:
5.在应用程序类头文件添加一个变量:
然后在应用程序实现文件里的InitInstance()函数里添加对DLL的加载和释放:
{
//省略·········
m_hModule = LoadLibraryA("vcskin.dll"); //加载DLL
CVcSkinTestDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
}
else if (nResponse == IDCANCEL)
{
}
FreeLibrary ( m_hModule ); //释放DLL
return FALSE;
}
在对话框头文件,添加一个初始化加载皮肤函数声明:
在对话框实现文件,添加对函数的实现:
void CVcSkinTestDlg::InitSkin (CStringA szSkinName)
{
CStringA strPath;
CHAR szPath [MAX_PATH + 1];
if (GetModuleFileNameA(NULL, szPath, MAX_PATH ))
{
strPath = szPath;
int nPos = strPath.ReverseFind('\\');
if(nPos >= 0) strPath = strPath.Left(nPos + 1);
}
CHAR szName [MAX_PATH];
CStringA strName = strPath + szSkinName;
FUNC pFunc = (FUNC) GetProcAddress(theApp.m_hModule, "LoadSkin");
strcpy (szName, strName);
pFunc (szName);
}
6.在VcSkinTest工程Debug文件夹下放入vcskin.dll和一个皮肤文件LE4-DEFAULT.skn,然后在对话框初始化函数OnInitDialog()添加如下代码:
运行如下图所示:
可以看到内存增长了一些,但也不是太高。下面我们来测试控件的皮肤化程度,拖动一些控件到窗体上,看效果如下图所示:
可以看到界面皮肤化程度不高,一些标准控件,如:按钮、编辑框、复选框、单选按钮、下拉框、文本标签、组合框、选项卡(里面控件不支持)才被皮肤化,其他的就支持的不好了。