支持换肤功能的窗口实例

2016-01-29 11:53 18 1 收藏

支持换肤功能的窗口实例,支持换肤功能的窗口实例

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

支持换肤功能的窗口实例
译者:李不言
原文来源:codeproject

下载本文示例代码

这个例子展示了如何绘制定制(自绘)窗口框架(包括标题、边框等)。


一、前言
如今,支持定制皮肤功能的软件越来越流行。这样用户就可以自己修改程序的外观。甚至Windows操作系统本身做到这点了。Windows XP提供的主题(theme)技术可以修改窗口、按钮、滚动条等的外观。

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

最近,我想用MFC设计一个可以换肤的程序。在网上我没有搜索到任何想要的东西,所以我决定自己写一个。这不是一个很难的问题,但是需要对Windows操作系统的绘制窗口的机制比较熟悉。

二、背景
我提供了下面的一些类:

1. CSkinWin----CSkinWin类是一个绘制定制(自绘)窗口的类。它绘制窗口上、下、左、右边框和标题栏按钮如最大化、关闭按钮。为了作到这一点,CSkinWin类从一个ini文件读入配置信息,在ini文件配置窗口各边框的位图。需要指出的是,ini文件的格式是从Windows Blinds(Stardock的杰作)的UIS格式拷贝过来的,因为我希望在我的程序里支持Windows Blinds的主题。

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

2. CSkinButton---CSkinButton类是绘制定制(自绘)按钮的类。它用四个位图分别代表正常、有焦点、按下和无效状态。位图格式也是Windows Blinds格式,参数在同一个ini文件中定义。因为一个窗口会有多个按钮实例,所以我设计了CSkinButtonResource类来存放定制(自绘)按钮的皮肤。

3. CMyBimtap 等--- 一些相关类,其中有些是来自Codeproject. 尽管我已经不记得这些作者了,但我还是要感谢它们.

三、用法

这些代码的用法很直接。我包含了一个MFC基于窗口的工程,关键代码列在下面。顺便提一下,这些代码在单文档的工程里也测试通过了。
//defines the following member in the dialog classCSkinButtonResourcem_btnres;//skin button resourceCSkinWinm_skinWin;//skin winBOOLm_bFirst;//first time callCObList m_wndList;//hold button instance//In OnInitDialogm_bFirst = TRUE;SetSkin( "skinneostyletheme.ini" );//SetSkin is a function to change skinBOOL CSkinTestDlg::SetSkin(CString file){m_skinWin.LoadSkin( file );//load skin bitmap and parametersm_btnres.LoadSkin( file );if ( m_bFirst ){//if it''s the first time call, InstallSkinm_skinWin.InstallSkin( this );//call EnumChildWindows to subclass all buttonsEnumChildWindows( m_hWnd, EnumChildProc, (LPARAM)this );m_bFirst = FALSE;}//redraw window after change skinSetWindowPos( 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE |SWP_FRAMECHANGED );return TRUE;}//enum child window and take chance to subclass them#define     GetWindowStyle(hwnd)    ((DWORD)GetWindowLong(hwnd, GWL_STYLE))BOOL CALLBACK EnumChildProc(  HWND hwnd,      // handle to child windowLPARAM lParam   // application-defined value){char classname[200];CSkinTestDlg *dlg = (CSkinTestDlg *)lParam;DWORD style;GetClassName( hwnd, classname, 200 );style = GetWindowStyle( hwnd );if ( strcmp( classname, "Button" ) == 0 ){style = (UINT)GetWindowLong(hwnd, GWL_STYLE) & 0xff;if ( style == BS_PUSHBUTTON || style == BS_DEFPUSHBUTTON )dlg->SubClassButton( hwnd );}return TRUE;}//subclass push buttonsBOOL CSkinTestDlg::SubClassButton( HWND hwnd ){CSkinButton * btn = new CSkinButton();CWnd* pWnd = CWnd::FromHandlePermanent(hwnd);if ( pWnd == NULL){btn->SubclassWindow( hwnd );btn->SetResource( &m_btnres );return TRUE;}return FALSE;}//free CSkinButton instancesvoid CSkinTestDlg::OnDestroy() {CDialog::OnDestroy();// TODO: Add your message handler code herePOSITION pos;pos = m_wndList.GetHeadPosition();while( pos ){CObject *ob = m_wndLis
                        

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

延伸阅读
标签: excel
Excel监视窗口的功能   Excel工作簿怎么加密保存?   Excel中特殊符号怎么输入?  
标签: Web开发
当你创建了一个新窗口时,将open()方法的返回值分配给一个变量非常重要。比如,下面的语句就是创建一个新窗口,然后立即关闭它: win = window.open("http://www.docjs.com/", "js"); win.close(); 每一个浏览器窗口都清楚地与一个window对象对应,所以,当你想引用当前窗口时,你应该使用window对象。下面的语句设置当前窗...
标签: 电脑入门
Android版Skype支持以下功能:接收来自于skype和在线号码的呼叫,即时信息(IM),群组即时信息,Skype对Skype账户通话,Skype对座机和手机通话,参与电话会议,可与Android电话簿同步,可导入本机电话簿号码,呼叫转移,显示常用人,联系人分组,视频通话,Skype 短信功能,蓝牙耳机,文件发送,语音信箱。
可能造成灼伤 1 果酸换肤利用的高浓度果酸在进行换肤的时候,用量、浓度等都是有要求的,如果是盲目使用果酸换肤或者是用量、浓度掌握不好很容易发生皮肤灼伤的情况。 容易引起过敏反应 2 果酸换肤使用的高浓度果酸具有一定的抗原性,术后被皮肤吸收后照样可以发生过敏发应。常见的有皮肤红肿、发痒甚至是溃烂。 可能引起色素沉着 ...
标签: 电脑入门
办公软件一向给人的感觉都是界面乏味、色彩单调,但金山WPS Office抢鲜版特别提供了换肤功能,用户可以根据自己的心情进行妆点,让原本单调的办公文档也焕发了春天的生机和彩色的味道。 网友可登陆WPS官网下载WPS Office抢鲜版V3.0试用。点击工具栏的换肤按钮, ,就可以给WPS文档换上新装。 下面我们就去体验一下几种常见的WPS皮肤: ...

经验教程

19

收藏

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