Рисование TextBox

1

Мне нужен способ сделать TextBox похожим на параллелограмм, но я не могу понять, как это сделать. У меня есть этот код:

private void IOBox_Paint(object sender, PaintEventArgs e)
{
    Graphics g = e.Graphics;
    Point cursor = PointToClient(Cursor.Position);
    Point[] points = { cursor, new Point(cursor.X + 50, cursor.Y), new Point(cursor.X + 30, cursor.Y - 20),
                         new Point(cursor.X - 20, cursor.Y - 20) };
    Pen pen = new Pen(SystemColors.MenuHighlight, 2);
    g.DrawLines(pen, points);
}

Но, видимо, это не работает. Либо я неправильно или неправильно использовал его, либо я ничего не делаю правильно. Это метод, который я использую для его добавления.

int IOCounter = 0;
private void inputOutput_Click(object sender, EventArgs e)
{
    IOBox box = new IOBox();
    box.Name = "IOBox" + IOCounter;
    IOCounter++;
    box.Location = PointToClient(Cursor.Position);
    this.Controls.Add(box);
}

Любая идея, как я могу это исправить? IOBox - это UserControl, созданный мной, который содержит TextBox. Это законно?

Теги:
winforms

1 ответ

1
Лучший ответ

Если это возможно, вы должны сделать свое приложение с помощью WPF. WPF предназначен для того, чтобы делать именно то, что вы пытаетесь сделать.

Однако это можно сделать в WinForms, хотя и не легко. Вам нужно будет создать новый класс, который наследует элемент управления TextBox WinForm. Вот пример, который делает TextBox похожим на круг:

public class MyTextBox : TextBox
{
    public MyTextBox() : base()
    {
        SetStyle(ControlStyles.UserPaint, true);
        Multiline = true;
        Width = 130;
        Height = 119;
    }

    public override sealed bool Multiline
    {
        get { return base.Multiline; }
        set { base.Multiline = value; }
    }

    protected override void OnPaintBackground(PaintEventArgs e)
    {
        var buttonPath = new System.Drawing.Drawing2D.GraphicsPath();
        var newRectangle = ClientRectangle;

        newRectangle.Inflate(-10, -10);
        e.Graphics.DrawEllipse(System.Drawing.Pens.Black, newRectangle);
        newRectangle.Inflate(1, 1);
        buttonPath.AddEllipse(newRectangle);
        Region = new System.Drawing.Region(buttonPath);

        base.OnPaintBackground(e);
    }      
}

Имейте в виду, что вам все равно придется делать другие вещи, такие как обрезание текста и т.д. Но это должно вас начать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню