2012-05-17 7 views
2

У меня есть кнопка отмены в моей форме. Я хочу определить внутри метода WndProc, который нажата кнопка Cancel, и напишите для этого код. Это абсолютно необходимо, потому что в противном случае я не могу отменить все другие проверки проверки, которые еще не выполнены.Захват сообщения WndProc определенной кнопки

Пожалуйста, помогите.

.NET - 2,0, WinForms

+0

C# или VB? Кроме того, знаете ли вы во время выполнения, когда кнопка находится в форме? –

+0

Ну, конечно, это не совсем необходимо, и переопределение метода WndProc() формы, безусловно, не приведет вас никуда. Рассмотрите возможность установки свойства CausesValidation кнопки на False и с помощью события FormClosing формы, чтобы вернуть e.Cancel в значение false. –

+0

@ C.Barlow Любой бы сделал. Да, он находится на фиксированной позиции в моей форме. –

ответ

5

Это, как можно разобрать сообщение WndProc для левой кнопкой мыши на дочерний элемент управления:

protected override void WndProc(ref Message m) 
{ 
    // http://msdn.microsoft.com/en-us/library/windows/desktop/hh454920(v=vs.85).aspx 
    // 0x210 is WM_PARENTNOTIFY 
    // 513 is WM_LBUTTONCLICK 
    if (m.Msg == 0x210 && m.WParam.ToInt32() == 513) 
    { 
     var x = (int)(m.LParam.ToInt32() & 0xFFFF); 
     var y = (int)(m.LParam.ToInt32() >> 16); 

     var childControl = this.GetChildAtPoint(new Point(x, y)); 
     if (childControl == cancelButton) 
     { 
      // ... 
     } 
    } 
    base.WndProc(ref m); 
} 

BTW: это 32-битный код.

+0

Будут ли существенные изменения для 64 бит? –

+0

IntPtr будет 64 бит при компиляции для .NET 64 бит. Насколько я знаю, это могло бы по-прежнему работать, но я не тестировал его. BTW: Я исправил ошибку в коде (заменил 0xFF на 0xFFFF) –

+0

Это абсолютно работает в обычном компоненте Windows, но при использовании DevExpress есть элемент управления, называемый LayoutControl, чей дочерний элемент управления является этой кнопкой. Поэтому, когда щелчок дочернего элемента управления всегда возвращает LayoutControl вместо кнопки. Любые идеи о том, как обойти это? –

3

И если есть элементы управления, которые прошли проверку, то CauseValidation не помогает

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

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
     textBox1.Validating += new CancelEventHandler(textBox1_Validating); 
     button1.Click += new EventHandler(button1_Click); 
     button1.CausesValidation = false; 
     this.FormClosing += new FormClosingEventHandler(Form1_FormClosing); 
    } 

    private void textBox1_Validating(object sender, CancelEventArgs e) { 
     // Always fail validation 
     e.Cancel = true; 
    } 
    void button1_Click(object sender, EventArgs e) { 
     // Your Cancel button 
     textBox1.Text = string.Empty; 
    } 
    void Form1_FormClosing(object sender, FormClosingEventArgs e) { 
     // Allow the form to close even though validation failed 
     e.Cancel = false; 
    } 
} 
+0

Ну, я использую компоненты DevExpress, и я могу точно сказать, что в этом он не работает. Если вы можете показать мне, как использовать 'WndProc', чтобы сделать то же самое, это было бы очень полезно. –

+1

Я не могу с этим поделать, обратитесь в службу поддержки DevExpress. –

+0

Простой пример 'WndProc' будет делать, как узнать, какое сообщение возникло из этой кнопки. –