为你的程序换个皮肤

2016-01-29 11:54 48 1 收藏

为你的程序换个皮肤,为你的程序换个皮肤

【 tulaoshi.com - C语言心得技巧 】

为你的程序换个皮肤


作者/Kilo
 

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

下载源代码

(C)CopyRight, 2003-2004, IRS, All Rights Reserved


  目前这方面的小软件很多,我一直就想做这么一个东东,但是一直苦于时间有限,一直都没有做。最近一段时间,我发现这些方面的东西越来越多,而且都没有源代码,一些家伙在网站上给出这样那样的示例,其实都是在为自己的产品做广告,实在有违开源的思想。
  最近终于有了一段假期,反正没什么事做就来试试,经过一段时间的学习和摸索,终于实现了一段简单的程序。现在我就给出一个简单的例子和解释,让大家明白这是一个怎么回事,教你如何利用这个技术给一个按钮换肤?
  以前我们一直利用重载一个类的办法来实现丰富多彩的个性化控件,如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 ){PCWPSTRUCTpcs = (PCWPSTRUCT) lParam;HWNDhWnd = pcs-hwnd;if( hWnd ) {charsClassName[201] = "";GetClassName( hWnd, sClassName, 200 );if( strcmp( sClassName, "Button" ) == 0 ) {CWnd*pWnd = CWnd::FromHandle( hWnd );DWORDdwStyle = pWnd-GetStyle();if( dwStyle == 0x50010000 ) {WNDPROCWndProc;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 );}      
这样就对按钮的消息进行了挂钩处理了,就可以重新来绘制按钮了。紧接着就是给出按钮控件的绘制方法,我是用一个类来实现的,都是使用的静态函数直接调用的。
#define STATUS_BUTTON_NORMAL0x00000000#define STATUS_BUTTON_HOVER0x00000001#define STATUS_BUTTON_DOWN0x00000002class CButtonExt{public:CButtonExt() {}~CButtonExt() {}static UINTm_nStatus;static WNDPROCm_cWndProc;static LRESULT DefWindowProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ){CWnd*pWnd = NULL;CPointpoint;pWnd = CWnd::FromHandle( hWnd );switch( message ){case WM_PAINT:return OnPaint( pWnd );break;case WM_LBUTTONDOWN:point.x = LOWORD(lParam);point.y = HIWORD(lParam);return OnLButtonDown( pWnd, 0, point );break;case WM_LBUTTONUP:point.x = LOWORD(lParam);point.y = HIWORD(lParam);return OnLButtonUp( pWnd, 0, point );break;case WM_LBUTTONDBLCLK:point.x = LOWORD(lParam);point.y = HIWORD(lParam);return OnLButtonDblClk( pWnd, 0, point );break;case WM_MOUSEMOVE:point.x = LOWORD(lParam);point.y = HIWORD(lParam);return OnMouseMove( pWnd, 0, point );break;defa
                        

来源:http://www.tulaoshi.com/n/20160129/1483825.html

延伸阅读
标签: 女人养生
天生黑皮肤能变白吗 7大方法让黑皮肤换个色 随着社会的发展和生活条件的提高,越来越多人注重起了自己的皮肤。肤色是与生俱来的,很多人天生黑皮肤,这也让他们很苦恼,那么天生黑皮肤能够变白吗?下面就让图老师小编给大家介绍一下吧。 皮肤天生黑的你,是不是也渴望拥有雪白的美肌?虽然皮肤天生黑已成为既定的事实,...
标签: ASP
                 《 优化你的ASP程序 》       如果你是一位ASP爱好者,你一定想过ASP的执行效率如何?大家都知道ASP效率和CGI的比,在访问量少的时候,它们是不相上下的,有时可能CGI还会好点(我觉得这主要和NT系统运行效率有关),但在访问量大的时候,ASP要比...
标签: 电脑入门
┏╮/╱℡ ╰★ ╮ ╱/╰┛ て﹏似命珍惜゜ て﹏情非得已゜ て﹏庸人自扰゜ 好好生活爱自己ミ .︵o○ 、、 - ● - ′ˋ --------------------------------- ╭⌒ゝ为什么 ╰゛只有...
标签: 营养价值
做饭不仅是释放食材的天性时,味道与营养的碰撞,我们常用一些辅料来帮助食物的提味或是增色。好的烹饪技术再加上好的辅料,何愁做的菜不好吃呢?下面图老师小编就给大家介绍介绍食用辛香料的各种用处,以及烹饪技巧和速食烹饪。 辛香料是我们平时烹饪的辅助功臣,它可以弥补食材在味道上的不足,也可以为菜品的色彩增添一抹亮色。 ...
料一:牛奶 牛奶有美白肌肤、保湿润肤的功效,如果每天用牛奶来洗脸,你会发现肌肤越洗越白,越洗越嫩哦。除了用牛奶来洗,你也可以DIY牛奶洁面粉来洗脸哦! 牛奶嫩白洁颜粉自制方法 材料:市售洁颜粉50G、奶粉50G 制作步骤: 1.将洁颜粉与奶粉以1:1的比例混合均匀即可。 2.倒出适量的牛奶嫩白洁颜粉,在手...

经验教程

773

收藏

26
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部