当窗口的一部分被遮住的时候,WINDOWS就会发送PAINT事件,应用程序就会调用OnPaint方法,哪怕被遮住的部分没有图象.那没有被遮住的那部分也应该被重绘了,请问下面的情况是什么原因:一个100*100的窗口,OnPaint方法里
e.Graphics.DrawString(e.ClipRectangle.X.ToString(), new Font("t", 20), Brushes.Black, 10, 10);当我用别的窗口来遮这个窗口的时候,如果只遮了右下角一部分,没遮住显示的数字的时候,数字并没变啊?这种情况下,被重绘的也应该是整个窗口啊.为什么数字不变?

解决方案 »

  1.   

    to 当我用别的窗口来遮这个窗口的时候,如果只遮了右下角一部分,没遮住显示的数字的时候,数字并没变啊?这种情况下,被重绘的也应该是整个窗口啊.为什么数字不变?既然被重绘的也应该是整个窗口,那么e.ClipRectangle.X每次都等于窗体左上角的值,数字当然不会变了。
      

  2.   

    实际应用中,你应在绘制的过程中判断是否也窗口非可视部分相交,只画被遮住部分,对GDI+来说,就是设置Graphics的区域
      

  3.   

    TO:Knight94
      数字肯定会变,e.ClipRectangle.X.ToString()是剪切区域的X坐标,怎么可能不变呢.是等于用来遮窗口的那个窗体的左上角X坐标.
      当我把前面显示的数字遮住后,数字就改变了.TO:flygoldfish
      实际应用是一会事,OnPaint中判断剪切区域(无效区域)是否包括了显示的东西,如果没有的话,则不需要重绘.这点我明白
      但我这里是不明白为什么是这种情况.
      

  4.   

    做了一个程序测了一下,在OnPaint中并不是重画整个窗体,而是被遮住的地方。
    那么当重画的区域包括数字,那么会修改数字内容;
    如果重画的区域不包括数字,那么数字所在的区域就不会刷新。因此在Onpaint中,重画的区域是由ClipRectangle来决定的。
      

  5.   

    下午有事,现在才看帖.
    TO:Knight94
    实际情况如你的一样,似乎是只绘制无效区域也就是ClipRectangle来决定.
    我还有疑问:
    1,把问题集中到这样一个问题上来:如果覆盖的区域没有包括数字,那是否调用了OnPaint?如果调用了,那其中的代码就要完全执行啊,怎么会不重绘数字呢?
    2,如果OnPaint事件中自己会检测无效区域且只绘制这部分,那WINDOWS也帮我们做了太多事情了吧?
      

  6.   

    to 1,把问题集中到这样一个问题上来:如果覆盖的区域没有包括数字,那是否调用了OnPaint?如果调用了,那其中的代码就要完全执行啊,怎么会不重绘数字呢?查看了一下msdn,上面所说的在paint事件中的所重画的地方由参数cliprectangle而决定,因此即使你在paint中修改了数字,但是没有提交系统让其重画,那么数字区域也是不能更新的。to 2,如果OnPaint事件中自己会检测无效区域且只绘制这部分,那WINDOWS也帮我们做了太多事情了吧?系统这样考虑也是为了提高效率,你如果想在程序中进行重画,可以显示调用Invalidate这个函数。