Как сохранить шрифт в унаследованном TextBox? - PullRequest
3 голосов
/ 03 августа 2009

Я использую следующий код, чтобы получить TextBox, который не рисует свои границы:

public partial class CustomTextBox : TextBox
{
    public CustomTextBox()
    {
        InitializeComponent();
        SetStyle(ControlStyles.UserPaint, true);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        int borderWidth = 1;

        ControlPaint.DrawBorder(e.Graphics, e.ClipRectangle,
            Color.Transparent, borderWidth, ButtonBorderStyle.Solid,
            Color.Transparent, borderWidth, ButtonBorderStyle.Solid,
            Color.Transparent, borderWidth, ButtonBorderStyle.Solid,
            Color.Transparent, borderWidth, ButtonBorderStyle.Solid);
    }
}

Кажется, что-то пропущено внутри OnPaint (), потому что мой шрифт больше не является шрифтом по умолчанию для textBox (возможно, мне придется переопределить другое событие).

При проверке свойства CustomTextBox.Font отображается стандартное «Microsoft SansSerif in 8,25», но при вводе текста в мой textBox шрифт определенно выглядит больше и жирнее.

Надеюсь, вы можете мне помочь!

С уважением,

Inno

[EDIT]

Я должен упомянуть, что если я не переопределю OnPaint, шрифт моего CustomTextBox будет правильным. Только при переопределении OnPaint мой шрифт неверен (при наборе текста шрифт больше и кажется жирным). Поэтому я думаю, что мне нужно что-то сделать, чтобы правильно инициализировать шрифт внутри OnPaint (но я не знаю, как это сделать в банкомате).

Ответы [ 4 ]

5 голосов
/ 01 февраля 2012

Не вызывайте SetStyle, если дескриптор для текстового поля еще не создан, и он никогда не изменится на этот шрифт 'big bold':

if (IsHandleCreated)
{
     SetStyle(ControlStyles.UserPaint, true);
}
2 голосов
/ 03 августа 2009

Если вы явно не установите шрифт TextBox, он получает свой шрифт от своего родителя и предков, поэтому, если TextBox находится на Panel, он получает свой шрифт из этой Panel или из родительской формы.

2 голосов
/ 03 августа 2009

Два варианта для вас, чтобы посмотреть на ... В моем базовом классе я использую определение шрифта только для чтения ... аналогично для других элементов управления, поэтому другие разработчики с классом не могут его изменить --- PERIOD.

[ReadOnly(true)]
public override Font Font
{
    get
    {
        return new Font("Courier New", 12F, FontStyle.Regular, GraphicsUnit.Point);
    }
}

Второй вариант, который я на самом деле не использовал, это во время сериализации формы. Я не могу взять кредит, и не помню, где я нашел в другом месте на этом форуме, но также может помочь. По-видимому, скрывая видимость сериализации, он НЕ УСТАВЛЯЕТ свойство каждого отдельного элемента управления (в данном случае применимо к вашему шрифту) [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

НТН

0 голосов
/ 28 июня 2011

Использование SetStyle в текстовом поле всегда испортит картину, согласно этому ответу .

Однако ... есть ли причина, по которой вы не можете просто установить BorderStyle на None?

Если вам нужно, вы можете даже изменить BorderStyle так, чтобы его значение по умолчанию было None, например:

using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace MyControls
{
  // Apply ToolboxBitmap attribute here
  public class CustomTextBox : TextBox
  {
    public CustomTextBox()
    {
      BorderStyle = BorderStyle.None;
    }

    [DefaultValue(typeof(System.Windows.Forms.BorderStyle),"None")]
    public new BorderStyle BorderStyle
    {
      get { return base.BorderStyle; }
      set { base.BorderStyle = value; }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...