再论自绘 EDIT 等系统控件的内置滚动条
yonsm 2003-04-09 09:30:15 这两天,我仔细分析了比如 EDIT/ListView/TreeView 等控件的有关 Scrollbar 方面的消息,目前得出结论——这些控件 Scrollbar 是没法通过 SubClass、SetWindowsHookEx或其它消息处理来自画的——理论上好像就不能:(
问题重要出在 WM_xSCROLL 消息的 wParam == SB_THUMBTRACK 的情况下,此时 EDIT 控件发送 WM_PAINT 消息,EDIT 类内部重画 EDIT 框的显示内容,并且同时绘制 THUMB 块——这样,如果你想EDIT能正常显示 THUMB 就是系统的那个样子,没法自绘:(
CodeProject.com 上有一个 Wi32SDK/C 的 Custom Scrollbar Library(http://www.codeproject.com/dialog/coolscroll.asp 或中文说明:http://www.vccode.com/file_show.php?id=1381),他实现了 Scrollbar 的自绘功能,但是:
1.他的自绘实现是指针对自己创建的窗口的 Scrollbar,而非 EDIT 等系统提供的控件的内置 Scrollbar;
2.使用 MS Detour 可以实现 EDIT 等的自绘,不过他是通过 HOOK API 的方式实现的——晕倒,太严重了吧(不过好像没办法,只能这样子)……
(MS Detour 是 MS Research 上提供的一套 HOOK API 的开发包:http://research.microsoft.com/sn/detours/)
目前我得出这样的结论:自绘 EDIT 的 Scroll 不能通过常规的手段实现。不过有两种方法可以达到目的:
1.HOOK User32.dll 的 Scrollbar 的 API,就像上面的这个 Lib 一样。不过他的 LIB 不完善,只能针对 Win2000/NT 有效(我没测试,LIB 里面说的)。
2.前几天问了一下写iWPS上网咖啡的Bruce是怎样实现自绘滚动条的,他告诉我一个方法——创建Scrollbar Control替换内部的Scrollbar。用SetWindowsRgn() 挖去Scrollbar 原来的区域,然后创建一个 Scrollbar Control,通过我们创建的 Scrollbar Control 转发消息。
上面两种方法都是可以实现的,但是个人感觉都不是好方法——好像杀鸡用牛刀的感觉。不知道能不能通过WM_NCCALCSIZE消息设置NC区域使之为空,然后自绘实现,等等(设想而已)。如果哪位有好的方法,不知能否联系告知(或者讨论这个问题):
QQ:123018
Email:Yonsm@163.com
谢谢!