请问这条直线..........
拖一个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。 --------------------编程问答--------------------
那是label,透明的 --------------------编程问答--------------------
dylike ?怎么找到他? --------------------编程问答-------------------- 等待答案 --------------------编程问答-------------------- 哦,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设为空看看。 --------------------编程问答--------------------
首先咱们说一个小例子,如果你把你现在的划线功能放到一个按钮中,你会发现线一样不能穿过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#