none
利用C#,如何封装绘制出的图线? RRS feed

  • 问题

  • 我想要实现AutoCAD里的那种效果,用GDI画了一条线后,这条线能够在鼠标移动到它上面时线条变粗,其实就是能响应OnMouseOver事件,同时这条线也能响应Click事件, 不知道用C#该怎么实现? 纠结了几天,大牛们,来拯救我吧
    2009年10月31日 11:19

答案

  • 有答案了,如下

    自定义控件,然后订阅事件,如OnMouseHover,OnMouseMove

    代码参见如下,具体的可以查看Here 另外也谢谢大家的认真解答

     public class MyLine:Control
        {
    
            bool drawBold = false;
            protected override void OnPaint(PaintEventArgs e)
            {
                base.OnPaint(e);
                Pen p = null;
                if (drawBold)
                {
                   p= new Pen(this.ForeColor, this.Height);
                }
                else
                {
                   p= new Pen(this.ForeColor, this.Height-5);
                }
                e.Graphics.DrawLine(p , 0, this.Height/2, this.Width, this.Height/2);
            }
    
            protected override void OnMouseHover(EventArgs e)
            {
                base.OnMouseHover(e);
                drawBold = true;
                this.Refresh();
            }
            protected override void OnMouseLeave(EventArgs e)
            {
                base.OnMouseLeave(e);
                drawBold = false;
                this.Refresh();
            }
    
            //to move control
            Point p = new Point();
            protected override void OnMouseDown(MouseEventArgs e)
            {
                base.OnMouseDown(e);
                p.X = e.X;
                p.Y = e.Y;
    
            }
            protected override void OnMouseMove(MouseEventArgs e)
            {
                base.OnMouseMove(e);
                if (e.Button == MouseButtons.Left)
                {
                    this.Location = new Point(e.X - p.X + this.Location.X, e.Y - p.Y + this.Location.Y);
    
                }
            }
        }
    2009年11月5日 1:39

全部回复

  • 建议用wpf做这种效果

    2009年10月31日 11:25
  • Winform下呢?
    有没有什么思路?
    我现在能想到的就是利用坐标判断了,难道线条不能封装成对象吗?或者其他.

    2009年10月31日 12:17
  • 线条封装对象? 很困难的
    你的需求先画一条线 然后变粗  本人gdi水平不行 帮不了
    wpf专门解决这个问题

    2009年10月31日 12:28
  • 你好!
         是可以封装的,实现这样一个线条类,把线条画在一个PictureBox中,然后订阅PictureBox的MouseMove事件,通过Cursor.Position获得鼠标位置来判断是否鼠标是否在线上,如果在,就重新画一条粗线!
    周雪峰
    2009年11月1日 9:02
    版主
  • 第一判断PictureBox上划线来吗!把这个线的路径记录下来。
    第二判断画的下一条线,记录路径,判断:如果这个线的路径进入或过第一根或之前的线就变粗!(在画第二条直线的时候就判读划线的鼠标值是否进入第一条直线的路径,是就变粗,否者就不变)
    这是我的想法不知道对不对,献丑了!

    2009年11月2日 2:02
  • 你好:
      第一判断PictureBox上划线来吗!把这个线的路径记录下来。
       第二判断画的下一条线,记录路径,判断:如果这个线的路径进入或过第一根或之前的线就变粗!(在画第二条直线的时候就判读划线的鼠标值是否进入第一条直线的路   径,是就变粗,否者就不变)
    这是我的想法不知道对不对,献丑了!
    我以前也做个这样的问题!
    2009年11月2日 2:05
  • 我能想到的就是自己写个panel类,在里面写相关事件方法
    2009年11月2日 2:27
  • 你好,

    通常这要写定制的控件实现这个需要,使用一下ovalShape控件看是否满足你的要求:
    http://msdn.microsoft.com/en-us/vbasic/bb735936.aspx
    Best regards,
    Riquel
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2009年11月3日 3:25
    版主
  • 就得这样,我以前做过和你这样的程序。
    我做的是判断几条线连一块判断这几天线连一块了吗。还得判断每一根线的线头是否连在下根线的头部。等等。。
    我做了一个月呢!
    2009年11月4日 7:52
  • 有答案了,如下

    自定义控件,然后订阅事件,如OnMouseHover,OnMouseMove

    代码参见如下,具体的可以查看Here 另外也谢谢大家的认真解答

     public class MyLine:Control
        {
    
            bool drawBold = false;
            protected override void OnPaint(PaintEventArgs e)
            {
                base.OnPaint(e);
                Pen p = null;
                if (drawBold)
                {
                   p= new Pen(this.ForeColor, this.Height);
                }
                else
                {
                   p= new Pen(this.ForeColor, this.Height-5);
                }
                e.Graphics.DrawLine(p , 0, this.Height/2, this.Width, this.Height/2);
            }
    
            protected override void OnMouseHover(EventArgs e)
            {
                base.OnMouseHover(e);
                drawBold = true;
                this.Refresh();
            }
            protected override void OnMouseLeave(EventArgs e)
            {
                base.OnMouseLeave(e);
                drawBold = false;
                this.Refresh();
            }
    
            //to move control
            Point p = new Point();
            protected override void OnMouseDown(MouseEventArgs e)
            {
                base.OnMouseDown(e);
                p.X = e.X;
                p.Y = e.Y;
    
            }
            protected override void OnMouseMove(MouseEventArgs e)
            {
                base.OnMouseMove(e);
                if (e.Button == MouseButtons.Left)
                {
                    this.Location = new Point(e.X - p.X + this.Location.X, e.Y - p.Y + this.Location.Y);
    
                }
            }
        }
    2009年11月5日 1:39