当前位置:编程学习 > C#/ASP.NET >>

请问这条直线..........




拖一个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中的那一小段,要比外面的低一些,什么原因,如何处理? --------------------编程问答-------------------- 你那个矩形是实心还是空心的? --------------------编程问答-------------------- 建议你问问 dylike。 --------------------编程问答--------------------
引用 1 楼 healer_kx 的回复:
你那个矩形是实心还是空心的?

那是label,透明的 --------------------编程问答--------------------
引用 2 楼 caozhy 的回复:
建议你问问 dylike。

dylike ?怎么找到他? --------------------编程问答-------------------- 等待答案 --------------------编程问答-------------------- 哦,Label啊,

那我知道了,问题在于你Draw父窗口的时候,是不是有 WS_CLIPCHILDREN属性。

看我这篇BLOG
http://www.cnblogs.com/healerkx/articles/1834179.html

你看我的图,和你的是一回事情吧? --------------------编程问答--------------------
引用 6 楼 healer_kx 的回复:
哦,Label啊,

那我知道了,问题在于你Draw父窗口的时候,是不是有 WS_CLIPCHILDREN属性。

看我这篇BLOG
http://www.cnblogs.com/healerkx/articles/1834179.html

你看我的图,和你的是一回事情吧?

看不懂博客,我不是学c++,我是学c#的 --------------------编程问答-------------------- 等待答案 --------------------编程问答-------------------- Graphics graphics = e.Graphics的e是PaintEventArgs.ClipRectangle 获取要在其中进行绘画的矩形

Graphics graphics = this.CreateGraphics();的this是form1


要比外面的低一些,不至于吧,应该是直线,你把Label的Text设为空看看。 --------------------编程问答--------------------
引用楼主 fgdsf45 的回复:
1:在Form1_Paint中,如果写成Graphics graphics = e.Graphics;直线就能穿过label1;
如果写成Graphics graphics = this.CreateGraphics();不会报错,但不能穿过label1;
是什么原因?


2:为什么穿越的直线不是直的,在label中的那一小段,要比外面的低一些,什么原因,如何处理?




首先咱们说一个小例子,如果你把你现在的划线功能放到一个按钮中,你会发现线一样不能穿过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在透明且有边框的时候绘制有点特殊,其他控件貌似没有这个问题。

貌似是这个道理


--------------------编程问答--------------------
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,