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

使用SkinMagic美化MFC的窗口

2014年03月14日 ⁄ 综合 ⁄ 共 3355字 ⁄ 字号 评论关闭

使用SkinMagic美化MFC的窗口跟美化对话框很相似,但是由于我是新手,对于这些操作不是太熟,所以还是有必要记录一下这段历程,万事开头难嘛!!对于这篇文章和使用《SkinMagic美化MFC对话框》中即使相同的步骤,我还是在这里详细的记录下来,意图熟能生巧。

SkinMagic的开发包可以在http://download.csdn.net/source/3292405上面下载

一、  新建一个MFC单文档应用程序Skin_Windows

二、  SkinMagicLib.hSkinMagicTrial.dllSkinMagicTrial.lib,和皮肤文件"corona.smf"添加到当前目录;

三、  Skin_Windows.cpp中添加:

          #include "SkinMagicLib.h"

          #pragma comment(lib, "SkinMagicTrial.lib")

四、  初始化SkinMagic库: 

           要使用SkinMagic,这一步必不可少。

          在应用程序类的InitInstance()函数中行加入如下代码(粗体部分): 

         CWinApp::InitInstance(); 

         VERIFY( 1 == InitSkinMagicLib(AfxGetInstanceHandle(), NULL , NULL, NULL)); 

          说明: intInitSkinMagicLib( //初始化SkinMagic工具库

                   HINSTANCE hInstance, //应用程序句柄 

                   char* szApplication , //皮肤文件中定义的应用程序名,置为NULL即可 

                   char* szRegCode, //SkinMagic的使用注册码。若无置为NULL 

                   char* szReserved2 //保留位,为NULL );

          即添加代码后的表面形式是:

         BOOLCSkin_WindowsApp::InitInstance()

        {

                       VERIFY( 1 ==InitSkinMagicLib(AfxGetInstanceHandle(), NULL , NULL, NULL ));

                      。。。。其他的一连串代码

       }

五、   调入皮肤文件: 

          皮肤的调用有两种方法,一是直接从皮肤文件中调用,另一种方法是从资源文件中调用,

          分别说明如下: 

          1)从皮肤文件中调用皮肤:

          紧接上句,加入如下代码VERIFY(1 == LoadSkinFile("corona.smf")); 

          2)从资源文件中调用皮肤: 

                   VERIFY(1 ==LoadSkinFromResource(NULL,(LPCTSTR)IDR_SKINMAGIC1,"SKINMAGIC"))); 

                   int LoadSkinFromResource( HMODULEhModule, //包含皮肤文件的模块句柄,若NULL表明在本模块中 

                            char* lpSkinName , //皮肤资源的名称

                            char* lpType); //资源的类型

         在这里采用第二种方法,添加后的表面形式是:

         BOOLCSkin_WindowsApp::InitInstance()

        {

                 VERIFY( 1 ==InitSkinMagicLib(AfxGetInstanceHandle(), NULL , NULL, NULL ));  //这是在上一步骤中添加的代码

                VERIFY(1 ==LoadSkinFromResource(NULL,(LPCTSTR)IDR_SKINMAGIC1, "SKINMAGIC"));//本步骤需要添加的代码

         。。。一连串其他的代码

         }


注意,在从资源加载皮肤函数LoadSkinFromResource()的第二个和第三个参数是皮肤资源的名称和资源的类型,而皮肤资源直到第八步骤才加载到当前工程中,并且加载时,指定的资源类型是SKINMAGIC,里面的资源默认名是SKINMAGIC1。

六、  为窗口添加皮肤: 

          为标准窗口(拥有标题栏、系统菜单、可变大小等特征,比如文档/视图结构和有菜单的对话框)添加皮肤,通常用于主窗口。

          在应用程序类的InitInstance()函数的底部加入如下代码: 

         VERIFY( 1 == SetWindowSkin( m_pMainWnd->m_hWnd , "MainFrame")); 

         m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); 

          说明:intSetWindowSkin( HWND hWnd, //要使用皮肤的窗口句柄 

                   char* lpSkinName //skinFrameWnd对象指定的名称);

添加这段代码后的程序表面形式是:

         BOOLCSkin_WindowsApp::InitInstance()

        {

              VERIFY( 1 == InitSkinMagicLib(AfxGetInstanceHandle(), NULL , NULL, NULL));  //这是在上一步骤中添加的代码

              VERIFY(1 == LoadSkinFromResource(NULL,(LPCTSTR)IDR_SKINMAGIC1,"SKINMAGIC"));//这是在上一步骤中添加的代码

             。。。一连串其他的代码

            VERIFY( 1 == SetWindowSkin( m_pMainWnd->m_hWnd , "MainFrame"));  //本步骤需要添加的代码

            m_pMainWnd->ShowWindow(SW_SHOW); 

            m_pMainWnd->UpdateWindow();

            return TRUE;

         }

七、 CSkin_WindowsApp类中重载虚函数ExitInstance()添加:

// TODO: Add your specialized code hereand/or call the base class

//===SkinMagic===

// 释放SkinMagic库申请的内存

ExitSkinMagicLib();

//===SkinMagic=

即:BOOLCSkin_WindowsApp::ExitInstance()

{

 

     ExitSkinMagicLib();

 

      returnCWinApp::ExitInstance();

}

注意添加上面的代码在除此编译的时候,会提示出现错误,因为ExitInstance()还没有在CSkin_Windows中定义,去定义就行了。。。

八、 修改资源文件

九、 添加库文件

 

の、、、、最后这两部还是参照《SkinMagic美化MFC对话框》吧,步骤一模一样,时间不早了。

、、、不过,现在倒是觉得第八步应该放在前面一点,至少应该在第五步调入皮肤文件之前。因为调入皮肤文件的函数

                   int LoadSkinFromResource( HMODULE hModule, //包含皮肤文件的模块句柄,若NULL表明在本模块中 

                            char* lpSkinName , //皮肤资源的名称

                            char* lpType); //资源的类型

中的皮肤资源名称是在第八步之后才生成的!!IDR_SKINMAGIC1是在 第八步骤里才出来的!!!

下面是美化后。窗口的效果:


抱歉!评论已关闭.