拖一个label1到窗口
private void Form1_Load(object sender, EventArgs e)
    {
      label1.BackColor = Color.Transparent;
    }
private void Form1_Paint(object sender, PaintEventArgs e)
    {
       Graphics graphics = e.Graphics;
       //Graphics graphics = this.CreateGraphics();
       Pen pen1 = new Pen(Color.Gray, 1);
       int x = label1.Location.X ;
       int y = label1.Location.Y ;
       graphics.DrawLine(pen1, x - 20, y+20, x + 30, y+20);  
    }情况是这样的,1:在Form1_Paint中,如果写成Graphics graphics = e.Graphics;直线就能穿过label1;
如果写成Graphics graphics = this.CreateGraphics();不会报错,但不能穿过label1;
是什么原因?2:为什么穿越的直线不是直的,在label中的那一小段,要比外面的低一些,什么原因,如何处理?

解决方案 »

  1.   

    哦,Label啊,那我知道了,问题在于你Draw父窗口的时候,是不是有 WS_CLIPCHILDREN属性。看我这篇BLOG
    http://www.cnblogs.com/healerkx/articles/1834179.html你看我的图,和你的是一回事情吧?
      

  2.   

    Graphics graphics = e.Graphics的e是PaintEventArgs.ClipRectangle 获取要在其中进行绘画的矩形Graphics graphics = this.CreateGraphics();的this是form1
    要比外面的低一些,不至于吧,应该是直线,你把Label的Text设为空看看。
      

  3.   


    首先咱们说一个小例子,如果你把你现在的划线功能放到一个按钮中,你会发现线一样不能穿过Lable!!!
    说说这两个不同的方法
    A:CreateGraphics对应windows sdk的GetDC()函数,
    B:而Paint事件中的图形对象对应windows sdk的BeginPaint()和EndPaint()两个函数。A只管在对应的屏幕区域划线而已,其他什么都不做,而Lable位于窗口之上,线是不会穿过Label,而是
     从Lable后面画过去了。
    在B事件中为什么能穿过呢?先要说说透明控件,所谓透明是假的,而是Lable在绘制背景的时候将父窗口相同
    区域的背景画成自己的背景,这样看上去就像透明一样了。
    另外,在B事件中会引发父窗口背景重绘,线重绘,然后是Lable重绘。这样Lable就有线了。线为什么会低一些呢?因为Lable取得父窗口背景的时候是从边框左上角取得,
    但是绘制的时候却从边框的x、y各加1像素绘制的,这样导致了线低了一个像素,
    正式这个边框导致,Lable在透明且有边框的时候绘制有点特殊,其他控件貌似没有这个问题。貌似是这个道理