Tastendruck als Ereignis C#

Basti18

Grünschnabel
Guten Tag,

Mein Problem ist folgendes:
Ich möchte ein Rechteck horizontal in einer Picturebox bewegen, was auch gut mit 2 Buttons funktioniert. Hier die Methode eines Buttons:

Code:
void BtnLinksClick(object sender, EventArgs e)
{
	for(int i=0;i<10;i++){
		Reck.löschen(Gra);
		Reck.XKoo-=2;
		Reck.zeichnen(Gra);
        	System.Threading.Thread.Sleep(7);
	}
}

Nun möchte ich das Rechteck aber nicht auf Buttondruck, sondern auf Tastendruck bewegen, also den code auf eine bestimmte Taste legen. (sofern das geht)

Weiß jemand wie man sowas machen kann?

Danke schon im Voraus, Basti
 
Hi Basti18,

dafür gibt es Events am Form selbst:
Code:
private void InstallKeyboardListeners()
{
    KeyDown += new KeyEventHandler(Form1_KeyDown);
}

void Form1_KeyDown(object sender, KeyEventArgs e) { ... }

Gra ist nicht zufällig ein Graphics-Objekt?
Warum wird da 7ms gewartet? EDIT: Verstehe, Animation also...
 
Zuletzt bearbeitet:
Hallo Kabel2

Ja, Gra ist ein Objekt vom Typ Graphics.

Was mach ich dann mit der Methode InstallKeyboardListeners()?
Bin noch nicht so der Experte. ;-)

Falls es hilft hier der ganze Quellcode:

Code:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace test_tastendruck
{

	public partial class MainForm : Form
	{
		public MainForm()
		{
			InitializeComponent();			
		}
		
		Graphics Gra;
		Rechteck Reck;
		
		
		void MainFormLoad(object sender, EventArgs e)
		{
			Gra = pictureBox1.CreateGraphics();
			Reck = new Rechteck(150,150,20,5);
			Reck.zeichnen(Gra);			
		}
		
		void InstallKeyboardListeners()
		{
			KeyDown += new KeyEventHandler(Form1_KeyDown);
		}
		
		void Form1_KeyDown(object sender, KeyEventArgs e)
		{
			if(e.KeyCode == Keys.A){
				for(int i=0;i<10;i++){
					Reck.löschen(Gra);
					Reck.XKoo-=2;
					Reck.zeichnen(Gra);
					System.Threading.Thread.Sleep(7);
				}				
			}
		}
		//Button um Rechteck nach links zu bewegen
		void BtnLinksClick(object sender, EventArgs e)
		{
			for(int i=0;i<10;i++){
				Reck.löschen(Gra);
				Reck.XKoo-=2;
				Reck.zeichnen(Gra);
				System.Threading.Thread.Sleep(7);
			}		
		}	
		//Button um Rechteck nach rechts zu bewegen
		void BtnRechtsClick(object sender, EventArgs e)
		{
			for(int i=0;i<10;i++){
				Reck.löschen(Gra);
				Reck.XKoo+=2;
				Reck.zeichnen(Gra);
				System.Threading.Thread.Sleep(7);
			}
		}
	}
}

public class Rechteck
{
	int xKoo;
	
	public int XKoo{
		set{
			if((value)>5){
				if((value+Breite)<295){
					this.xKoo = value;			
				}
			}
					
		}
		get{
			return xKoo;
		}
	}
	
	public int YKoo;
	
	public int Höhe;
	
	public int Breite;
	
	public Rechteck(){}
	
	public Rechteck(int x, int y, int b, int h)
	{
		this.XKoo = x;
		this.YKoo = y;
		this.Breite = b;
		this.Höhe = h;
	}
	
	public void zeichnen(Graphics gra)
	{
		gra.DrawRectangle(new Pen(Color.Black),XKoo,YKoo,Breite,Höhe);
	}
	
	public void löschen(Graphics gra)
	{
		gra.DrawRectangle(new Pen(Color.White),XKoo,YKoo,Breite,Höhe);
	}
}
 
Du solltest die Methode dann irgendwann noch aufrufen ;)
Am besten nach dem #InitializeComponent() im Konstruktor.
Das Keys enum enhält übrigens die Konstanten LEFT, RIGHT, UP, DOWN, die der Code abfragen kann.
Einfach mal nen Breakpoint reinsetzen.
 
Vielen Dank Kabel2

Es funktioniert fast einwandfrei, nur wenn ich die taste gedrückt halte, macht das Rechteck erst eine Bewegung, dann Pause, dann setzt es die Bewegung fort ohne eine weitere Pause.
Kennt da vllt. jemand Abhilfe?
 
Da wäre natürlich der KeyPress event besser passend. KeyPress wird allerdings nur gefeuert, wenn der gepresste Key auch printable ist, und das sind die Pfeiltasten nicht.
Da müssstest Du dann noch IsInputKey überfahren.

Oder der Code überfährt halt noch KeyUp und merkt sich noch mit einem bool Feld, dass zwischen zwei KeyDown ein KeyUp kam.

Ich hab dann noch was von einem typing delay gelesen, mal weiterforschen... ;-)
 
Ich hab's jetzt mal mit KeyPress versucht (testweise mit 'a' und 's') und die Verzögerung ist die gleiche.

Falls jemand noch eine Idee hat bitte posten! ;)
 
Hi,

Bei KeyDown eine Variable auf True setzten, bei KeyUp auf False.
Dann einen Timer machen und wenn True das verschieben.

Ich hoffe das war verständlich.

Gruß
x y z
 
Zuletzt bearbeitet:
Hmm, ich hätte jetzt schon erwartet dass KeyPress nur einmal gefeuert wird wenn man den Key gedrückt hält. Hmm.
Tja, dann halt net.
 
Zurück