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

生命的艰辛

生命的艰辛

2016-01-29 11:57

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

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


作者:武汉理工大学 自动化 林津

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)


下载源代码


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

如何使用:新建 SDK 工程后,将 SkinMagic 包中的 SkinMagicLib.h、SkinMagicLib.lib、DETOURS.lib 从示例工程./res 中,点击Project->Add To Project->Files,包含到工程中。在 Resource View 中点击 Import 菜单引入几个 Skin 二进制文件放在相同的"SKINMAGIC"文件夹下,分别给起一个名字(见源程序)。在 stdafx.h 中加入 #include "SkinMagicLib.h"在 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,不能使用。

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

下面是例子程序的截图:

展开更多 50%)
分享

猜你喜欢

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

C语言教程 C语言函数
SDK 程序使用SkinMagic工具包换皮肤

用SkinMagic工具包创建换皮肤程序

C语言教程 C语言函数
用SkinMagic工具包创建换皮肤程序

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

adb工具包使用介绍

电脑网络
adb工具包使用介绍

DriverStudio工具包介绍

编程语言 网络编程
DriverStudio工具包介绍

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

使用SkinMagic Toolkit美化界面

编程语言 网络编程
使用SkinMagic Toolkit美化界面

JDK开发工具包

编程语言 网络编程
JDK开发工具包

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

HTML组件(HTML COMPONENTS)之十一

HTML组件(HTML COMPONENTS)之十一

HTML 基本语法

HTML 基本语法
下拉加载更多内容 ↓