【编程】界面 - 皮肤界面(自画窗口标题)
日期:2007年6月10日 作者: 查看:[大字体 中字体 小字体]-
在皮肤界面中,最难的恐怕就是自画窗口标题了,网上虽然有各种各样的解决方法,但是都不是很完美,而商业皮肤界面程序包是需要花钱买的。
其中最主要的问题有:
1、在标题栏或边框移动鼠标时系统会画窗口标题
2、没有任务栏图标。当取消了 SYS_CAPTION Style 后系统不会画窗口标题了,但是同时该窗口也没有任务栏图标。
3、最大化后在标题栏按下鼠标时系统会画窗口标题
4、按下系统按钮再移动鼠标到按钮外后没有正确的重画按钮
没办法,只有自己摸索了,研究了网络上的一些代码片段和几个比较成功的皮肤界面程序比如 RealPlay, Microsoft Money ,发现它们采用的手法都不尽相同,而网上关于这个问题也没有很完美的解决方案,总是有点小瑕疵。最后,去研究了一下 windows 2000 的核心代码中关于窗口管理部分,终于算是比较满意的解决了上面的这些问题,但是,我采用的方法和RealPlay, Microsoft Money 都不太一样,RealPlay 好象没有了 NC_* 的消息,而Microsoft Money 则是采用遮盖的方法,而我是采用直接重画的方法,关键是找到重画的关键点。

