2009-12-15 3 views
0

Я использую Microsoft.VisualBasic. PowerPacks. Компонент LineShape. Этот компонент хорош, но я хочу нарисовать кривую вместо правой линии. Я stardet модифицировать OnPaint:Нарисуйте новую изогнутую форму, унаследованную от LineShape

protected override void OnPaint(PaintEventArgs pevent) 
    { 
     //base.OnPaint(pevent);    
     pevent.Graphics.DrawLines(Pens.Green, new Point[] { 
      new Point(X1, Y1), new Point(40, 10), new Point(X2, Y2)}); 
    } 

компонент рисуется правильно, но он не обнаруживает события мыши (нажмите, вниз). Пожалуйста, помогите, это мой весь тестовый код:

using System; 
using System.Drawing; 
using System.Windows.Forms; 
using Microsoft.VisualBasic.PowerPacks; 

namespace WindowsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     private ShapeContainer shapeContainer1; 

     public Form1() 
     { 
      this.shapeContainer1 = new PowerPacks.ShapeContainer(); 
      InitializeComponent(); 

      // add the shapeContainer1 
      this.Controls.Add(this.shapeContainer1); 

      // add a blue LineShape 
      this.shapeContainer1.Shapes.Add(
       new LineShape(60, 10, 90, 70)); 
      (this.shapeContainer1.Shapes.get_Item(0) as LineShape).BorderColor = Color.Blue; 

      // add a red (green in OnPaint) MyCourveShape 
      this.shapeContainer1.Shapes.Add(
       new MyCourveShape(10, 10, 50, 50)); 
      (this.shapeContainer1.Shapes.get_Item(1) as MyCourveShape).BorderColor = Color.Red; 
     } 
    } 

    public class MyCourveShape : Microsoft.VisualBasic.PowerPacks.LineShape 
    { 
     public MyCourveShape(int x1, int y1, int x2, int y2) 
     { 
      this.X1 = x1; 
      this.X2 = x2; 
      this.Y1 = y1; 
      this.Y2 = y2; 
     } 

     protected override void OnPaint(PaintEventArgs pevent) 
     { 
      //base.OnPaint(pevent);    
      pevent.Graphics.DrawLines(Pens.Green, new Point[] { 
       new Point(X1, Y1), new Point(40, 10), new Point(X2, Y2)}); 
     } 

     protected override void OnClick(EventArgs e) 
     { 
      base.OnClick(e); 
      MessageBox.Show("MyCourveShape clicked!"); 
     } 
    } 
} 

ответ

1

Вы также должны переопределить метод HitTest(). Базовая реализация по-прежнему предполагает, что это прямая линия.

+0

Я предполагаю, что это должно быть немного сложным ... посмотрел на базовую реализацию ... – serhio

+1

Использование GraphicsPath.IsOutlineВозвратитесь с относительно толстым пером. Тот же объект GraphicsPath подходит для рисования. –

Смежные вопросы