现在的位置: 首页 > 综合 > 正文

VC使用VCLSkin美化界面

2013年09月07日 ⁄ 综合 ⁄ 共 2855字 ⁄ 字号 评论关闭

     在网上曾经看过一篇文章,说是使用Delphi的皮肤控件VCLSkin制作成DLL,让VC调用美化窗体。感觉蛮有新意的,故自己实验一下。
实验准备:
1.Delphi 7和Visual C++
2.VCLSkin(参考之前的文章http://blog.csdn.net/akof1314/archive/2011/02/28/6214455.aspx

开始实验:
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,具体源代码如下:

library vcskin; 
 
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 = nilthen 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.在应用程序类头文件添加一个变量:

HMODULE m_hModule; 

然后在应用程序实现文件里的InitInstance()函数里添加对DLL的加载和释放:

BOOL CVcSkinTestApp::InitInstance() 

    //省略········· 
    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 InitSkin(CStringA szSkinName); //参数为皮肤文件名称 

在对话框实现文件,添加对函数的实现:

typedef int (CALLBACK *FUNC) (PCHAR); 
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()添加如下代码:

InitSkin("LE4-DEFAULT.skn"); 

运行如下图所示:

 

可以看到内存增长了一些,但也不是太高。下面我们来测试控件的皮肤化程度,拖动一些控件到窗体上,看效果如下图所示:

可以看到界面皮肤化程度不高,一些标准控件,如:按钮、编辑框、复选框、单选按钮、下拉框、文本标签、组合框、选项卡(里面控件不支持)才被皮肤化,其他的就支持的不好了。

 

此文章仅供学习交流之用。

抱歉!评论已关闭.