Я должен переосмыслить/воссоздать Элемент управления "метка" с нуля для добавления моего собственного mojoness к нему. Да, я знаю то, что Вы думаете (и если Вы не думаете, что, разве не должны быть?).
Кто-то может указать на меня в правильном направлении?
Спасибо.
Целая цель для воссоздания маркировки состоит в том, что я хочу полный контроль над тем, как это оттянуто на экран, и так, чтобы у меня могли быть Обработчики событий KeyDown для него, также. Например, пользователь может отредактировать содержание маркировки тем же путем, они отредактировали бы контент управления TextBox.
Кроме того, я не могу просто использовать управление TextBox, поскольку оно потребовало бы почти, если не больше работа получать мой желаемый результат.
Создать собственный элемент управления меткой достаточно просто, вам просто нужно начать с Control и переопределить OnPaint ().То, что будет байтовым, - это превратить его в элемент управления, который также имеет поведение фокусировки. И позволяет пользователю редактировать текст. К тому времени, как вы закончите, вы заново изобрели элемент управления TextBox. Что намного сложнее, чем кажется.
Сосредоточьтесь в первую очередь на фокусировке, это самая сложная проблема. Маловероятно, что пользователь захочет часто фокусировать элемент управления. Может какое-то секретное рукопожатие, вроде двойного щелчка. Когда вы его обнаружите, вы можете создать элемент управления TextBox и поместить его перед меткой. И удалите его, когда он потеряет фокус, обновив свойство Text метки. Или простое контекстное меню, в котором отображается небольшой диалог редактирования.
Пример, в котором для редактирования используется метод двойного щелчка:
using System;
using System.Windows.Forms;
class MyLabel : Label {
private TextBox mEditor;
protected override void OnDoubleClick(EventArgs e) {
if (mEditor == null) {
mEditor = new TextBox();
mEditor.Location = this.Location;
mEditor.Width = this.Width;
mEditor.Font = this.Font;
mEditor.Text = this.Text;
mEditor.SelectionLength = this.Text.Length;
mEditor.Leave += new EventHandler(mEditor_Leave);
this.Parent.Controls.Add(mEditor);
this.Parent.Controls.SetChildIndex(mEditor, 0);
mEditor.Focus();
}
base.OnDoubleClick(e);
}
void mEditor_Leave(object sender, EventArgs e) {
this.Text = mEditor.Text;
mEditor.Dispose();
mEditor = null;
}
protected override void Dispose(bool disposing) {
if (disposing && mEditor != null) mEditor.Dispose();
base.Dispose(disposing);
}
}
Создайте класс, унаследованный от Control. Используйте вызов SetStyle (), чтобы включить рисование пользователем и двойную буферизацию, а также переопределить OnPaint () и любые другие методы, которые вам нужны.
class MyLabel : System.Windows.Forms.Control
{
public MyLabel()
{
this.SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
}
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
base.OnPaint(e);
ControlPaint.DrawBorder3D( e.Graphics, this.ClientRectangle, Border3DStyle.Etched, Border3DSide.All);
e.Graphics.DrawString(this.Text, this.Font, Brushes.Red, 0, 0);
}
}
public class MyLabel : System.Windows.Forms.Label
{
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
base.OnPaint(e);
// or leave base out
// you would determine these values by the length of the text
e.Graphics.DrawEllipse(new System.Drawing.Pen(System.Drawing.Color.Red),
0, 0, 50, 12);
}
protected override void OnKeyDown(System.Windows.Forms.KeyEventArgs e)
{
base.OnKeyDown(e);
// although a label has a KeyDown event I don't know how it would
// receive focus, maybe you should create a text box that looks
// like a label
}
}
Как насчет этого?
Почему бы просто не расширить текущий?
class MyMojoLabel: Label // Что-то вроде
Хорошей отправной точкой может быть понимание того, как Microsoft реализовала этикетку.
Чтобы получить более подробное представление, вам следует взглянуть с помощью Reflector в класс или отладить исходный код элемента управления Label.