为你的程序换个皮肤

目前这方面的小软件很多,我一直就想做这么一个东东,但是一直苦于时间有限,一直都没有做。最近一段时间,我发现这些方面的东西越来越多,而且都没有源代码,一些家伙在网站上给出这样那样的示例,其实都是在为自己的产品做广告,实在有违开源的思想。

最近终于有了一段假期,反正没什么事做就来试试,经过一段时间的学习和摸索,终于实现了一段简单的程序。现在我就给出一个简单的例子和解释,让大家明白这是一个怎么回事,教你如何利用这个技术给一个按钮换肤?

以前我们一直利用重载一个类的办法来实现丰富多彩的个性化控件,如GuiToolkit、CJ60LIB,都是这样的工具,使用起来还是要在程序中插入大量的语句,这样做一方面增加了程序的复杂性,另一方面也增加了程序高度的难度。当然现在也有像SkinMagic、EasySkin这样的工具,只需要在你的程序里增加两行代码就可以实现对常用控件的换肤,但是这些工具都没有源代码,对于想学习开发的人来说实在没什么帮助。为了让大家都了解这项技术,我决定开发一个这样的程序,并公布源程序,希望有兴趣的朋友都来看看,动手做做,同时欢迎大家公开你的源程序,和大家一起分享你的成功和快乐。

首先,来给一个程序换肤,我们必须得到程序的句柄,然后给程序挂钩。下面的一段代码就实现了挂钩功能。

BOOL IRStartup( HINSTANCE hModule, DWORD dwThreadID )
{
  globalWndHookEx = SetWindowsHookEx(
    WH_CALLWNDPROC, (HOOKPROC) IRCallWndProc, hModule, dwThreadID );
  return TRUE;
}

这也是像SkinMagic一类工具的初始化函数。当然在退出时也要释放钩子的。

BOOL IRComplete( void )
{
  UnhookWindowsHookEx( globalWndHookEx );
  return TRUE;
}

接下来,就是IRCallWndProc这个回调函数的编写,这是至关重要的一个环节,这个函数就是对所要换肤的类对象进行了监视,并改变其消息处理函数,实现换肤的目的。

LRESULT CALLBACK IRCallWndProc( int nCode, WPARAM wParam, LPARAM lParam )
{
  PCWPSTRUCT  pcs = (PCWPSTRUCT) lParam;
  HWND    hWnd = pcs->hwnd;
  if( hWnd ) {
    char    sClassName[201] = "\0";
    GetClassName( hWnd, sClassName, 200 );
    if( strcmp( sClassName, "Button" ) == 0 ) {
      CWnd  *pWnd = CWnd::FromHandle( hWnd );
      DWORD  dwStyle = pWnd->GetStyle();
      if( dwStyle == 0x50010000 ) {
        WNDPROC  WndProc;
        WndProc = (WNDPROC) GetWindowLong( hWnd, GWL_WNDPROC );
        if( CButtonExt::m_cWndProc != NULL && \
          WndProc != CButtonExt::m_cWndProc )
        {
          return CallNextHookEx( globalWndHookEx,
                      nCode,
                      wParam,
                      lParam );
        }
        if( WndProc != (WNDPROC) CButtonExt::DefWindowProc ) {
          WndProc = (WNDPROC) SetWindowLong(
               hWnd,
               GWL_WNDPROC,
               (LONG) CButtonExt::DefWindowProc );
          CButtonExt::m_cWndProc = WndProc;
        }
      }
    }
  }
  return CallNextHookEx( globalWndHookEx, nCode, wParam, lParam );
}

时间: 2024-10-31 13:23:00

为你的程序换个皮肤的相关文章

如何为您的VC安装程序换肤

前言: 每一款商业软件都离不开安装程序,安装程序制作的是否精美直接影响客户对您软件的第一感觉.打个比方,安装程序就像一件传统商品的外包装,该包装的好坏,可以看出该产品是否做工精细,是否质量过硬.目前主流的安装程序制作工具有两种:InstallSheild和Wise Solution.在本文中,我们以Wise Solution的Wise for Windows Installer Professional 6.10.0.450为例,向您介绍如何为您的安装程序换肤. 安装工程的创建 1.创建一个Wi

