2017-06-01 114 views
0

我正在嘗試編寫一個簡單的遊戲,但我在代碼中發現了一個問題。 每次我想改變一個物體的位置時,它只會聚焦面板下方的按鈕,而不是實際移動物體,所以每次我想移動物體時都必須禁用這些按鈕,這是我的一種方式真的不想用,所以我想問你,我該如何解決這個問題和運動? 我想讓對象移動,而不是按鈕來對焦。C#如何防止按鈕被箭頭聚焦?

代碼:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace Míček 
{ 
    public partial class Micek : Form 
    { 
     Random generujPozici = new Random(); 
     int body; int vyskaKroku = 30; int sirkaMice = 40; int poziceMice = 0; 
     int x1 = (450/2) - (40/2); int x2 = (450/2) - (120/2) ; 
     int y1 = 20; int y2 = 302; 

     public Micek() 
     { 
      InitializeComponent(); 
      TlacStop.Enabled = false; 
      KeyDown += new KeyEventHandler(stikniTlacitko); 
     } 

     private void panel1_Paint(object sender, PaintEventArgs e) 
     { 
      Graphics KP = e.Graphics; 
      Pen Pero = new Pen(Color.Black, 5); 

      KP.FillEllipse(Brushes.Red, x1, y1, sirkaMice, sirkaMice); 
      KP.DrawRectangle(Pero, x2, y2, 120, 1); 
     } 

     private void Stopky_Tick(object sender, EventArgs e) 
     { 
      y1 += vyskaKroku; 
      poziceMice = generujPozici.Next(0, 450 - sirkaMice); 

      if (y1 + vyskaKroku > y2 && x1 + sirkaMice > x2 && x1 - sirkaMice < x2 + (120 - sirkaMice)) 
      { 
       body++; 
       x1 = poziceMice; 
       y1 = 20; 
      } 
      else 
      { 
       if(y1 > y2) 
       { 
        x1 = poziceMice; 
        y1 = 20; 
        body = 0; 
       } 
      } 

      pocitadloBody.Text = body.ToString(); 
      Refresh(); 
     } 

     private void TlacStart_Click(object sender, EventArgs e) 
     { 
      Stopky.Enabled = true; 
      TlacStart.Enabled = false; 
      if(TlacStop.Enabled == false) 
      { 
       TlacStop.Enabled = true; 
      } 
     } 

     private void TlacStop_Click(object sender, EventArgs e) 
     { 
      Stopky.Enabled = false; 
      TlacStart.Enabled = true; 
      TlacStop.Enabled = false; 
      x1 = (450/2) - (40/2); 
      y1 = 20; 
      body = 0; 
      Refresh(); 
     } 

     void stikniTlacitko(object sender, KeyEventArgs e) 
     { 
      switch (e.KeyCode) 
      { 
       case Keys.Right: 
        if(x2 < 330) 
        { 
         x2 += 10; 
         Refresh(); 
        } 
       break; 

       case Keys.Left: 
        if (x2 > 0) 
        { 
         x2 -= 10; 
         Refresh(); 
        } 
       break; 
      } 
     } 
    } 
} 
+0

是否有必要重現此問題的所有代碼? –

+0

https://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.isinputkey(v=vs.110).aspx它是虛擬的,覆蓋它。 –

回答

0

嘗試以下步驟:

  1. 設置窗體屬性的KeyPreview爲True。
  2. 按照Win Coder中所示覆蓋ProcessCmdKey方法。