Problème avec l'évènement Paint

Résolu
MadMax4 Messages postés 4 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 29 mars 2007 - 28 mars 2007 à 16:18
MadMax4 Messages postés 4 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 29 mars 2007 - 29 mars 2007 à 13:00
Bonjour,

J'ai un souci avec l'évènement Paint d'un formulaire.
Je tente de dessiner une bille qui se déplace (genre casse-briques) dans le formulaire en bouclant sur paint et je voudrais pouvoir l'arrêter avec "Escape"
Je teste cette touche avec un keypress mais il semble que l'évènement keypress ne soit jamais intercepté dans mon programme.
J'ai vérifié que la form avait le focus.

Je sèche lamentablement. Est-ce qu'un esprit plus dégourdi que moi aurait une idée ?
merci

7 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
29 mars 2007 à 12:27
Bonjour

A mon avis c'est que tu fait une boucle sans utiliser de DoEvents (un Do Loop infini dans dessine_bille), Application.DoEvents.
Le mieux serais de faire en sorte que tu vire cette boucle pour la remplacée par un thread ou un truc du genre.

Il est plus facile de batiser quelqu'un que de le convertir.(surtout en programmation)
VB (6, .NET1&2), C++, C#.Net1
Mon site
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
28 mars 2007 à 16:24
utilises KeyDown ou KeyUp

KeyPress ne marche pas pour les touches F1...F12, la touche ESC et quelques autres touches ne générant pas de caractère.

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
MadMax4 Messages postés 4 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 29 mars 2007
28 mars 2007 à 16:29
Merci Renfield.
Hélas, j'ai pensé à cette possibilité :
le keydown ou keyup n'est pas non plus intercepté dans mon cas.
le keypress sur un simple A donne la même chose !!!

désespoir ...
cordialement
0
HommingPigeon Messages postés 2 Date d'inscription mercredi 9 février 2005 Statut Membre Dernière intervention 3 avril 2007
28 mars 2007 à 17:05
Il me semble qu'il faut mettre KeyPreview=True au niveau de la Form, c'est une propriété.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
28 mars 2007 à 17:06
nb: je ne fais pas de .Net, j'aide a l'aveuglette ^^

dépend de qui a le focus...
en VB6, les Forms possèdent une propriété KeyPreview qui leur permet de recevoir les evenements clavier avant le controle qui a le focus...

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
MadMax4 Messages postés 4 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 29 mars 2007
28 mars 2007 à 17:13
Merci Renfield et HommingPigeon.

J'ai déjà mis cette propriété à True (ça a été un de mes faux espoir ...)
Mais ça ne change rien !

