1

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

4

5 回答 5

8

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

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

  1. 将标签控件添加到您的窗体。
  2. 将标签文本设置为空。
  3. 将 BorderStyle 设置为 Fixed3D。
  4. 将 AutoSize 设置为 false。
  5. 将高度设置为 2(最容易通过在标签属性下的大小/高度字段中键入 2 来完成)。

来源:在winforms中绘制水平分隔线

于 2013-08-30T07:17:34.840 回答
5

可能不是最佳选择,但应该有所帮助

        Label lbl = new Label();
        lbl.Text = "_________________________________";
        this.Controls.Add(lbl);
于 2013-08-30T07:20:02.990 回答
1

来自: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);
于 2015-01-15T15:36:17.590 回答
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);
    }
}
于 2013-08-30T08:17:05.790 回答
0

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

Pen pen = new Pen(Color.FromArgb(255, 0, 0, 0));
e.Graphics.DrawLine(pen, 20, 10, 300, 100);
于 2014-02-03T09:57:46.590 回答