想做一个控件,里面的背景和内容全是自己在Canvas画上去的。为了不闪烁,去掉背景重画
消息。使用区域重画技术。这已经能做到了。现在想要的效果是,我要画的东西比显示的面积大,想加上滚动条功能。没有实现谁能给讲讲滚动条用SendMessage(sebox.Handle, LB_SETHORIZONTALEXTENT,MaxWidth+3,0);对ListBox有效
对Panel无效所以这不能解决我的问题
消息。使用区域重画技术。这已经能做到了。现在想要的效果是,我要画的东西比显示的面积大,想加上滚动条功能。没有实现谁能给讲讲滚动条用SendMessage(sebox.Handle, LB_SETHORIZONTALEXTENT,MaxWidth+3,0);对ListBox有效
对Panel无效所以这不能解决我的问题
在WM_HSCROLL/WM_VSCROLL消息中自己处理滚动。
SetScrollRange可以设置滚动条范围,SetScrollPos可以设置滚动条的位置等等函数都可以在MSDN或者delphi自带的帮助中查到。
首先你要吧画布的尺寸设置成和你要求的一样大小,并且吧Panel的滚动条设置出来;
其次你实现了区域重绘,我相信你使用了区域划分技术吧,只要覆盖OnPaint方法就可以了啊;
在WM_HSCROLL/WM_VSCROLL消息中自己处理滚动。
SetScrollRange可以设置滚动条范围,SetScrollPos可以设置滚动条的位置等等函数都可以在MSDN或者delphi自带的帮助中查到。*******************************************************************************************
很多人喜欢用内存位图来解决闪烁问题,但解决得往往不好,因为他没有注销掉WM_ERASEBKGND消息!其实,对于继承自TWincontrol的TCustomControl,只要加上DoubleBuffed :=True即可,因为VCL解决控件绘图闪烁问题就是建立一个内存位图来解决的,根本不要自己来操作这个过程,导致画蛇添足而且往往遗漏了某些关键部分。
对于祖先控件是非TWincontrol的控件,也不用这么麻烦,只要设置其父控件的DoubleBuffed :=True即可!
如果你的绘图比较庞大,就必须使用特殊的技术,比如区域绘制就是一个比较好的方法。比如你要绘制一个横向1000,纵向1000个数的正方形,每个正方形的大小是100*100,每个正方形的间距也是100,如果用楼上方法就不适用了,因为滚动条不停地滚动的话,你的屏幕会闪烁的你晕船!
我原来做过一个显示类似project软件中甘特图和网络图的控件,尝试过楼上的方法,但是无法解决闪烁问题。后来也是高人指点,将整张绘图进行分块,在滚动条拖动过程中,计算出需要绘制的区域,然后仅仅绘制需要绘制的区域,这样就基本解决闪烁问题了。如果大家有好的想法,欢迎交流
如果你的绘图比较庞大,就必须使用特殊的技术,比如区域绘制就是一个比较好的方法。比如你要绘制一个横向1000,纵向1000个数的正方形,每个正方形的大小是100*100,每个正方形的间距也是100,如果用楼上方法就不适用了,因为滚动条不停地滚动的话,你的屏幕会闪烁的你晕船!
我原来做过一个显示类似project软件中甘特图和网络图的控件,尝试过楼上的方法,但是无法解决闪烁问题。后来也是高人指点,将整张绘图进行分块,在滚动条拖动过程中,计算出需要绘制的区域,然后仅仅绘制需要绘制的区域,这样就基本解决闪烁问题了。如果大家有好的想法,欢迎交流
********************************************************************************************
的确,VCL的DoubleBuffered特性,有些情况下是BUG,因为它创建的内存位图大小是整个控件的客户区的大小,若控件很大,那就很糟糕。我一直不明白,为什么Borland一直没有去修正这个BUG!我个人就是修正了这个BUG的,这个BUG在TWincontrol的WM_PAINT消息响应例程里!