WEB开发网
开发学院软件开发VC 为你的程序换个皮肤 阅读

为你的程序换个皮肤

 2010-07-06 20:42:50 来源:WEB开发网   
核心提示:目前这方面的小软件很多,我一直就想做这么一个东东,为你的程序换个皮肤,但是一直苦于时间有限,一直都没有做,这个函数就是对所要换肤的类对象进行了监视,并改变其消息处理函数,最近一段时间,我发现这些方面的东西越来越多

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

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

以前我们一直利用重载一个类的办法来实现丰富多彩的个性化控件,如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 );
}

1 2  下一页

Tags:程序 皮肤

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接