SkinSharp作者写的

SkinSharp是小生一个人独立开发的换肤产品。开发这个产品的原因和绝大多数朋友一样,买不起skin++。由于对ui非常热爱,曾经毕业时还想去skin++去工作,难耐他们老板看不上咱。后来一切证实没去是非常正确的。

因为对这方面非常感兴趣,索性就自力更生吧。 关于软件换肤原理其实非常简单,就是hook + subclass, 替换窗口过程,自己重写界面绘制,基本上就是响应WM_PAINT, WM_NCPAINT消息。但难点就在绘制的处理上,Windows标准控件那么多,每个控件的表现形式可不一样。所以基本上所有的工作都集中在控件的消息响应上了。其实,标准控件是很好做的,捧一本msdn基本都可以搞定。难点都集中在滚动条,菜单换肤上。市面上换肤产品多如牛毛,但真正滚动条和菜单换肤上做的很好的真的没几个,在滚动条和菜单上我也是花费了2年的时间研究。这个库从2006年初开始动工,到现在已经3年半多了。一般标准控件的绘制我就不说了,基本查查msdn就可以了。下面我着重说下控件内部滚动条和菜单的换肤原理。

控件的内部滚动条并不是单独的控件,他是Windows窗体(或控件)的组成元素,滚动条换肤的难点就是如何禁止系统绘制,因为滚动条位于非客户区,当滚动条状态改变时系统会进行绘制,所以你无论怎么截获消息,都无法让系统不进行绘制。有些朋友可能用滚动条控件来代替控件内部的滚动条,但这是山寨的做法,弊端也是显而易见的。想让系统不进行绘制,那你必须全权接管滚动条信息的管理和绘制,Windows提供了有关滚动条的API,比如
GetScrollInfo, 
SetScrollInfo等等,实际上Windows在内部维护的对用户开放的数据结构仅仅是SCROLLINFO这个结构体而已。那么,我们可不可以自己维护这个ScrollInfo,让用户或系统调用的滚动条相关操作都被我们所控制,我们来响应。答案是肯定的。这又回到之前我们说的原理Hook, 这次需要Hook的是API,
将滚动条的操作转入我们的处理过程,处理后返回给系统。这样就达到了我们的目的。至于API HOOK 方法很多,大家在网上一搜就可以找到一堆。

关于菜单的换肤,有些朋友可能已经知道菜单其实就是一个窗口类名为”#32768”, 所以你可以通过窗口类名来进行Hook了。主要的问题是你怎么才能获取到菜单的句柄呢?对于菜单消息,msdn上只有一个就是MN_GETHMENU, 不错,就是他。给菜单窗口发送这个消息就可以获取菜单句柄。这下好办了,有了菜单句柄,你可以随便操作了, 就这么简单。

还有一个比较难处理的就是窗口标题栏了,因为标题栏在元素改变时,系统也是会进行自绘的。很多换肤库(包括Skin++)的做法就是避开标题栏,把标题栏风格WS_CAPTION去掉,自己再留出一块非客户区再画标题栏,这种方法看似完美,其实弊端很多,对于窗体来说WS_CAPTION是一个很重要的风格。去掉WS_CAPTION系统菜单的很多项目就失效了。另外还有其他方便的弊端,比如在Vista系统下就可能出现系统绘制边框等等。所以作为换肤库,应该尽量避免修改程序的默认属性和风格。换肤库好比人的衣服,不能说衣服不合适,就要把骨头拆了。如何解决这个问题呢?其实有很多方法,比如设置剪裁区,锁定绘制等等。

原文链接:http://hi.baidu.com/liaomingsen/item/a07a3537951751179cc65e1a

