简体   繁体   中英

The best way to draw a line in windows form C#

我只想知道在不使用 GDI+ 的情况下以 Windows 窗体绘制线条的最佳方法,而是使用工具箱中的控件。

You can use Visual Basic Power Pack Line Shape class - http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.powerpacks.lineshape.aspx

Another solution using Label control

  1. Add a Label control to your form.
  2. Set Label Text to empty.
  3. Set BorderStyle to Fixed3D.
  4. Set AutoSize to false.
  5. Set Height to 2 (most easily accomplished by typing 2 into the Size/Height field under Label Properties).

Source : Draw horizontal divider in winforms

Might not be the best choice but should help

        Label lbl = new Label();
        lbl.Text = "_________________________________";
        this.Controls.Add(lbl);

From: http://www.csharp-examples.net/separator-line/

// separator bevel line
Label labelSeperator = new Label();
labelSeperator.AutoSize = false;
labelSeperator.Height = 2;
labelSeperator.BorderStyle = BorderStyle.Fixed3D;
this.Controls.Add(labelSeperator);

You can use my control:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
public class AmenLine : Control
{

    bool SzChInternaly;
    public enum EDIR : int
    {
        Horizontal = 0,
        Vertical = 1,
        Slash = 2,
        BKSlash = 3
    }

    public enum eStyle : int
    {
        rect = 0,
        circ = 1
    }

    private eStyle _DrawStyle;
    public eStyle DrawStyle {
        get { return _DrawStyle; }
        set {
            _DrawStyle = value;
            BuildMe(_Direc);
        }
    }

    private EDIR _Direc = EDIR.Horizontal;
    public EDIR Direction {
        get { return _Direc; }
        set {
            if ((value == EDIR.Horizontal && _Direc == EDIR.Vertical) | (value == EDIR.Vertical && _Direc == EDIR.Horizontal)) {
                SzChInternaly = true;
                this.Size = new Size(this.Height, this.Width);
            }
            _Direc = value;
            BuildMe(value);
        }
    }

    private void BuildMe(EDIR BodyDir)
    {
        try {
            SzChInternaly = true;
            Drawing2D.GraphicsPath gr = new Drawing2D.GraphicsPath();
            switch (BodyDir) {
                case EDIR.Horizontal:
                    this.Size = new Size(this.Width, _BorderWidth + 10);
                    gr.AddRectangle(new Rectangle(0, (-_BorderWidth + this.Height) / 2, this.Width, _BorderWidth));
                    break;
                case EDIR.Vertical:
                    this.Size = new Size(_BorderWidth + 10, this.Height);
                    gr.AddRectangle(new Rectangle((-_BorderWidth + this.Width) / 2, 0, _BorderWidth, this.Height));
                    break;
                case EDIR.Slash:
                    try {
                        // CType(_BorderWidth * Height / Width, Integer)
                        for (i = 0; i <= Convert.ToInt32(Math.Pow(Math.Pow(Width, 2) + Math.Pow(Height, 2), 0.5)); i += _BorderWidth) {
                            switch (_DrawStyle) {
                                case eStyle.circ:
                                    gr.AddPie(i, Convert.ToInt32(Height * i / Width), _BorderWidth, _BorderWidth, 0, 360);
                                    break;
                                case eStyle.rect:
                                    gr.AddRectangle(new Rectangle(i, Convert.ToInt32(Height * i / Width), _BorderWidth, _BorderWidth));
                                    break;
                            }
                        }
                    } catch {
                    }
                    break;
                case EDIR.BKSlash:
                    try {
                        // CType(_BorderWidth * Height / Width, Integer)
                        for (i = 0; i <= Convert.ToInt32(Math.Pow(Math.Pow(this.Height, 2) + Math.Pow(this.Width, 2), 0.5)); i += _BorderWidth) {
                            switch (_DrawStyle) {
                                case eStyle.circ:
                                    gr.AddPie(Width - 1 - i, Convert.ToInt32(Height * i / Width), _BorderWidth, _BorderWidth, 0, 360);
                                    break;
                                case eStyle.rect:
                                    gr.AddRectangle(new Rectangle(Width - 1 - i, Convert.ToInt32(Height * i / Width), _BorderWidth, _BorderWidth));
                                    break;
                            }
                        }
                    } catch {
                    }
                    break;
            }
            this.Region = new Region(gr);
            SzChInternaly = false;
        } catch {
        }
    }

    private int _BorderWidth = 1;
    public int BorderWidth {
        get { return _BorderWidth; }
        set {
            _BorderWidth = value;
            BuildMe(_Direc);
        }
    }

    public AmenLine()
    {
        this.BackColor = Color.Black;
        BuildMe(_Direc);
    }

    protected override void OnSizeChanged(System.EventArgs e)
    {
        base.OnSizeChanged(e);
        if (SzChInternaly == false)
            BuildMe(_Direc);
    }
}

You can draw line runtime by below code:

Pen pen = new Pen(Color.FromArgb(255, 0, 0, 0));
e.Graphics.DrawLine(pen, 20, 10, 300, 100);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM