Элемент управления TextBox для событий буфера обмена в C#

События буфера обмена

Элемент управления Textbox в C# имеет много полезных событий, указывающих, когда предпринимаются определенные действия. Например, текстовые поля .NET имеют событие, указывающее, когда текст изменялся, или когда пользователь нажал клавишу. Такие события позволяют разработчикам C# создавать ясный код, взаимодействующий с текстовыми полями.

Следуя тем же принципам, мы можем вручную реализовать события, которые будут порождаться действиями буфера обмена, например вырезанием, копированием или вставкой текста в текстовом поле. Изначально в платформе .NET Framework такие события отсутствуют, но их нетрудно реализовать.

Настраиваемый элемент управления Textbox

Чтобы реализовать настраиваемые события, нам необходимо создать собственный пользовательский элемент управления Textbox. Этот пользовательский элемент управления будет наследовать классу Textbox, поскольку нам требуется все поведение Textbox .NET, заданное по умолчанию.

Для создания настраиваемого пользовательского элемента управления нам также нужно переопределить функцию WndProc, которая обрабатывает сообщения, передаваемые в элемент управления. Переопределив эту функцию, мы сможем обнаруживать сообщения, связанные с вырезанием, копированием или вставкой текста, прежде, чем разрешить элементу управления обработать их.

Событие Cut элемента управления Textbox

Обнаружение каждого из сообщений буфера обмена будет таким же. В частности, для сообщения о событии Cut (событии вырезания) нам нужно сравнить идентификатор сообщения с константой WM_CUT:

private const int WM_CUT = 0x0300;

protected override void WndProc(ref Message m)

{

    if (m.Msg == WM_CUT)

    {

        //Cut Event

    }

}

То, как породить событие, мы обсудим ниже. Сейчас же следует обратить внимание на то, как выяснить, какой текст вырезается. Чтобы это событие было полезным, нам нужно предоставить разработчику вырезаемый текст.

Помните, что мы обрабатываем сообщение до его применения. Это означает, что вырезаемый текст еще не находится в буфере обмена. Следовательно, чтобы получить доступ к тексту, который будет вырезан, нам необходимо искать его непосредственно в элементе управления. К счастью, текстовые поля имеют свойство SelectedText, предоставляющее нам значение, которое мы ищем.

Событие Copy элемента управления Textbox

Событие Copy (событие копирования) будет работать почти так же, единственное различие — это константа WM_COPY:

private const int WM_COPY = 0x0301;

protected override void WndProc(ref Message m)

{

    if (m.Msg == WM_COPY)

    {

        //Copy Event

    }

}

Та же концепция применяется и здесь, выделенный текст еще не скопирован, поэтому пока не находится в буфере обмена. Свойство SelectedText предоставит текст, который будет скопирован.

Событие Paste элемента управления Textbox

Аналогично, событие Paste (событие вставки) будет порождаться, когда сопоставляется константа WM_PASTE:

private const int WM_PASTE = 0x0302;

protected override void WndProc(ref Message m)

{

    if (m.Msg == WM_PASTE)

    {

        //Paste Event

    }

}

Однако в данном случае, поскольку текст будет вставляться, он уже существует в буфере обмена. Он пока отсутствует в текстовом поле. Чтобы получить доступ к этому тексту, следует использовать функцию Clipboard.GetText().

Порождение событий

Здесь мы рассмотрим приемы передачи текстовых значений, которые были обнаружены выше (с помощью SelectedText или Clipboard.GetText()), при порождении наших событий вырезания, копирования и вставки.

К счастью для нас, в платформе .NET Framework имеется встроенный класс EventArgs, созданный для этого. По умолчанию класс EventArgs предоставляет основные сведения о порожденном событии. Но создав класс, который наследует EventArgs, мы можем добавить настраиваемые свойства.

Например, в данном случае нам требуется установить текст буфера обмена (который будет в буфере обмена либо уже находится там):

public class ClipboardEventArgs : EventArgs

{

    public string ClipboardText

    {

        get;

        set;

    }

 

    public ClipboardEventArgs(string clipboardText)

    {

        this.ClipboardText = clipboardText;

    }

}

С этим классом можно использовать делегаты для определения и порождения наших событий. Далее приводится краткий пример того, как породить событие вставки в текстовом поле.

public delegate void ClipboardEventHandler(object sender, ClipboardEventArgs e);

public event ClipboardEventHandler PastedText;

 

//Raising the event

if (PastedText != null)

    PastedText(this, new ClipboardEventArgs(Clipboard.GetText()));

Я не углубляюсь в детали, но это прямолинейное определение и вызов события. Если непонятно, что происходит, я советую изучить события .NET.

Заключение

В результате мы получаем настраиваемый элемент управления Textbox, имеющий события, указывающие, когда текст вырезается, копируется или вставляется в текстовое поле. События буфера обмена можно использовать, как любые другие события элемента управления Textbox в C#. Загрузите исходный код по следующей ссылке, чтобы посмотреть, как это все работает вместе.