功能要求是这样的,要在一个图形上,显示一个矩形的可移动的透明的测量刻度尺我用的GDI画的,目前是直接在一个面板控件表面上进行绘图,把绘图代码放在控件刷新事件里,只要控件刷新时,这份图形都会重绘。移动的刻度尺我是单做的一个控件,因为要对尺子进行拖放拉伸等操作,直接在面板控件表面绘图画一个尺子不好进行操作。我现在碰到的问题是:我在面板上绘好图后,对尺子进行拖放和拉伸操作时,都会引发面板控件刷新事件,拖动尺子时,面板重复刷新,屏幕闪烁得厉害。
我想只让面板局部刷新,但是不知道怎么具体实现。请问对于实现这个功能,大家一般是个什么思路进行绘图操作?

解决方案 »

  1.   

    你可以分层,只重绘你要重绘的layer
      

  2.   

    构造函数加个代码试试 this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
               
      

  3.   


    你说的是哪个控件使用这个设置?
    尺子控件还是面板控件(panel),尺子控件是我自己写的,我有尝试过SetStyle,不过当时是为了使尺子透明,后来这个方法失败了。不过屏幕闪烁的问题,是面板控件重绘次数太多造成的,跟尺子控件没什么太大关系吧
      

  4.   

    GDI在那个控件绘图,哪个控件闪烁就写在哪个控件的构造函数里。
      

  5.   

    3D游戏是用directX渲染的
    我这个平时普通的控件是用GDI渲染的
      

  6.   

    那你就用directX做呗,这还不简单?
    看你所言GDI渲染的没办法在刷新的时候不闪一下,那你就换呗
      

  7.   

    好久没看了,这帖子忘了
    后来我不得已,把原来的绘图画到内存位图对象上,然后把内存位图对象当成背景图,这样的话,就不用刷新了。
    背景图的遮挡绘制是windows自己的机制处理的,不用老绘制
      

  8.   

    需要注意:重绘(OnPaint)与刷新(Refresh)不是一回事。
    应在重绘事件中写代码,而不是频繁的Refresh。