2010-04-29 2 views
2
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
     { 
      { 
       if (keyData == Keys.Escape) this.Close(); 
       return base.ProcessCmdKey(ref msg, keyData); 
      } 
     } 

Я обнаружил этот фрагмент, чтобы закрыть окно формы esc. Я действительно хочу реализовать это для каждой формы окна. Я пытаюсь создать новый абстрактный класс, который наследует от формы, и другая форма окна наследует от этого. Но это не работает.Как использовать функцию для каждого C# WinForm вместо вставки

abstract class AbsForm: Form { 
     protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
     { 
      { 
       if (keyData == Keys.Escape) this.Close(); 
       return base.ProcessCmdKey(ref msg, keyData); 
      } 
     } 
    } 
    public partial class HoaDonBanSach : AbsForm 
    { 
     public HoaDonBanSach() 
     { 
      InitializeComponent(); 
     } 

Спасибо за чтение этого :)

+0

Почему «абстрактный» класс? – m0s

ответ

2

Я бы предложил не делать это в форме, но вместо того, чтобы реализовать IMessageFilter и добавить его с помощью приложения .AddMessageFilter. Что-то вроде следующего:

public class CloseWindowBehavior : IMessageFilter { 

    const int WM_KEYDOWN = 0x100; 
    const int VK_ESCAPE = 0x1B; 

    bool IMessageFilter.PreFilterMessage(ref Message m) { 
     if (m.Msg == WM_KEYDOWN && (int)m.WParam == VK_ESCAPE) { 
      if (Form.ActiveForm != null) { 
       Form.ActiveForm.Close(); 
      } 
      return true; 
     } 
     return false; 
    } 

} 

Application.AddMessageFilter(new CloseWindowBehavior()); 
+0

Очень полезно знать этот метод и IMessageFilter. Это очень хорошо для новичков C#, подобных мне. Спасибо – nXqd

0

Если вы хотите использовать дизайнер, вы не можете пометить базовый класс как абстрактный.

Дизайнер будет создавать базовый класс формы, которую вы проектируете, что не может быть сделано с абстрактными классами.

Кроме того, я не думаю, что HoaDonBanSach не наследует вашу реализацию ProcessCmdKey. Кроме вы переопределен в другом файле (HoaDonBanSach частичное все-таки)

3

Попробуйте вместо этого:

class CustomForm : Form 
{ 
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     if (keyData == Keys.Escape) 
     { 
      this.Close(); 
     } 

     return base.ProcessCmdKey(ref msg, keyData); 
    } 
} 

class InheritedForm : CustomForm 
{ 
    // this form now has the functionality from CustomForm 
} 
+0

Это неправда. Если бы это было так, то ничто не могло быть абстрактным, потому что объект является конкретным типом. – Josh

+0

@Josh: Ой! Да ты прав. По какой-то причине я сбивал с толку создание * экземпляра * абстрактного класса с * наследованием *. Я отклонил неверный оператор. Благодаря! –

0

В общем смысле, где вы хотите применить те же действия, чтобы все формы, вы можете использовать IMessageFilter как предложено @Josh Эйнштейна.

Если вы хотите поделиться одним обработчиком событий для нескольких элементов управления/форм (но не всех), тогда другой подход - направить их всех на использование одного и того же метода обработчика событий.

Например, в конструкторе форм добавьте две кнопки в форму (button1, button2). Теперь перейдите в поле обработчика событий OnClick в свойствах кнопки button1 и дважды щелкните. Это создает для вас метод обработчика событий button1_Click. Теперь перейдите к кнопке 2 и в поле обработчика события Click в окне свойств введите имя button1_Click, и кнопка 2 теперь будет поделиться тем же обработчиком событий для своих кликов.

Вы можете сделать то же самое в коде. Откройте созданный конструктором код и найдите определение кнопки2. Вы увидите, что теперь он имеет привязку к замковому события для метода обработчика событий:

this.button2.Click += new System.EventHandler(this.button1_Click); 

Вы можете добавить привязки в качестве кода для любого события, точно так же, так что вы можете связать несколько форм, к тому же обработчик событий, например.

Смежные вопросы