2016-02-05 2 views
0

Я новичок в C# и пытаюсь сделать событие клавиатуры. Он должен отображаться при нажатии клавиш W, A, S или D. Сначала мой план состоял в том, чтобы показать некоторый pictureBox и просто изменить изображение, если нажаты правые клавиши.C# клавиатура обработчик события прямоугольник

Но я искал в интернете нашел в нечто подобное в Java http://docs.oracle.com/javase/8/javafx/sample-apps/KeyboardExample.zip и это выглядит следующим образом: enter image description here

Как я могу понять код рисует прямоугольник с некоторой буквы в нем. Я посмотрел msdn и нашел пример для рисования прямоугольника: https://msdn.microsoft.com/de-de/library/sx8yykw8(v=vs.110).aspx

К сожалению, я зациклен на чертеже. Обычно я использую панель инструментов для добавления вещей в форму. Затем я дважды щелкните его и напишу свой код внутри фигурных скобок. Но в панели инструментов нет «Прямоугольника», поэтому я не уверен, как его добавить.

Это мой код до сих пор:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     //Stay always on top 
     this.TopMost = true; 
     //Does not work. Removes border but you can't move the window after this 
     this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     //Can I delete this?    
    } 

    private void Form1_KeyPress(object sender, KeyPressEventArgs e) 
    { 
     if (e.KeyChar >= 65 && e.KeyChar <= 122) 
     { 
      switch (e.KeyChar) 
      { 
       //If pressed w or W 
       case (char)119: 
       case (char)87: 
        Console.WriteLine(e.KeyChar); 
        break; 
       //If pressed a or A 
       case (char)97: 
       case (char)65: 
        Console.WriteLine(e.KeyChar); 
        break; 
       //If pressed s or S 
       case (char)83: 
       case (char)115: 
        Console.WriteLine(e.KeyChar); 
        break; 
       //If pressed d or D 
       case (char)100: 
       case (char)68: 
        Console.WriteLine(e.KeyChar); 
        break; 
       //Other keys 
       default: 
        lblMessage.Text = "Key not supported"; 
        //does not work 
        //timer1_Tick(); 
        break; 
      } 
     } 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     lblMessage.Hide(); 
    } 
} 

А вот как моя форма выглядит сейчас:

enter image description here

Другие вещи я прилипаемость в данный момент:

  • Как я могу вызвать таймер из Form1_KeyPress, чтобы скрыть lblMessage после s ome секунд?

  • Удалить границу без потери возможности переместить окно (например, с this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;, например)

EDIT: Я изменил код новейшего рабочего состояния.

ответ

3

Добро пожаловать в мир настольных ПК для Windows!

У вас здесь есть два выбора; Вы можете:

  1. Добавление компонентов в виде WASD с помощью Design View (и поскольку у вас есть W, A, S, D коробки там, похоже, вы уже добавили их в) и в вашем Form1_KeyPress(), просто обновите свойства полей. Это может быть столь же простым, как и ниже, просто убедитесь, что изменить его на правильное имя компонента:

    //If pressed w or W 
    case (char)119: 
    case (char)87: 
         Console.WriteLine(e.KeyChar); 
         button1.BackColor = Color.Red;//Highlight W 
         button2.BackColor = Color.Empty;//Ignore A 
         button3.BackColor = Color.Empty;//Ignore S 
         button3.BackColor = Color.Empty;//Ignore D 
         break; 
    
  2. Override обработчик форме в OnDraw() и рисовать коробки прямо на экране. Это сложнее, но дает вам гораздо больше энергии.

Отключить ярлык легко.В вашем Form1_Load (обработчик) убедитесь, что установить свойство тайм-аута TIMER1 в:

private void Form1_Load(object sender, EventArgs e) 
{ 
    timer1.Interval = 5000;//In ms = thousandths-of-a-second 
} 

Включите таймер на в Form1_KeyPress() обработчик:

private void Form1_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    ... 
    lblMessage.Enabled = true; 
    timer1.Start(); 
} 

Сделайте свою работу и выключить таймер в Timer1_Tick() обработчик:

private void timer1_Tick(object sender, EventArgs e) 
{ 
    lblMessage.Enabled = false; 
    timer1.Stop(); 
} 
+0

Я пытался изменить цвет с 'pictureBox1.BackColor = Color.Red;', но он не работает. Я думаю, это потому, что это всего лишь фотография, которую я импортировал с помощью графического ящика? – user3772108

+0

Также как работает второй вариант? Что вы имеете в виду с большей силой? Будет ли он лучше кодироваться, чем с картинкой? – user3772108

