CSkinDialog
所属分类:对话框与窗口
开发工具:Visual C++
文件大小:299KB
下载次数:43
上传日期:2010-10-22 13:35:02
上 传 者:
yflibra
说明: windows窗口界面换肤实现,采用C++编写,有一定参考价值。
(skin windows window interface implemented using C++ written in a certain reference value.)
文件列表:
CSkinDialog\CSkinDialog.aps (40060, 2007-02-24)
CSkinDialog\CSkinDialog.clw (2455, 2007-02-27)
CSkinDialog\CSkinDialog.cpp (2412, 2007-02-23)
CSkinDialog\CSkinDialog.dsp (5799, 2007-02-15)
CSkinDialog\CSkinDialog.dsw (545, 2005-01-27)
CSkinDialog\CSkinDialog.exe (245760, 2007-02-27)
CSkinDialog\CSkinDialog.h (1409, 2005-01-27)
CSkinDialog\CSkinDialog.manifest (696, 2003-03-10)
CSkinDialog\CSkinDialog.opt (163328, 2007-02-27)
CSkinDialog\CSkinDialog.plg (2818, 2007-02-27)
CSkinDialog\CSkinDialog.rc (8716, 2007-02-24)
CSkinDialog\CSkinDialog.sln (886, 2006-09-08)
CSkinDialog\CSkinDialog.suo (52736, 2009-01-14)
CSkinDialog\CSkinDialog.vcproj (11816, 2006-09-08)
CSkinDialog\CSkinDialog.vcproj.FAN.fan.user (1403, 2009-01-14)
CSkinDialog\CSkinDialogDlg.cpp (9256, 2007-02-27)
CSkinDialog\CSkinDialogDlg.h (1920, 2007-02-15)
CSkinDialog\res\Blue Lace 16.bmp (1270, 2007-02-15)
CSkinDialog\res\CSkinDialog.ico (1078, 2005-01-27)
CSkinDialog\res\CSkinDialog.rc2 (403, 2005-01-27)
CSkinDialog\res\Thumbs.db (3584, 2005-01-30)
CSkinDialog\resource.h (1838, 2007-02-15)
CSkinDialog\skin\Thumbs.db (76800, 2007-02-14)
CSkinDialog\skin\Vista3\button.bmp (8454, 2007-02-23)
CSkinDialog\skin\Vista3\CHECKBOX.bmp (6294, 2007-02-23)
CSkinDialog\skin\Vista3\CLOSE.BMP (16952, 2007-02-23)
CSkinDialog\skin\Vista3\Framebottom.bmp (9656, 2007-02-23)
CSkinDialog\skin\Vista3\framecaption.bmp (54712, 2007-02-23)
CSkinDialog\skin\Vista3\Frameleft.bmp (2456, 2007-02-23)
CSkinDialog\skin\Vista3\Frameright.bmp (2456, 2007-02-23)
CSkinDialog\skin\Vista3\GroupBox.bmp (1558, 2007-02-23)
CSkinDialog\skin\Vista3\HELP.BMP (10808, 2007-02-23)
CSkinDialog\skin\Vista3\MAX.BMP (10296, 2007-02-23)
CSkinDialog\skin\Vista3\MIN.BMP (10808, 2007-02-23)
CSkinDialog\skin\Vista3\RADIOBOX.bmp (4214, 2007-02-23)
CSkinDialog\skin\Vista3\Restore.BMP (10296, 2007-02-23)
CSkinDialog\skin\Vista3\theme.ini (518, 2007-02-23)
CSkinDialog\SkinWin\BitmapEx.cpp (13736, 2005-01-25)
CSkinDialog\SkinWin\BitmapEx.h (2958, 2005-01-31)
... ...
软件换肤的示例
本示例开放源代码,望更多高手完善。有问题请EMail : congpt@163.com
代码实现:
首先使用钩子SetWindowsHookEx钩需要换肤窗口的消息(WH_CALLWNDPROC),然后用自己的消息循环替换原有的消息循环。
最麻烦的就是主窗口、对话框等。主要需要HOOK以下消息:
WM_MOUSEMOVE: 鼠标消息
WM_MOUSEHOVER: 鼠标消息
WM_MOUSELEAVE: 鼠标消息
WM_SHOWWINDOW: 显示窗口,由于皮肤的标题栏高过系统的标题栏高度,就在显示窗口时改变窗口的尺寸
WM_DESTROY: 释放皮肤的资源
WM_NCPAINT: 重画非客户区
WM_NCCALCSIZE: 计算非客户区的尺寸
WM_NCHITTEST: 返回非客户区的鼠标指令代码,例如HTCLOSE就是非客户区的关闭按钮,鼠标消息根据此代码来响应
WM_NCLBUTTONDOWN: 非客户区的鼠标左键按下时响应此消息
WM_NCLBUTTONUP: 非客户区的鼠标左键放开时响应此消息
WM_NCRBUTTONUP: 非客户区的鼠标右键放开时响应此消息
WM_NCMOUSEMOVE: 非客户区的鼠标移动时响应此消息
WM_SIZE: 窗口尺寸改变后响应
由于对非客户区的鼠标消息很多,要HOOK所有的消息太麻烦,所以就在HOOK后,去掉了窗口的WS_CAPTION风格,如果不去掉这个风格,我想需要HOOK以下消息,没有具体实现:
WM_SETCURSOR
WM_INITMENU
WM_INITMENUPOPUP
WM_WINDOWPOSCHANGED
WM_WINDOWPOSCHANGING
WM_ENTERMENULOOP
还要修改WM_MOUSEMOVE、WM_NCLBUTTONDOWN、WM_NCRBUTTONDOWN等鼠标消息。
本示例只实现了部分控件的换肤,其他控件根据HOOK思路应该都可以实现,当然最麻烦的要属滚动条了;
ListCtrl的滚动条我想可以HOOK非客户区的鼠标消息、键盘消息和WM_NCPAINT来实现,就是要自己画,不用其他窗口替代,只要计算出滚动条2个按钮和滑块的位置,我想应该可以实现的,下面是位置的计算代码:
//m_GameList是一个ListCtrl
CString str;
SCROLLINFO si;
m_GameList.GetScrollInfo(SB_VERT,&si);
CRect rect;
m_GameList.GetClientRect(rect);
//l就是滑块的高度
int l=(rect.bottom-rect.top-2*::GetSystemMetrics(SM_CXVSCROLL))*si.nPage/(si.nMax+1);
CDC *dc=m_GameList.GetWindowDC();
int nBorderX=0,nBorderY=0;
if(m_GameList.GetExStyle()&WS_EX_CLIENTEDGE)
{
nBorderX=::GetSystemMetrics(SM_CXEDGE);
nBorderY=::GetSystemMetrics(SM_CYEDGE);
}
CRect rc;
//上箭头按钮
rc.left=rect.right+nBorderX;
rc.top=rect.top+nBorderY;
rc.right=rc.left+::GetSystemMetrics(SM_CXVSCROLL);
rc.bottom=rc.top+::GetSystemMetrics(SM_CYVSCROLL);
CBrush brush(RGB(255,0,0));
dc->FillRect(&rc,&brush);
brush.DeleteObject();
//滚动条滑块区域
rc.left=rect.right+nBorderX;
rc.top=rect.top+nBorderY+::GetSystemMetrics(SM_CYVSCROLL);
rc.right=rc.left+::GetSystemMetrics(SM_CXVSCROLL);
rc.bottom=rect.bottom+nBorderY-::GetSystemMetrics(SM_CYVSCROLL);
CBrush brush1(RGB(22,222,22));
dc->FillRect(&rc,&brush1);
brush1.DeleteObject();
//下箭头按钮
rc.left=rect.right+nBorderX;
rc.top=rect.bottom+nBorderY-::GetSystemMetrics(SM_CYVSCROLL);
rc.right=rc.left+::GetSystemMetrics(SM_CXVSCROLL);
rc.bottom=rc.top+::GetSystemMetrics(SM_CYVSCROLL);
CBrush brush2(RGB(255,0,0));
dc->FillRect(&rc,&brush2);
brush2.DeleteObject();
这个代码是去年写的,今天找出来看很不完善,希望高手们完善代码,免费供大家使用!
丛培涛
2007年2月27日
近期下载者:
相关文件:
收藏者: