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

我發現這個片段關閉Windows窗體的esc。我真的想實現這個到每個窗體。我嘗試創建一個從Form繼承的新的抽象類,另一個Windows窗體將從此繼承。但是這種方式不起作用。如何使用每個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 2010-04-29 05:24:36

回答

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 2010-04-29 06:47:12

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

這是不正確的。如果是這種情況,沒有什麼可以抽象的,因爲Object是一個具體的類型。 – Josh 2010-04-29 05:30:07

+0

@Josh:哎呀!你是對的。出於某種原因,我很困惑用* inheritance *創建抽象類的*實例*。我已經放棄了不正確的陳述。謝謝! – 2010-04-29 05:33:59

0

在你想同樣的動作適用於所有形式一般意義上,你可以使用IMessageFilter通過@Josh愛因斯坦的建議。

如果您希望爲多個控件/表單(但不是全部)共享一個事件處理程序,那麼另一種方法是引導它們全部使用相同的事件處理程序方法。

例如,在窗體設計器中,將兩個按鈕添加到窗體(button1,button2)。 現在轉到button1屬性中的OnClick事件處理程序字段,然後雙擊。這會爲您創建一個button1_Click事件處理程序方法。現在轉到按鈕2並在屬性窗口中的Click事件處理程序字段中輸入名稱button1_Click,然後按鈕2現在將共享點擊相同的事件處理程序。

你可以在代碼中做同樣的事情。打開設計器生成的代碼並找到button2的定義。你會看到,它現在有一個結合事件處理程序方法的Click事件:

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

您可以用同樣的方法添加綁定的代碼無論如何,所以你可以多種形式鏈接到同一事件處理程序,例如。

相關問題