现在已经实现了自绘的SCROLLBAR,它继承于MFC的 CScrollBar,但是如何将该自绘的SCROLLBAR替换掉系统控件(ListCtrl,TreeCtrl,Edit等)的默认SCROLLBAR呢?
本来Subclass是个好的选择,但是却不可以拿到普通控件的默认Scrollbar,而且该对象好似也不是一直存在的.
看了有的方法是靠隐藏本身的ScrollBar,然后把自己定义的SCROLLBAR放到默认SCROLLBAR的位置上,以替换它.但是没有办法以通用的方式捕获控件的SCROLLINFO变化信息.(其实在SCROLLINFO变化的时候,是需要调用SCROLLBAR类的SETSCROLLBARINFO来设置SCROLLBAR的信息,以使SCROLLBARINFO与控件的内容变化相一致的,比如CListCtrl在InsertItem的时候,这时候它的ScrollInfo应该是变化的.)
本来Subclass是个好的选择,但是却不可以拿到普通控件的默认Scrollbar,而且该对象好似也不是一直存在的.
看了有的方法是靠隐藏本身的ScrollBar,然后把自己定义的SCROLLBAR放到默认SCROLLBAR的位置上,以替换它.但是没有办法以通用的方式捕获控件的SCROLLINFO变化信息.(其实在SCROLLINFO变化的时候,是需要调用SCROLLBAR类的SETSCROLLBARINFO来设置SCROLLBAR的信息,以使SCROLLBARINFO与控件的内容变化相一致的,比如CListCtrl在InsertItem的时候,这时候它的ScrollInfo应该是变化的.)
http://blog.9zi.com/post/1/890
问题不在于是遮盖还是用SETRGN抠去,问题在于一个控件,当它的内容变化的时候,会导致相应的SCROLLINFO信息变化(比如增加或者删除listctrl的节点,那么它的SCROLLINFO里的nMax可能会变化),而问题是我要取得这个事件,从来可以使自己的SCROLLBAR里的SCROLLINFO信息也跟着变化,这样才可以使自己的滚动条信息跟实际控件的滚动条信息是一致的,问题就是,如何知道系统在何时调用了SetScrollInfo,SetScrollPos等API函数.
看了一些专业的界面设计库,对这问题的处理也似乎比较复杂,就是类似"HOOK"API调用,而且不同的系统(win9x和winnt),他们的方法还不同.
似乎没有简单的解决方法,而且比较难把握.没什么信心~~~~
我留意了这么久,也没有完美的解决方案.真是有点U**)*)
即使不是用SUBCLASS,有没有其他好点的方法呢,最好不用HOOK SETSCROLLINFO等API来实现的.
http://www.codeproject.com/dialog/coolscroll.asp