2012-01-15 46 views
1

我正在用C#創建一個簡單的學校遊戲,我使用WASD鍵控制一個角色。該角色從精靈表中獲取並放入圖像列表中。圖像列表位於圖片框中。當輸入表格時對焦picturebox

一切正常,當它只是在窗體中的圖片框,但是當我添加一個按鈕或其他東西,它就像失去了焦點。它沒有迴應。

我已經搜索無盡的頁面解決方案,當窗體打開時將焦點設置在圖片框上,但是我還沒有找到任何可行的方法。

我真的很感謝一些幫助。

編輯:這是WinForms。

+0

這是WinForms? – ChrisF 2012-01-15 23:00:03

+0

是的。我忘了寫它。 – Antmoritz 2012-01-15 23:01:56

回答

2

PictureBox無法獲得焦點。它的目的是作爲一種顯示圖像的方式,但不打算允許用戶輸入,例如通過鍵盤。

一種粗糙的方法是在窗體本身上截獲OnKeyDown事件,然後測試感興趣的鍵。只要擁有焦點的控件(例如Button)不想自己處理這些密鑰,就會工作。

更好的方法是覆蓋Form的ProcessCmdKey()方法。在目標控件上調用此方法(如Button),以確定該按鍵是否特殊。如果按鈕不能識別它是特殊的,那麼它會調用父控件。通過這種方式,每個按鍵都會調用表單級別的方法,而不是實際目標的特殊鍵。這允許按鈕仍然處理用於按下按鈕的ENTER鍵,但其他按鍵將由您的窗體處理。

最後,在窗體上的任何控件處理它們之前攔截所有的鍵,您將需要實現IMessageFilter接口。像這樣...

public partial class MyWindow : Form, IMessageFilter 
{ 
    public MyWindow() 
    { 
     InitializeComponent(); 
     Application.AddMessageFilter(this); 
    } 

    public bool PreFilterMessage(ref Message m) 
    { 
     // WM_KEYDOWN 
     if (m.Msg == 0x0100) 
     { 
      // Extract the keys being pressed 
      Keys keys = ((Keys)((int)m.WParam.ToInt64())); 

      // Test for the A key.... 
      if (keys == Keys.A) 
      { 
       return true; // Prevent message reaching destination 
      } 
     } 
    } 

    return false; 
} 
+0

但是必須有一些方法來解決這個問題? – Antmoritz 2012-01-15 23:00:45

+0

是否有任何方法可以覆蓋它?我還應該如何移動我的角色? – Antmoritz 2012-01-15 23:03:22

+2

提到覆蓋表單的ProcessCmdKey()方法來作出答案。 – 2012-01-15 23:08:15

相關問題