在Windows中以Windows形式绘制线条的最佳方法

时间:2013-08-30 07:13:11

标签: c# .net winforms

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

5 个答案:

答案 0 :(得分:6)

您可以使用Visual Basic Power Pack Line Shape类 - http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.powerpacks.lineshape.aspx

使用Label控件的另一种解决方案

  1. 向表单添加Label控件。
  2. 将标签文字设置为空。
  3. 将BorderStyle设置为Fixed3D。
  4. 将AutoSize设置为false。
  5. 将高度设置为2(最容易通过在“标签属性”下的“大小/高度”字段中键入2来完成。)
  6. 来源:Draw horizontal divider in winforms

答案 1 :(得分:3)

可能不是最佳选择,但应该提供帮助

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

答案 2 :(得分:0)

您可以使用我的控件:

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);
    }
}

答案 3 :(得分:0)

来自: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);

答案 4 :(得分:-1)

您可以通过以下代码绘制行运行时:

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