Událost KeyDown   otázka

VB.NET, WinForms

Dobrý den,

mám menší problém se událostí KeyDown. Mám pictureBox, na kterém chci posouvat s obrázkem, a to přes timer. Timer zapnu pomocí tlačítka. Problém je, že nenastavá událost KeyDown, ale jenom se střídá focus na tlačítkách. KeyPreview mám samozřejmě nastaveno na true (to už se tu řešilo několikrát). Když jsem ale zkusil tlačítka smazat a časovač jsem nechal od počátku zapnutý, vše běželo jak má. Dokáže mi někdo pomoct?

Tady je kód:

Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
        If e.KeyCode = Keys.Up Then
            pohyb = 1
        End If
        If e.KeyCode = Keys.Down Then
            pohyb = 2
        End If
        If e.KeyCode = Keys.Left Then
            pohyb = 3
        End If
        If e.KeyCode = Keys.Right Then
            pohyb = 4
        End If
    End Sub

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkuste prosím poslat i kód který je v Timeru. Zde to vypadá ok.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tady je kód z timeru.

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If pohyb = 1 Then
            PictBox.CreateGraphics.FillRectangle(Brushes.White, x, y, 60, 35)
            PictBox.CreateGraphics.DrawImage(ImageList1.Images(0), x, y - 35)
            y = y - 35
        End If
        If pohyb = 2 Then
            PictBox.CreateGraphics.FillRectangle(Brushes.White, x, y, 60, 35)
            PictBox.CreateGraphics.DrawImage(ImageList1.Images(0), x, y + 35)
            y = y + 35
        End If
        If pohyb = 3 Then
            PictBox.CreateGraphics.FillRectangle(Brushes.White, x, y, 60, 35)
            PictBox.CreateGraphics.DrawImage(ImageList1.Images(0), x - 60, y)
            x = x - 60
        End If
        If pohyb = 4 Then
            PictBox.CreateGraphics.FillRectangle(Brushes.White, x, y, 60, 35)
            PictBox.CreateGraphics.DrawImage(ImageList1.Images(0), x + 60, y)
            x = x + 60
        End If
        pohyb = 0
    End Sub

nahlásit spamnahlásit spam 0 odpovědětodpovědět

proč požíváte Timer, proč to nevykreslujete přímo v události KeyDown? Ale problém bude hlavně v tom, jak už jste psal, že předává focus na tlačítka. Když použijete třeba W,A,S,D tak to fungovat bude, ale chápu že to není to chcete. To bude asi nová otázka do diskuse, jak zakázat ten focus

takhle mi to přijde jednodušší

    Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        If e.KeyCode = Keys.W Then
            PictBox.CreateGraphics.FillRectangle(Brushes.White, x, y, 60, 35)
            PictBox.CreateGraphics.DrawImage(ImageList1.Images(0), x, y - 35)
            y -= 35
        ElseIf e.KeyCode = Keys.S Then
            PictBox.CreateGraphics.FillRectangle(Brushes.White, x, y, 60, 35)
            PictBox.CreateGraphics.DrawImage(ImageList1.Images(0), x, y + 35)
            y += 35
        ElseIf e.KeyCode = Keys.A Then
            PictBox.CreateGraphics.FillRectangle(Brushes.White, x, y, 60, 35)
            PictBox.CreateGraphics.DrawImage(ImageList1.Images(0), x - 60, y)
            x -= 60
        ElseIf e.KeyCode = Keys.D Then
            PictBox.CreateGraphics.FillRectangle(Brushes.White, x, y, 60, 35)
            PictBox.CreateGraphics.DrawImage(ImageList1.Images(0), x + 60, y)
            x += 60
        End If
    End Sub

a tlačítkem přepínejte Me.KeyPreview

        Me.KeyPreview = Not Me.KeyPreview

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tady vřele doporučuji na začátek procedury napsat With PictBox.CreateGraphics() a na konec End With, bude to asi 100x rychlejší. CreateGraphics má nějakou režii a je zbytečné ji volat mnohokrát. A samozřejmě místo všech PictBox.CreateGraphics().něco psát jen .něco.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Máte pravdu, že když to předělám na tlačítka w,s,a,d tak to funguje. Mohl bych to nechat na tahle tlačítka, ale docela mě i zaímá v čem tu mám problém.

Ten timer jsem použil, protože na PictureBoxu budou ještě další objekty, které se budou pohybovat při timeru, to budu ještě dodělávat. Ale když jsem se nad tím zamyslel, tak asi opravdu pohyb tohoto obrázku vykreslím v KeyDown.

Děkuji za vaše reakce.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback