SDK 程序使用SkinMagic工具包换皮肤

在看《Windows 程序设计》的时候,就在用 SkinMagic 换肤,但 SkinMagic 中的 SDK 程序例子只能用文件方式加载皮肤,很不方便,而且还有一些Bug。后来看了下面这篇文章才茅塞顿开,终于会用 SkinMagic 把皮肤加入静态资源为 SDK 程序换肤。在 VCKBASE 网站的在线杂志中我看到一篇题为“用SkinMagic工具包创建换皮肤程序”的文章。我和上面文章的作者联系过,告诉了他我的想法并找出他程序中一个微不足道的 Bug!上面文章用MFC换肤,我现在写的可以说是他的 SDK 版。主要通过简单处理解决了标题出现 [Powered by SkinMagic] 的问题,换用 SkinMagic SDK 1.0 Library,支持更多皮肤。 

如何使用:

  1. 新建 SDK 工程后,将 SkinMagic 包中的 SkinMagicLib.h、SkinMagicLib.lib、DETOURS.lib 从示例工程./res 中,点击Project->Add To Project->Files,包含到工程中。
  2. 在 Resource View 中点击 Import 菜单引入几个 Skin 二进制文件放在相同的"SKINMAGIC"文件夹下,分别给起一个名字(见源程序)。
  3. 在 stdafx.h 中加入 #include "SkinMagicLib.h"
  4. 在 WinMain 开头添加如下内容:
       
       
    int  APIENTRY WinMain(HINSTANCE hInstance,                      HINSTANCE hPrevInstance,                      LPSTR     lpCmdLine,                       int        nCmdShow) {      //加载SkinMagicLib.lib、DETOURS.lib 库     InitSkinMagicLib( hInstance,                "LINJIN"              NULL,NULL );      //LoadSkinFile("corona.smf");     //加载静态自定义皮肤资源     LoadSkinFromResource( GetModuleHandle(NULL),                            "XPBLUE" ,                           "SKINMAGIC");     //为程序中对话框换肤                               SetDialogSkin( "Dialog" ) ;          ......     //在 WinMain  结束时释放 SkinMagic 资源。      ExitSkinMagicLib(); } 还有在InitInstance 中:  BOOL InitInstance(HINSTANCE hInstance,  int  nCmdShow) {    ......    //如果程序用到菜单    //要在 SetWindowSkin 之前用,否则 hMenu 为 NULL    hMenu = GetMenu (hWnd) ;         // 把皮肤加入程序框架    SetWindowSkin( hWnd , "MainFrame" );    ShowWindow(hWnd, nCmdShow);    UpdateWindow(hWnd);    return TRUE; } 还有在WndProc中,使定义的菜单资源和皮肤资源对应起来:  LRESULT CALLBACK WndProc(HWND hWnd,                           UINT message,                           WPARAM wParam,                           LPARAM lParam) {     int wmId, wmEvent;     PAINTSTRUCT ps;     HDC hdc;     TCHAR szHello[MAX_LOADSTRING];     LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);              //使用菜单变换皮肤,         //通过数组的持续把菜单和皮肤资源对应,     static char* idColor [7= "XPBLUE",  "CORONA""KROMO",                                 "XPGREAN""XPLUS","XPSTEEL","DEVIOR" } ;      ......          switch (wmId)     {     case IDM_XP:         // Note: Logic below            case IDM_CORONA:        //   assumes that IDM_WHITE            case IDM_KROMO:          //   through IDM_BLACK are            case IDM_XPGREAN:        //   consecutive numbers in            case IDM_XPLUS :         //   the order shown here.     case IDM_XPSTEEL:     case IDM_DEVIOR:                 //菜单选择         CheckMenuItem (hMenu, iSelection, MF_UNCHECKED) ;         iSelection = wmId ;         CheckMenuItem (hMenu, iSelection, MF_CHECKED) ;         LoadSkinFromResource( GetModuleHandle(NULL),                 idColor[LOWORD (wParam) - IDM_XP] ,                "SKINMAGIC" );         InvalidateRect (hWnd, NULL, TRUE) ;         return 0 ;     case IDM_ABOUT:        DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);        break;     case IDM_EXIT:        DestroyWindow(hWnd);        break;     default:        return DefWindowProc(hWnd, message, wParam, lParam);     } }

还有些细节都在代码中,示例工程无需做任何修改可以直接编译…。
示例工程里的 ./res 中有 SkinMagic SDK 1.0 Library 的 SkinMagicLib.lib (经处理不会显示[Powered by SkinMagic])、DETOURS.lib 和众多皮肤,可以拿到使用。

最后,SkinMagic 有一个 Bug,一直都没有解决——就是子菜单返回为 0,不能使用。

希望作者和大家有好的办法......

下面是例子程序的截图:





 http://konny520.myrice.com
有个六色皮肤DLL(46.5kb)
VC,VB,WIN32,
调用都很方便!
///////////////
http://konny520.myrice.com
有个六色皮肤DLL(46.5kb)
VC,VB,WIN32,
调用都很方便!
/////////////// ( konny 发表于 2006-9-18 1:24:00)
 
 忘记说个问题了.....
可能很多人问为什么照我说的不行,可是我的代码可以..

掉了两个设置:
C/C++ -> Use run-time library: Debug Multithreaded

加入:
Link -> Object/library modules:  comctl32.lib  




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值