SkinSharp作者简述相关推荐

  1. [2019BUAA软件工程]第1次阅读作业

    [2019BUAA软件工程]第1次阅读作业 Tips Link 作业连接 [2019BUAA软件工程]第1次阅读作业 读<构建之法>的疑惑 个人开发流程(Personal Software ...

  2. 医学图像分析最新综述:走向深度

    点击我爱计算机视觉标星,更快获取CVML新技术 今天arXiv新上一篇论文<Going Deep in Medical Image Analysis: Concepts, Methods, Ch ...

  3. Python真香之爬取古诗文网

    最近在学习Python相关,学习了基本的语法后想搞点事情试试,所以来爬取下古诗文网中的相关作者信息 准备资料: 爬取目标:爬取古诗文网的唐代作者的信息 目标分析: 一级页面是所有唐代作者的列表,点击名 ...

  4. 朝花夕拾《精通CSS》一、HTML CSS 的基础

    一.背景 翻出我4年前看的<精通CSS>一书,可惜当初没有整理读书笔记的习惯,最近又很少写前端,遂很多东西.知识点遗忘了,恰且现在 css 也有些变化和进步,遂一起打包整理,输出成几篇 b ...

  5. 说说计算机发展史在你印象里都有哪些内容,第三课 时间的脚印(精选5篇)

    第三课 时间的脚印 2012年3月29日星期四 第三课时 深化学习课文 授课人:热孜完古丽 教学目标: 1 知识点:掌握说明顺序中逻辑顺序. 2 能力点:明确说明对象,理清文章思路:体会本文 生动有趣 ...

  6. Stetman读paper小记:ATTEQ-NN

    注:本周笔者阅读了龚雪鸾.陈艳娇的文章ATTEQ-NN:Attention-based QoE-aware Evasive Backdoor Attacks.本文讲了作者设计的一种基于注意力机制的后门 ...

  7. 读书:冯唐的《金线》

    <金线>是冯唐在2022年11月刚刚出版的新书,正如书名,全书提出了金线原理,声称它可以解决一切问题,超越了麦肯锡的金字塔原理. 成事学四大公理: 成事学第一公理:人类在任何时候都要追求资 ...

  8. 真正的计算语言学?!

    真正的计算语言学?! 2003-3-26 -- 读 R. Hausser<计算语言学基础> 刘海涛 Roland Hausser Foundations of Computational ...

  9. 论文笔记: 对抗样本 CVPR2021 Enhance Transferability of Adversarial Attacks through Variance Tuning

    目录 Abstract 摘要 1. Introduction 引言 1.1 背景 1.2 引入 2. 相关工作 Related Work 2.1 对抗样本攻击 2.2 对抗样本防御 Adversari ...

  10. 读后感---图像分割的新理论和新方法

    读后感之<图像分割的新理论和新方法> 我阅读的论文题目是<图像分割的新理论和新方法>,这篇论文发表在2010年2月,第2A期的<电子学报>上.选择该论文阅读的主要目 ...

最新文章

  1. [每周软件]:Cucumber:未完待续的原因
  2. MySQL返回多行错误怎么处理_结果包含多个行错误mysql
  3. Redis运维和开发学习笔记(6) 监控Redis工作状态-info命令
  4. FTP 协议和 HTTP 协议的比较
  5. Centos7 安装Docker(v2021 version 20.10.5) 并通过docker-compose运行TiDB集群
  6. Python文件读取(1.1)
  7. 搜索引擎如何评估外贸网站内容?
  8. KVM虚拟化基础概念
  9. STM32 rtc唤醒 低功耗待机模式 避免iwdog看门狗方案
  10. 74HC573芯片介绍
  11. linux限制进程带宽,再Linux系统中限制网络带宽使用的教程
  12. Catch the moments of your life. Catch them while you're young and quick.
  13. 柯西过程(Cauchy process)
  14. Azure NSG(安全组)
  15. 【日志】Debug和简单对拍代码
  16. Python 变量作用域与函数(4)
  17. Swing关于JButton的文本和图片之间间距调整的问题纪要!
  18. 经纬度、平面坐标系转换方法
  19. 分库与分表带来的分布式困境与应对之策
  20. 海上钢琴家 与程序员

热门文章

  1. android 通讯录恢复,通讯录恢复
  2. cad计算机功能键,【答疑】Auto CAD2014计算器快捷键是什么呢?? - 视频教程线上学...
  3. 揭秘:为何冬天成都游戏玩家整体水平会下滑?
  4. vb html单选按钮,VB教程:单选按钮(OptionButton)
  5. win32,使用PDFlib生成PDF文件
  6. swf文件的反编译或着flash文件的反编译
  7. 单片机的C语言应用程序设计实训教程,单片机的c语言程序设计实训
  8. Python动作冒险类游戏推荐:一款奔跑的玛丽冒险岛游戏、你能坚持几天丫?
  9. Lidar Studio点云处理与分析软件V1.1
  10. java环境安装菜鸟教程_Linux菜鸟教程(一:JDK安装和java环境配置)