拖一个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中的那一小段,要比外面的低一些,什么原因,如何处理?
http://www.cnblogs.com/healerkx/articles/1834179.html你看我的图,和你的是一回事情吧?
要比外面的低一些,不至于吧,应该是直线,你把Label的Text设为空看看。
首先咱们说一个小例子,如果你把你现在的划线功能放到一个按钮中,你会发现线一样不能穿过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在透明且有边框的时候绘制有点特殊,其他控件貌似没有这个问题。貌似是这个道理