+1

Спасибо за помощь с таймером. Теперь это выглядит просто. :) – user3772108

2

Вот что я быстро собрать:

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 WASD_Keyboard 
{ 
    public partial class Form1 : Form 
    { 
     private PictureBox pictureBox1 = new PictureBox(); 
     private bool wPressed = false; 
     private bool aPressed = false; 
     private bool sPressed = false; 
     private bool dPressed = false; 
     private Timer timer = new Timer(); 

     public Form1() 
     { 
      InitializeComponent(); 
      //Stay always on top 
      this.TopMost = true; 
      //Does not work. Removes border but you can't move the window after this 
      this.FormBorderStyle = FormBorderStyle.None; 

      timer.Interval = 3000; 
      //this is an event binding 
      timer.Tick += timer1_Tick; 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      // Dock the PictureBox to the form and set its background to white. 
      pictureBox1.Dock = DockStyle.Fill; 
      pictureBox1.BackColor = Color.White; 
      pictureBox1.Paint += DrawRectangleRectangle; 
      // Add the PictureBox control to the Form. 
      this.Controls.Add(pictureBox1); 
     } 

     private void Form1_KeyPress(object sender, KeyPressEventArgs e) 
     { 
      // reversed logic to stop nesting 
      if (e.KeyChar < 65 || e.KeyChar > 122) return; 

      wPressed = false; 
      aPressed = false; 
      sPressed = false; 
      dPressed = false; 
      //this should really be multiple if statement so it can do more than one key 
      //If pressed w or W 
      if (e.KeyChar == (char) 119 || e.KeyChar == (char) 87) { 
       wPressed = true; 
       Console.WriteLine(e.KeyChar); 
      } 

      //If pressed a or A 
      if (e.KeyChar == (char) 97 || e.KeyChar == (char) 65) { 
       aPressed = true; 
       Console.WriteLine(e.KeyChar); 
      } 

      //If pressed s or S 
      if (e.KeyChar == (char) 83 || e.KeyChar == (char) 115) { 
       sPressed = true; 
       Console.WriteLine(e.KeyChar); 
      } 

      //If pressed d or D 
      if (e.KeyChar == (char) 100 || e.KeyChar == (char) 68) { 
       dPressed = true; 
       Console.WriteLine(e.KeyChar); 
      } 

      if (!wPressed && !aPressed && !sPressed && !dPressed) { 
       //Something goes wrong 
       lblMessage.Text = "Key not supported"; 
       return; 
      } 

      pictureBox1.Refresh(); 
      // in older .net if you didn't do both you ran into multiple issues 
      timer.Enabled = true; 
      timer.Start(); 
     } 

     public void DrawRectangleRectangle(object sender, PaintEventArgs e) 
     { 
      DrawRectangle(e, new Point(40, 10), new Size(20, 20), 'W', wPressed ? Color.Red : Color.White); 
      DrawRectangle(e, new Point(10, 40), new Size(20, 20), 'A', aPressed ? Color.Red : Color.White); 
      DrawRectangle(e, new Point(40, 40), new Size(20, 20), 'S', sPressed ? Color.Red : Color.White); 
      DrawRectangle(e, new Point(70, 40), new Size(20, 20), 'D', dPressed ? Color.Red : Color.White); 
     } 

     public void DrawRectangle(PaintEventArgs e, Point p, Size s, char letter, Color c) 
     { 
      // Create pen. 
      var blackPen = new Pen(Color.Black, 3); 
      var brush = new SolidBrush(c); 
      // Create rectangle. 
      var rect = new Rectangle(p, s); 

      // Draw rectangle to screen. 
      e.Graphics.DrawRectangle(blackPen, rect); 
      e.Graphics.FillRectangle(brush, rect); 
      e.Graphics.DrawString(letter.ToString(), new Font(FontFamily.GenericSerif, 12), Brushes.Blue, rect); 
     } 

     private void timer1_Tick(object sender, EventArgs e) 
     { 
      wPressed = false; 
      aPressed = false; 
      sPressed = false; 
      dPressed = false; 

      timer.Enabled = false; 
      timer.Stop(); 
      pictureBox1.Refresh(); 
     } 
    } 
} 

Примечание: Это очень асинхронное, но не использует блокировку ...

+0

Спасибо за код, я проверю его. :) – user3772108

+0

Что это за 'timer.Tick + = timer1_Tick;' делать? Я знаю только '+ =' означает 'var = var + a;' – user3772108

+0

Не 'timer.Enabled = false;' и 'timer.Stop();' то же самое делать? – user3772108

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