Diskuze: problém s Button a stiskem klávesy
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 16 zpráv z 16.
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Při přidání buttonu dostane focus to tlačítko a ne formulář a ty reaguješ na klávesy na formuláři.
Jasně, chápu. Myslel jsem, že ve vlastnosti formuláře stačí nastavit KeyPreview = true a pak by to mělo odchytávat stisknuté klávesy, i když nemá formulář focus ...
Klávesy odchytávej pomocí
protected override bool ProcessCmdKey
Díky za rady, pořád se v tom plácám ...
Díky za trpělivost
Asi jsem natvrdlý, ale přepínat focus mezi button mi jde, ale přepnout ho
na form1 to nebere - to vůbec tu metodu nenabízí...
Vždyť jsem říkal, že je to vadné. Zkus Activate metodu
Tak chyba bude někde jinde, ani to mi nepomohlo. Asi mám něco blbě - jsem začátečník.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace pristaniGraficke
{
public partial class Form1 : Form
{
double casKonstant = 1000; // milisekundové cykly
private int x = 50;
private int y = 0;
int modulX = 100;
int modulY = 100;
double g = 1.62; //hodnota gravitačního zrychlení
double vyskaH; //h
double rychlostV; //v
double palivoM; //Mp
int tahMotoruT; //Z
double zrychleniA; //a
double doprava;
double doleva;
int hmotnostModulu = 9000; //M
double maxBrzdiciTah = 36000; //R
double vytokovaRachlost = 3000; //Vv
double rekord = 60;
double pokus;
int planeta;
double k; //pomocna konstanta
double l; //pomsocna konstanta
public Form1()
{
InitializeComponent();
resetHodnot();
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.FillRectangle(Brushes.Blue, x, y, modulX, modulY);
e.Graphics.DrawImage(new Bitmap("raketa.png"), x, y, modulX, modulY);
}
private void timer1_Tick(object sender, EventArgs e)
{
label2.Text = tahMotoruT.ToString();
label4.Text = (vyskaH-modulY-33).ToString(); // výpis výšky na obrazovku
label6.Text = (rychlostV*10).ToString();
label7.Text = palivoM.ToString();
if (vyskaH > modulY + 33)
{
zrychleniA = g - k * tahMotoruT / casKonstant;
vyskaH = (vyskaH - rychlostV - (zrychleniA / 2));
rychlostV = rychlostV + zrychleniA;
palivoM = palivoM - l * tahMotoruT * 10;
y = Height - Convert.ToInt16(vyskaH);
x = Convert.ToInt16(x - doleva + doprava);
if (x < 0)
{
x = 0;
doleva = 0;
}
if (x > Width - modulX)
{
x = Width - modulX;
doprava = 0;
}
}
else
{
if (rychlostV*10 < rekord)
{
rekord = rychlostV*10;
label9.Text = "Udělal jsi nový rekord: " + rekord.ToString();
}
label8.Text = "přistál jsi rychlostí: " + (rychlostV*10).ToString();
}
if (palivoM < 0)
{
palivoM = 0;
k = 0;
}
if (doleva > 0)
doleva = doleva - 0.05;
if (doprava > 0)
doprava = doprava - 0.05;
if (tahMotoruT > 0)
{
tahMotoruT = tahMotoruT - 1;
}
Invalidate();
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Up)
if(tahMotoruT<100)
tahMotoruT = tahMotoruT + 30;
if (e.KeyCode == Keys.Down)
if (tahMotoruT > 4)
tahMotoruT = tahMotoruT - 30;
if (e.KeyCode == Keys.Left)
if (x > 10)
doleva = doleva + 2;
if (e.KeyCode == Keys.Right)
if (x < (Width-5))
doprava = doprava + 2;
}
private void resetHodnot()
{
Form1.ActiveForm.Activate();
vyskaH = Height; // počáteční výška se nastaví dle velikosti okna snížená o proužek
rychlostV = 0; //v
palivoM = vyskaH/5; //Mp
tahMotoruT = 0; //Z
zrychleniA = 0; //a
g = 1.62;
x = Convert.ToInt16(Width/2)-modulX/2;
y = 0;
doleva = 0;
doprava = 0;
g = g / casKonstant;
k = maxBrzdiciTah / 100 / hmotnostModulu;
l = maxBrzdiciTah / 100 / (vytokovaRachlost * casKonstant);
label8.Text = "";
label9.Text = "";
}
private void Reset_Click(object sender, EventArgs e)
{
resetHodnot();
}
}
}
Form1.ActiveForm.Activate();
Tohle ti jde? Nahraď to tímto:
this.Activate()
EDIT: Divím se, že to vůbec zkompiluješ. Mělo by ti to vyhodit vyjímku, že odkazuješ na objekt, který nemá instanci.
A co teda chceš? Na co chceš přenést focus? Na ten Form, aby jsi mohl zachytávat ty klávesy, protože když má focus to tlačítko, tak to nejde?
Všiml jsem si toho až teď
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == Keys.Enter)
{
MessageBox.Show("Stisknut byl Enter");
}
return base.ProcessCmdKey(ref msg, keyData);
}
form nemusí mít focus, klávesy jdou příídávat nebo odebírat kontrolou keyData
Zobrazeno 16 zpráv z 16.