画好后,在WinForm窗体上面拉动QQ或者文件夹之类的,不要碰到winform窗体边框前,都会出现一坚坚的横线,不知怎么解决,请高手指日指教事件.其实就是没有全部刷新,panel里面有很多一条一条的线,是不是没有刷新到panel里面

解决方案 »

  1.   

    代码问题
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
    }
      

  2.   

            private void panel1_Paint(object sender, PaintEventArgs e)
            {
                DrawBorder(e.Graphics, e.ClipRectangle, p2,5);
            }        //画控件界
             private void DrawBorder(Graphics g, Rectangle rect, Pen p,int PenWidth)
            {
                p.Width = PenWidth;
                Rectangle rectangle = new Rectangle(rect.X, rect.Y, rect.Width-1, rect.Height-1);
                g.DrawRectangle(p, rectangle);
            }上面是代码,一楼想得太简单了,也不是二楼所说的那样,换了几台电脑都是这样,窗口给挡住时会触发上面panel1_Paint(object sender, PaintEventArgs e)事件的,但panel里面就有一坚一坚的线.公司的同事也是这个问题
      

  3.   

    我试了几次,
    的确偶尔有这个问题,可以肯定拖动的时候导致e.ClipRectangle发生了变化
      

  4.   

    怎么解决这个问题啊,如果放在protected override void OnPaint(PaintEventArgs e) 

        base.OnPaint(e); 
    } 中的话刷新太大了
      

  5.   

    试下
     base.OnPaint(e); 
      

  6.   

    你绘制的边框是按照刷新的区域绘制的,应该改成按照panel控件的大小来绘制。
      

  7.   

    右击弹出菜单覆盖窗体,也是这个现象,难道别的程序操作鼠标的工作区域对这个程序窗体的e.ClipRectangle有影响?
      

  8.   

    感觉你说得有道理,可是怎么改呢?再指点一下吧,谢谢!
    我觉得差不多一样的代码吧,放在protected override void OnPaint(PaintEventArgs e) 
    里的话就不会有这样的问题,因为OnPaint是全部刷新的.
      

  9.   


    那就全部刷新呗……想精确得到该刷新的部分可不太容易。像这种简单的拖动,性能上应该觉查不出来。
    你这样反而不美观。竖线一定是前一个 e.graphic 的残余。你不单要画新的该画的区域,还要把旧的不用的区域也给重绘掉,否则它将残存在那里……这就是问题所在。
      

  10.   

    不要用Graphics.ClipRectangle,这个在两个窗体重叠后会改变成重叠部分,而不是整个窗体。
    DrawBorder(e.Graphics, e.ClipRectangle, p2, 5);
    把这句话改成
    DrawBorder(e.Graphics, ClientRectangle, p2, 5);
      

  11.   

    原因就是Windows在窗体重叠后GDI只刷新重叠的部分,而不会把整个窗体刷新一遍,不重叠的部分不会被刷新的。而Graphics.ClipRectangle MSDN的解释是:get the rectangle in which to paint,就是说通过它来得到需要刷新部分的矩形(Rectangle),应此当你移动一个窗体与主窗体重叠,实际上GDI+不停的将重叠部分的Rectangle传递到DrawBorder函数中,让后主窗体上就会出现许多凌乱的绘画轨迹。
      

  12.   

    你也可以自己试验一下
    在窗体里建一个Label,然后在Paint里加入        private void Form1_Paint(object sender, PaintEventArgs e)
            {
                label1.Text = e.ClipRectangle.ToString();
                DrawBorder(e.Graphics, e.ClipRectangle, p2, 5);
            }再移动一个窗体在主窗体上,看看ClipRectangle的变化。
      

  13.   

    e.ClipRectangle是要刷新的区域,不是整个控件的区域,要用panel1.ClientRectangle。
      

  14.   


    private void panel1_Paint(object sender, PaintEventArgs e) 
            { 
                DrawBorder(e.Graphics, ClientRectangle, p2,5); 
            }         //画控件界 
            private void DrawBorder(Graphics g, Rectangle rect, Pen p,int PenWidth) 
            { 
                p.Width = PenWidth; 
                Rectangle rectangle = new Rectangle(rect.X, rect.Y, rect.Width-1, rect.Height-1); 
                g.DrawRectangle(p, rectangle); 
            } 
      

  15.   

    还有如果你的改变窗体大小的话,结果也会很乱的。在构造函数里把ResizeRedraw改成true,(默认是false)        public Form1()
            {
                InitializeComponent();
                ResizeRedraw = true;
            }
      

  16.   

    DrawBorder(e.Graphics, ClientRectangle, p2, 5); 
    没有ClientRectangle这样用法的,会报错:
    "当前上下文中不存在名称“ClipRectangle”
      

  17.   

    正确,改为:DrawBorder(e.Graphics, panel1.ClientRectangle, p2, 5); 刷新panel1里面的所有区域
      

  18.   

    正确,改为:DrawBorder(e.Graphics, panel1.ClientRectangle, p2, 5); 刷新panel1里面的所有区域