c#小程序换机子不能直接运行.EXE。需重新编译,求解答?

问题描述 c#小程序换机子不能直接运行.EXE.需重新编译,求解答? using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Management; namespace getid{ public partial

给VC程序换皮肤

第一种方法: 下载SkinMagic软件  1. 首先把SkinMagicLib.h, SkinMagicLib.h, 以及.smf文件(方便加载皮肤)放到你的的VC6工程目录下: 2.在左边的Fileview卡片里面,在Resource files栏目加入SkinMagicLib.lib,在FileView卡片里面加入SkinMagicLib.h文件,并在stdafx.h中加入#include "SkinMagicLib.h" : 3.  在C**App类的文件里面找到InitIns

ACCESS程序换成SQL程序出点问题

问题描述 publicstaticobjectExcSqlScalar(stringsqlstr,paramsobject[]param){//System.Data.OleDb.OleDbCommandtmp=ThisConnect.CreateCommand();System.Data.SqlClient.SqlCommandtmp=ThisConnect.CreateCommand();tmp.CommandText=sqlstr;for(inti=0;i<param.Length;i++

搜狗输入法皮肤模式换输入法皮肤的教程

换输入法的皮肤是一件很容易的事情了因为只要在输入法属性中我们就可以进行操作了,具体的操作细节如下所示. 1.我们在电脑桌面任务栏中我们右击输入法===设置属性选项,效果如下所示 2.然后我们在弹出的菜单中点击属性设置===外观===显示===大家可以根据自己的喜好来设置==应用==确定 效果如下所示 3.在下面的预览框框中我们都可以看到效果 好了以上就是小编为各位同学整理的一篇关于搜狗输入法皮肤模式更换操作方法了,希望这篇文章可以对大家有帮助的哦,换皮肤吧简单有些皮肤需要在网上下载才可以的哦.

ckeditor换kama皮肤

config.js配置文件中添加一行 config.skin='kama'; 复制下载的kama皮肤文件到ckeditor的skins目录下 大功告成效果图如下 kama皮肤下载请见附件 本文出自 "点滴积累" 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1685170

C#程序用了皮肤但是以前那些按钮的的颜色都了,能不能让他显示颜色出来

问题描述 我用的皮肤是从东日搞得..按钮全部没颜色了都是一种颜色怎么回事啊..谢谢啊.. 解决方案 解决方案二:路过帮顶=============11月6日,论坛升级公告,积分已经做了调整!此次调整增加了两个新的可用分获取渠道:1:帖子被推荐(加精)后,帖主可以获得88分的可用分奖励:2:帖子结帖后会返还帖主50%的悬赏分,无满意结帖不返还分数:3:接下来会不断增加新的可用分获取途径,比如参与活动赠送等,请大家多关注:

SkinLoad程序界面换肤工具

源代码中包括两个压缩包: SkinLoad.zip为本文示例工程 skinloadv0.3.rar为版本更新SkinLoad v0.3 说明:SkinLoad是一个给程序换肤的工具,通过几个简单的函数调用就可以给你的应用程序加上漂亮的皮肤,包括所有的系统对话框.通过SkinLoadMaker皮肤编辑工具,可以自己定制皮肤. 界面效果图如下:

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

在看<Windows 程序设计>的时候,就在用 SkinMagic 换肤,但 SkinMagic 中的 SDK 程序例子只能用文件方式加载皮肤,很不方便,而且还有一些Bug.后来看了下面这篇文章才茅塞顿开,终于会用 SkinMagic 把皮肤加入静态资源为 SDK 程序换肤.在 VCKBASE 网站的在线杂志中我看到一篇题为"用SkinMagic工具包创建换皮肤程序"的文章.我和上面文章的作者联系过,告诉了他我的想法并找出他程序中一个微不足道的 Bug!上面文章用MFC换肤