想做一个控件,里面的背景和内容全是自己在Canvas画上去的。为了不闪烁,去掉背景重画
消息。使用区域重画技术。这已经能做到了。现在想要的效果是,我要画的东西比显示的面积大,想加上滚动条功能。没有实现谁能给讲讲滚动条用SendMessage(sebox.Handle,   LB_SETHORIZONTALEXTENT,MaxWidth+3,0);对ListBox有效
对Panel无效所以这不能解决我的问题

解决方案 »

  1.   

    使用内存DC画图,然后使用Bitblt传送到display DC。可以消除闪烁。滚动条自己处理吧。
      在WM_HSCROLL/WM_VSCROLL消息中自己处理滚动。
      SetScrollRange可以设置滚动条范围,SetScrollPos可以设置滚动条的位置等等函数都可以在MSDN或者delphi自带的帮助中查到。
      

  2.   

    你使用的这个技术可以实现啊,不过肯定还是要使用OnPain方法的,需要覆盖这个方法,然后在这个方法中计算要绘制的区域,然后重新绘制就可以了啊。
    首先你要吧画布的尺寸设置成和你要求的一样大小,并且吧Panel的滚动条设置出来;
    其次你实现了区域重绘,我相信你使用了区域划分技术吧,只要覆盖OnPaint方法就可以了啊;
      

  3.   

    使用内存DC画图,然后使用Bitblt传送到display   DC。可以消除闪烁。 滚动条自己处理吧。 
        在WM_HSCROLL/WM_VSCROLL消息中自己处理滚动。 
        SetScrollRange可以设置滚动条范围,SetScrollPos可以设置滚动条的位置等等函数都可以在MSDN或者delphi自带的帮助中查到。*******************************************************************************************
    很多人喜欢用内存位图来解决闪烁问题,但解决得往往不好,因为他没有注销掉WM_ERASEBKGND消息!其实,对于继承自TWincontrol的TCustomControl,只要加上DoubleBuffed :=True即可,因为VCL解决控件绘图闪烁问题就是建立一个内存位图来解决的,根本不要自己来操作这个过程,导致画蛇添足而且往往遗漏了某些关键部分。
    对于祖先控件是非TWincontrol的控件,也不用这么麻烦,只要设置其父控件的DoubleBuffed :=True即可!
      

  4.   

    楼上的方法可以解决一般绘图的要求。
    如果你的绘图比较庞大,就必须使用特殊的技术,比如区域绘制就是一个比较好的方法。比如你要绘制一个横向1000,纵向1000个数的正方形,每个正方形的大小是100*100,每个正方形的间距也是100,如果用楼上方法就不适用了,因为滚动条不停地滚动的话,你的屏幕会闪烁的你晕船!
    我原来做过一个显示类似project软件中甘特图和网络图的控件,尝试过楼上的方法,但是无法解决闪烁问题。后来也是高人指点,将整张绘图进行分块,在滚动条拖动过程中,计算出需要绘制的区域,然后仅仅绘制需要绘制的区域,这样就基本解决闪烁问题了。如果大家有好的想法,欢迎交流
      

  5.   

    楼上的方法可以解决一般绘图的要求。 
    如果你的绘图比较庞大,就必须使用特殊的技术,比如区域绘制就是一个比较好的方法。比如你要绘制一个横向1000,纵向1000个数的正方形,每个正方形的大小是100*100,每个正方形的间距也是100,如果用楼上方法就不适用了,因为滚动条不停地滚动的话,你的屏幕会闪烁的你晕船! 
    我原来做过一个显示类似project软件中甘特图和网络图的控件,尝试过楼上的方法,但是无法解决闪烁问题。后来也是高人指点,将整张绘图进行分块,在滚动条拖动过程中,计算出需要绘制的区域,然后仅仅绘制需要绘制的区域,这样就基本解决闪烁问题了。如果大家有好的想法,欢迎交流
    ********************************************************************************************
    的确,VCL的DoubleBuffered特性,有些情况下是BUG,因为它创建的内存位图大小是整个控件的客户区的大小,若控件很大,那就很糟糕。我一直不明白,为什么Borland一直没有去修正这个BUG!我个人就是修正了这个BUG的,这个BUG在TWincontrol的WM_PAINT消息响应例程里!