Au cas où, je glisse ci-dessous mon source :
(au passage, l'aspect ludique de l'objectif est trompeur, je cherche seulement à apprendre VB.net en autodidacte : c'est dur !)
*******************************
Public

Class Form2

Private
Sub Form2_paint(
ByVal sender
As System.Object,
ByVal e
As System.Windows.Forms.PaintEventArgs)
Handles
MyBase.Paint

Dim c
As System.Drawing.Color

Dim bas, droite
As
Boolean

Dim bi
As
New bille

Dim largeur, x, y, rebond
As
Integer

'Dim i, j, rebond As Integer

'Dim start, finish As Doublec =

Me.BackColor

Dim pinceau
As
New SolidBrush(c)Randomize()

Dim angle, angle_initial, nombre_alea
As
Singlenombre_alea = Rnd()

angle_initial = 270 + (nombre_alea * 90)

x = 0

y = 0

angle = (Math.PI / 180) * angle_initial
bas Truedroite
Truerebond Truelargeur 12

bi.dessine_bille(angle, Brushes.Red, pinceau, x, y, largeur, e)

Me.Close()

End
Sub

Private
Sub Form2_KeyPress(
ByVal sender
As System.Object,
ByVal e
As System.Windows.Forms.KeyPressEventArgs)
Handles
MyBase.KeyPress

If e.KeyChar <> Convert.ToChar(Keys.A)
Then

End

End
If

End
Sub

Private
Sub Form2_Load(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles
MyBase.Load

Me.KeyPreview =
True

End
SubEnd

ClassPublic

Class bille

Public
Sub dessine_bille(
ByVal angle
As
Single,
ByVal couleur
As System.Drawing.SolidBrush,
ByVal coul_fond
As System.Drawing.SolidBrush,
ByVal x
As
Integer,
ByVal y
As
Integer,
ByVal largeur
As
Integer,
ByVal e
As System.Windows.Forms.PaintEventArgs)

Dim haut, bas, droite, gauche
As
Boolean

Dim i, j, rebond
As
Integer

Dim start, finish
AsDoublebas Truedroite

True

Do
While rebond < 10

DoForm2.Activate()

If bas
And droite
Theni += 1

' je vais vers la droitej += 1
' je vais vers le bas x CInt(i * Math.Cos(angle))y

CInt(-j * Math.Sin(angle))

End
If

If bas
And gauche
Theni -= 1

' je vais vers la gauchej += 1
' je vais vers le bas x CInt(-i * Math.Cos(angle))y

CInt(-j * Math.Sin(angle))

End
If

If haut
And droite
Theni += 1

' je vais vers la droitej -= 1
' je vais vers le haut x CInt(i * Math.Cos(angle))y

CInt(j * Math.Sin(angle))

End
If

If haut
And gauche
Theni -= 1

' je vais vers la gauchej -= 1
' je vais vers le hautx CInt(-i * Math.Cos(angle))y

CInt(j * Math.Sin(angle))

End
Ife.Graphics.FillEllipse(Brushes.Red, x, y, largeur, largeur)

start = Microsoft.VisualBasic.DateAndTime.Timer

finish = start + 0.01

Do
While Microsoft.VisualBasic.DateAndTime.Timer < finish

Loope.Graphics.FillEllipse(coul_fond, x, y, largeur, largeur)

Loop
Until j = 0
Or y + largeur + 27 >= Form2.Bounds.Height
Or i = 0
Or x + largeur + 10 >= Form2.Bounds.Width

' changement de direction

Select
Case x
Case 0gauche Falsedroite

True

If angle < 0
Thenangle = 2 * Math.PI + angle

End
If

If angle > Math.PI Thenhaut Falsebas

Trueangle = Math.IEEERemainder(Math.PI - angle, 2 * Math.PI)
Elsehaut Truebas

Falseangle = Math.IEEERemainder(Math.PI - angle, 2 * Math.PI)

End
If

CaseIs >Form2.Bounds.Width - 10 - largeurgauche

Truedroite =

False

If angle < 0
Thenangle = 2 * Math.PI + angle

End
If

If angle > 3 * (Math.PI / 2) Thenhaut Falsebas

Trueangle = Math.IEEERemainder(Math.PI - angle, 2 * Math.PI)
Elsehaut Truebas

Falseangle = Math.IEEERemainder(Math.PI - angle, 2 * Math.PI)

End
If

End
Select

Select
Case y
Case 0bas Truehaut

False

If angle < 0
Thenangle = 2 * Math.PI + angle

End
If

If angle < Math.PI / 2 Thengauche Falsedroite

Trueangle = Math.IEEERemainder(-angle, 2 * Math.PI)
Elsegauche Truedroite

Falseangle = Math.IEEERemainder((2 * Math.PI) - angle, 2 * Math.PI)

End
If

CaseIs >Form2.Bounds.Height - 30 - largeurhaut

Truebas =

False

If angle < 0
Thenangle = 2 * Math.PI + angle

End
If

If angle > 3 * (Math.PI / 2) Thengauche Falsedroite

Trueangle = Math.IEEERemainder((2 * Math.PI) - angle, 2 * Math.PI)
Elsegauche Truedroite

Falseangle = Math.IEEERemainder((2 * Math.PI) - angle, 2 * Math.PI)

End
If

End
Selectrebond += 1

Loop

End
SubEnd

Class
0
MadMax4 Messages postés 4 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 29 mars 2007
29 mars 2007 à 13:00
Merci Beaucoup NHenry
ça fonctionne avec le DoEvents.
Grace à toi j'ai appris quelque chose aujourd'hui.

Bravo pour ce forum efficace
Bien cordialement
0
Rejoignez-nous