Событие блокировки вставки в элементе управления DomainUpDown - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь создать собственный DomainUpDown.Мне нужно заблокировать событие Вставить.

Я попытался переопределить WndProc элемента управления, который отлично работает в MaskedTextBox, но здесь он не работает.

protected override void WndProc(ref Message m)
{
    if (m.Msg == 0x302)  //PasteEvent
    {
        //base.WndProc(ref m);
    }
    else
    {
        base.WndProc(ref m);
    }
}

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Используя NativeWindow, вы можете обрабатывать сообщения внутреннего TextBox, который используется в DomainUpDown и NumericUpDown элементах управления.

В следующем коде я обработал WM_PASTE методи только что подал звуковой сигнал в ответ:

using System;
using System.Windows.Forms;
public class MyDomainUpDown : DomainUpDown
{
    MyWindoHelper wh;
    protected override void OnHandleCreated(EventArgs e)
    {
        base.OnHandleCreated(e);
        wh = new MyWindoHelper(Controls[1]);
    }
    protected override void Dispose(bool disposing)
    {
        if (wh != null)
            wh.DestroyHandle();
        base.Dispose(disposing);
    }
    class MyWindoHelper : NativeWindow
    {
        Control c; //For future reference if needed.
        public MyWindoHelper(Control control)
        {
            c = control;
            this.AssignHandle(c.Handle);
        }
        protected override void WndProc(ref Message m)
        {
            if (m.Msg != 0x0302 /*WM_PASTE*/)
                base.WndProc(ref m);
            else
                System.Media.SystemSounds.Beep.Play();
        }
    }
}

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

0 голосов
/ 28 января 2019

Обычно вы можете установить дескриптор элемента управления, ссылку Message.hWnd на IntPtr.Zero: сообщение не будет доставлено.

Это не относится к элементу управления DomainUpDown: он не получает сообщение WM_PASTE, только WM_COMMAND.Установка ссылки дескриптора на IntPtr.Zero бесполезна, элемент управления, обрабатывающий сообщения, является дочерним UpDownEdit элементом управления (TextBox производное).

Возможное решение:
Отключить Control-V, Shift-Insert и ContextMenu при нажатии правой кнопки мыши:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{
    if ((keyData == (Keys.Control | Keys.V)) || (keyData == (Keys.Shift | Keys.Insert))) {
        return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

ContextMenu emptyMenu = new ContextMenu();

protected override void OnMouseDown(MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right) {
        this.ContextMenu = emptyMenu;
        return;
    }
    base.OnMouseDown(e);
}

protected override void Dispose(bool disposing)
{
    if (disposing && this.emptyMenu != null) {
        this.emptyMenu.Dispose();
    }
    base.Dispose(disposing);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...