2012-01-15 7 views
1

私はWASDキーを使用してキャラクターを制御しているC#の学校用の簡単なゲームを作成しています。文字はスプライトシートから取り出され、イメージリストに入れられます。イメージリストはピクチャボックスにあります。フォームを入力するときのフォーカス画像ボックス

フォーム内のピクチャボックスだけの場合はすべてうまく動作しますが、ボタンなどを追加するとフォーカスが失われるようです。それは応答しません。

私は、フォームが開いたときにピクチャボックスに焦点を当てるソリューションを探していましたが、動作するものは見つかりませんでした。

私は本当にいくつかの助けに感謝します。

編集:それはWinFormsです。

+0

このWinFormsはありますか? – ChrisF

+0

はいです。私はそれを書くのを忘れた。 – Antmoritz

答えて

2

PictureBoxはフォーカスを取得できません。イメージを表示する方法として意図されていますが、キーボードなどのユーザー入力を許可することは意図していません。

フォームのOnKeyDownイベントをインターセプトして、関心のあるキーをテストするのが賢明です。これは、Buttonなどのフォーカスを持つコントロールがそれらのキー自体を処理したくない限り機能します。

より良いアプローチは、フォームのProcessCmdKey()メソッドをオーバーライドすることです。このメソッドは、Buttonなどのターゲットコントロールで呼び出され、キーが特殊であるかどうかを判断します。 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

+0

これを無効にする方法はありませんか?どのように私は私のキャラクターを動かすべきですか? – Antmoritz

+2

フォームのProcessCmdKey()メソッドをオーバーライドして回答してください。 –

関連する問題