日期:2014-05-18  浏览次数:21079 次

求助,自定义控件无法显示
控件定义代码如下:
  public partial class Line : UserControl
  {
  private Point start;
  private Point end;

  public Line()
  {
  InitializeComponent();
  }

  public Line(Point start, Point end)
  : this()
  {
  this.start = start;
  this.end = end;
  }

  public Point Start
  {
  get
  {
  return this.start;
  }
  set
  {
  this.start = value;
  }
  }

  public Point End
  {
  get
  {
  return this.end;
  }
  set
  {
  this.end = value;
  }
  }

  protected override void OnPaint(PaintEventArgs e)
  {
  base.OnPaint(e);

  Pen pen = new Pen(Color.Black);
  e.Graphics.DrawLine(pen, this.Start, this.End);
  }
  }

主窗体中代码如下:
  public partial class Form1 : Form
  {
  public Form1()
  {
  InitializeComponent();

  Line line1 = new Line(new Point(10, 10), new Point(100, 10));
  Line line2 = new Line(new Point(10, 100), new Point(100, 100));

  this.Controls.Add(line1);
  this.Controls.Add(line2);
  }
  }

为什么运行时只能显示一条直线啊?


------解决方案--------------------
你的:
protected override void OnPaint(PaintEventArgs e) 

base.OnPaint(e); 

Pen pen = new Pen(Color.Black); 
e.Graphics.DrawLine(pen, this.Start, this.End); 

改为:
public Line(Point start, Point end)
: this()
{
this.start = start;
this.end = end;
this.Location = start;
this.Width = end.X - start.X;
this.Height = 10;
//this.BackColor = Color.Tomato;
this.BorderStyle = BorderStyle.Fixed3D;
}
 
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Pen pen = new Pen(c,10f);
//错在这里, 请注意, 现在你是在你的UserControl里画线,不是在Form里, 所以你的start和end的坐标是给Form,不是你的Control的。
//
e.Graphics.DrawLine(pen,new Point(0,0),new Point(this.Width,0));
}
------解决方案--------------------
Line是个窗体?
这样设计似乎不太好,画一条线多一个窗体,这样很占资源的。
应该要自己绘图,重载鼠标事件进行模拟。

就算Line是窗体,也应该从Control继承,而不是UserControl
难道Line还要包含子控件?它还是组合控件?

这种东西要做的话,Line应该是个图形(自定义类),它可以实现某个统一接口(如绘图、响应鼠标事件等)
然后再从Control继承,做一个容器,用来绘制你定义的这种线条(类似于画板)

然后窗体上放一个画板。。。
------解决方案--------------------
呵!你试试 两个Text属性不同的Button重合在一起看看是不是都能看到他们的Text