在C#窗体中绘制一条线的最佳方法

本文关键字:最佳 方法 一条 绘制 窗体 | 更新日期: 2023-09-27 18:29:40

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

在C#窗体中绘制一条线的最佳方法

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

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

  1. 将Label控件添加到表单中
  2. 将"标签文本"设置为空
  3. 将BorderStyle设置为Fixed3D
  4. 将"自动调整大小"设置为false
  5. 将"高度"设置为2(通过在"标签属性"下的"大小/高度"字段中键入2最容易实现)

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

可能不是最好的选择,但应该有助于

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

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

您可以使用我的控件:

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

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

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