导读:
本文介绍了基于WTL框架的一种换肤方法,可以实现对话框或框架窗口的换肤。
给窗口换肤的方法有很多种,原理基本相同,无非就是对非客户区的重绘。只不过在实现手段上有很多种方式。本文介绍的是其中一种较简单和易于理解的方式。即对某个窗口句柄进行子类化操作,使该窗口的非客户区绘制被我们的代码所替换,从而实现换肤操作。
下图是我们进行换肤后的SDI窗口:
下面就实现的主要步骤做一些简单的说明:
一、我们首先创建自己的换肤窗口类,继承于CWindowImpl,并指定我们需要的窗体风格。例如:
typedef CWinTraits CXuTraits;class CXuSkinWindow : public CWindowImpl
二、然后我们需要处理一些关键的消息,例如WM_NCPAINT、WM_ACTIVATE、WM_NCACTIVATE、WM_NCHITTEST、WM_SIZE等等。
三、我们还要提供一个方法,接收一个窗口的句柄,用于子类化换肤。例如:void EnableWindowFrame(HWND hWnd);
四、当然,我们的换肤图片、颜色绘制都离不开GDI。在我的示例程序里,封装了图片绘制的类,用于进行图片拉伸绘制、去透明背景色绘制等方法。
五、另外,图片和颜色值都是从INI文件中读取,这样方便实现动态换肤。
1、绘制窗口非客户区主要分为四个部分:标题(需要拉伸绘制),左边框,右边框,底边框。我们在非客户区绘制消息中去分别绘制这四部分就好了。绘制的范围需要根据当前窗口的大小来计算好。
2、Windows标准主题、XP主题以及Vista窗口在绘制上有一些区别,主要是窗口的标题栏高度、边框宽度有些不同,需要根据情况动态判断,以适应各种主题下的显示。
CSDN这个blog好像不允许上传附件,需要完整示例程序的朋友可以发E-mail给我:epubcn@gmail.com
一些提示
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1858214
本文转自
http://blog.csdn.net/epubcn/archive/2007/10/30/1858214.aspx
本文介绍了基于WTL框架的一种换肤方法,可以实现对话框或框架窗口的换肤。
给窗口换肤的方法有很多种,原理基本相同,无非就是对非客户区的重绘。只不过在实现手段上有很多种方式。本文介绍的是其中一种较简单和易于理解的方式。即对某个窗口句柄进行子类化操作,使该窗口的非客户区绘制被我们的代码所替换,从而实现换肤操作。
下图是我们进行换肤后的SDI窗口:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/epubcn/skinwindow.gif)
下面就实现的主要步骤做一些简单的说明:
一、我们首先创建自己的换肤窗口类,继承于CWindowImpl,并指定我们需要的窗体风格。例如:
typedef CWinTraits CXuTraits;class CXuSkinWindow : public CWindowImpl
二、然后我们需要处理一些关键的消息,例如WM_NCPAINT、WM_ACTIVATE、WM_NCACTIVATE、WM_NCHITTEST、WM_SIZE等等。
三、我们还要提供一个方法,接收一个窗口的句柄,用于子类化换肤。例如:void EnableWindowFrame(HWND hWnd);
四、当然,我们的换肤图片、颜色绘制都离不开GDI。在我的示例程序里,封装了图片绘制的类,用于进行图片拉伸绘制、去透明背景色绘制等方法。
五、另外,图片和颜色值都是从INI文件中读取,这样方便实现动态换肤。
1、绘制窗口非客户区主要分为四个部分:标题(需要拉伸绘制),左边框,右边框,底边框。我们在非客户区绘制消息中去分别绘制这四部分就好了。绘制的范围需要根据当前窗口的大小来计算好。
2、Windows标准主题、XP主题以及Vista窗口在绘制上有一些区别,主要是窗口的标题栏高度、边框宽度有些不同,需要根据情况动态判断,以适应各种主题下的显示。
CSDN这个blog好像不允许上传附件,需要完整示例程序的朋友可以发E-mail给我:epubcn@gmail.com
一些提示
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1858214
本文转自
http://blog.csdn.net/epubcn/archive/2007/10/30/1858214.aspx