SkinTK编译使用

Posted oloroso

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SkinTK编译使用相关的知识,希望对你有一定的参考价值。

简介

MFC这个东西已经落伍了,不建议使用。我就是吃饱了撑着,还在折腾这个。
平时写点带界面的小程序一般都用Qt来做,简单好用,也很容易做的比较漂亮。我觉得唯一一个算不得多大缺点的缺点就是Qt体积太大了。
之前用MFC写过几个小程序,那天看见一个介绍MFC美化的文章,就想着也给来加个皮肤。只是MFC没有像Qt的qss这么方便的东西。
网上看到一个开源的库SkinTK,就下载回来试试。
这个库不知道与CJ60Lib有什么关系,在这里下载的源码里面有一部分是来自cj60的。附上CJ60LIB的一篇编译说明http://www.cnblogs.com/icmzn/p/6724969.html

修改后的代码上传到了gitee,下载地址https://gitee.com/solym/SkinTK_VS2017

编译

编译过程倒是不难,就是有些地方需要改动一下,比较烦。
这个库依赖于Detours,来Hook与Windows窗口操作相关的一些系统函数。
Detours这个库已经微软已经开源了,下载地址https://github.com/Microsoft/Detours.git
因为它原本使用的是老版本的,不支持64位系统,所以我给替换成了最新的。

编译的时候要修改一些地方。

  • 1、针对64位的修改
    很多用到了SetWindowLongGetWindowLong以及GetClassLong的地方需要修改为SetWindowLongPtrGetWindowLongPtrGetClassLongPtr

  • 2、CMemDC的修改
    因为VC2010版本已经包含了CMemDC的实现,而这个库自己实现了一个,在使用的时候会有冲突,所以进行以下修改
// 文件 includeMenDC.h
// 类 CMemDC声明前加上
#if _MSC_VER >= 1600
#define CMemDC SkinCMemDC
#endif
否则可能出现 uafxcwd.lib(afxglobals.obj) error LNK2005: "public: virtual __thiscall CMemDC::~CMemDC(void)" ([email protected]@[email protected]) already defined in
  • 3、修改SKINTKDLL宏定义
    因为我要编译静态库版本,所以这里SKINTKDLL宏的定义修改为空

  • 4、问题
    这里还有很多问题,我没有去解决。64位编译的结果回出现崩溃的状况,具体来说是在SetWindowLongPtr函数调用的时候出现0x5c00000000异常的问题。
    32位也有问题,不加载皮肤没有问题,加载皮肤运行一会就崩溃。

使用

具体的使用方法见使用SkinTK进行换肤
下面是使用前后的一个对比图

技术分享图片
技术分享图片















以上是关于SkinTK编译使用的主要内容,如果未能解决你的问题,请参考以下文章

Notepad++编辑器——Verilog代码片段直接编译

损坏的顶点和片段着色器

导致资产预编译在heroku部署上失败的代码片段

如何有条件地将 C 代码片段编译到我的 Perl 模块?

Android 逆向Android 逆向通用工具开发 ( Android 平台运行的 cmd 程序类型 | Android 平台运行的 cmd 程序编译选项 | 编译 cmd 可执行程序 )(代码片段

iOS代码片段CodeSnippets