关键代码:
1
BEGIN_MSG_MAP(TCaptionBaseT)
2
MESSAGE_HANDLER(WM_NCHITTEST, OnNCHitTest)
3
MESSAGE_HANDLER(WM_NCPAINT, OnNCPaint)
4
5
MESSAGE_HANDLER(WM_NCLBUTTONDOWN, OnNCLButtonDown)
6
MESSAGE_HANDLER(WM_NCLBUTTONUP, OnNCLButtonUp)
7
MESSAGE_HANDLER(WM_NCMOUSEMOVE, OnNCMouseMove)
8
MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp)
9
10
MESSAGE_HANDLER(WM_NCACTIVATE, OnNCActivate)
11
12
MESSAGE_HANDLER(WM_SYSCOMMAND, OnSysCommand)
13
MESSAGE_HANDLER(WM_INITMENU, OnInitMenu)
14
15
MESSAGE_HANDLER(WM_SIZE, OnSizeChanged)
16
MESSAGE_HANDLER(WM_STYLECHANGED , OnStyleChanged)
17
MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingsChange) 18
MESSAGE_HANDLER(WM_SETTEXT, OnSetText)
19
MESSAGE_HANDLER(WM_SETICON , OnSetIcon)
20
21
MESSAGE_HANDLER(WM_CREATE, OnCreate)
22
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
23
END_MSG_MAP()
24
25
LRESULT OnNCLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
26
...{
27
// wParam 由 OnNcHitTest 返回
28
T* pT = static_cast<T*>(this);
29
30
POINT pt = ...{ GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
31
mn_ButtonPress = HTNOWHERE;
32
33
switch( wParam )
34
...{
35
case HTMINBUTTON:
36
case HTMAXBUTTON:
37
case HTCLOSE:
38
case HTHELP:
39
mn_ButtonPress = wParam;
40
mb_OnPressed = TRUE;
41
bHandled = TRUE; // 表示已经处理过了,否则系统会重画按钮且 WM_NC_LBUTTONUP 不会被触发。
42
pT->doReDrawCaption();
43
break;
44
case HTCAPTION:
45
bHandled = FALSE; // 继续让系统进行缺省处理
46
...{
47
DWord nStyle = pT->GetStyle();
48
if(nStyle & WS_MINIMIZE)
49
...{
50
return 0; // BUG: Prevents move of iconic window, but fixes Windows freeze
51
}
52
else
53
if(nStyle & WS_MAXIMIZE)
54
...{
55
// 在系统最大化的时候需要在鼠标按下时重画标题栏
56
bHandled = TRUE; // 表示已经处理过了,否则系统会重画按钮。
57
// 让系统对 HTCAPTION 进行处理
58
pT->DefWindowProc(uMsg, wParam, lParam);
59
pT->doReDrawCaption();
60
}
61
}
62
break;
63
default:
64
bHandled = FALSE; // 继续让系统进行缺省处理
65
break;
66
}
67
return 0;
68
}
69
70
LRESULT OnNCLButtonUp(UINT /**//*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
71
...{
72
// wParam 由 OnNcHitTest 返回
73
T* pT = static_cast<T*>(this);
74
75
mb_OnPressed = FALSE;
76
77
if(wParam == mn_ButtonPress)
78
...{
79
// 鼠标按下和释放在相同的按钮上
80
POINT pt = ...{ GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
81
switch( wParam )
82
...{
83
case HTMINBUTTON:
84
pT->PostMessage(WM_SYSCOMMAND, SC_MINIMIZE, MAKELPARAM(pt.x, pt.y));
85
bHandled = TRUE; // 禁止系统做缺省处理
86
break;
87
case HTMAXBUTTON:
88
mn_ButtonMove = HTNOWHERE; // 最大画后鼠标位置将改变
89
if(pT->GetStyle() & WS_MAXIMIZE)
90
pT->PostMessage(WM_SYSCOMMAND, SC_RESTORE, MAKELPARAM(pt.x, pt.y));
91
else
92
pT->PostMessage(WM_SYSCOMMAND, SC_MAXIMIZE, MAKELPARAM(pt.x, pt.y));
93
bHandled = TRUE; // 禁止系统做缺省处理
94
break;
95
case HTCLOSE:
96
pT->PostMessage(WM_CLOSE);
97
bHandled = TRUE; // 禁止系统做缺省处理
98
break;
99
case HTHELP:
100
pT->PostMessage(WM_HELP);
101
bHandled = TRUE; // 禁止系统做缺省处理
102
break;
103
case HTSYSMENU:
104
default:
105
bHandled = FALSE; // 让系统进行缺省处理
106
}
107
}
108
mn_ButtonPress = HTNOWHERE;
109
return 0;
110
}
111
112
LRESULT OnLButtonUp(UINT /**//*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
113
...{
114
bHandled = FALSE;
115
116
mb_OnPressed = FALSE;
117
mn_ButtonPress = HTNOWHERE;
118
119
return 0;
120
} - [1] [2] 下一页
-
- 【编程】界面 - 皮肤界面(自画窗口标题) 相关文章:
- ·【编程】界面 - 皮肤界面(自画窗口标题)
- 【编程】界面 - 皮肤界面(自画窗口标题) 相关软件
- 特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作
- 者.文章版权归文章原始作者所有.对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转
- 载的文章有版权问题请联系编辑人员,我们尽快予以更正. 转载请注明来源:http://www.hackhome.com
上一篇:服务质量的理性评价
下一篇:销售窍门之——说服他人的心理术
精品推荐
热点TOP10
- ·UML业务建模实例分析
- ·GIF文件格式
- ·代码静态分析工具PC-LINT安装配置
- ·游戏外挂设计技术探讨
- ·开发WDM型的USB设备驱动程序
- ·设计模式探索系列之Bridge模式
- ·逆向思维 《魔兽世界》封包分析
- ·LZW压缩算法简介
- ·Solaris 10 安装及SVC管理及X及Vmware及其它可能遇到的一些问题
- ·1.2 什么是数据挖掘
- ·Spring让LOB数据操作变得简单易行
- ·编写QQ外挂插件的原理和方法
- ·使用BHO定制你的IE浏览器
- ·利用API在Windows下创建进程和线程
- ·在内存中修改数据的网游外挂
- ·程序语言效率比较
- ·正则表达式从入门到精通
- ·网络监听技术概览
- ·游戏开发新手入门之跟踪窗口和使用GDI
- ·原始套接字透析之实现Ping
