IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

comment faire un "repeat button"


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    Points : 18
    Points
    18
    Par défaut comment faire un "repeat button"
    Bonjour, je développe actuellement une application pour pocket pc en compact framwork 2 et malgré mes recherches je n'ai pas trouvé le moyen de faire simplement un "repeat button" afin d'incrémenter automatiquement une valeur lorsque ce fameux bouton reste appuyé, si quelqu'un à une idée ? Merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    En WPF, tu pourrais utiliser la classe RepeatButton existante

    Mais pour Windows Forms, il va falloir le gérer toi-même... Pour ça il suffit de faire un contrôle qui hérite de bouton, et gérer les évènements MouseDown et MouseUp pour lancer des timers qui génèreront des évènements Click.

    Un petit exemple (qui marche à peu près mais peut sans doute être affiné...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    Public Class RepeatButton
        Inherits Button
     
    	Private timerDelay As Timer
    	Private timerRepeat As Timer
     
    	Public Sub New()
    		InitializeComponent()
    		timerDelay = New Timer()
    		timerRepeat = New Timer()
    		timerDelay.Interval = 500
    		timerRepeat.Interval = 100
    	End Sub
     
    	<DefaultValue(500)> _
    	Public Property Delay() As Integer
    		Get
    			Return timerDelay.Interval
    		End Get
    		Set
    			timerDelay.Interval = value
    		End Set
    	End Property
     
    	<DefaultValue(100)> _
    	Public Property Interval() As Integer
    		Get
    			Return timerRepeat.Interval
    		End Get
    		Set
    			timerRepeat.Interval = value
    		End Set
    	End Property
     
    	Protected Overloads Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
    		OnClick(e)
    		timerDelay.Start()
    		MyBase.OnMouseDown(e)
    	End Sub
     
    	Protected Overloads Overrides Sub OnMouseUp(ByVal e As MouseEventArgs)
    		timerDelay.[Stop]()
    		timerRepeat.[Stop]()
    		MyBase.OnMouseUp(e)
    	End Sub
     
    	Private Sub timerDelay_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles timerDelay.Tick
    		timerDelay.[Stop]()
    		OnClick(e)
    		timerRepeat.Start()
    	End Sub
     
    	Private Sub timerRepeat_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles timerRepeat.Tick
    		OnClick(e)
    	End Sub
     
    End Class
    Delay : temps (en ms) qu'il faut rester appuyé sur le bouton avant que les clics commencent à se répéter
    Interval : intervalle (en ms) entre 2 répétitions du clic

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    Points : 18
    Points
    18
    Par défaut
    Merci pour votre réponse, j'ai essayé votre class mais je n'ai pas réussi à l'adapter, par contre j'ai trouvé une autre class assez similaire à la votre du site suivant : http://www.codeproject.com/KB/cpp/RepeatButton.aspx qui marche sans pb en winform mais pas en compact framework, je pense que ca vient de la methode MouseEventArgs -> MouseDown qui doit pas etre adapté au tactile car il se passe rien quand je reste appuyé sur le boutton
    si vous avez par hazard une idée au pb?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    Public Class RepeatButton
                   Inherits System.Windows.Forms.Button
     
         Public Sub New()
              AddHandler timer.Tick, AddressOf OnTimer
              timer.Enabled = False
         End Sub
     
         Public Timer As New timer
         Public Property Interval() As Integer
             Get
                   Return timer.Interval
             End Get
     
             Set(ByVal Value As Integer)
                   timer.Interval = Value
             End Set
        End Property
     
         Private Sub OnTimer(ByVal sender As Object, ByVal e As EventArgs)
              'fire off a click on each timer tick 
     
              OnClick(EventArgs.Empty)
         End Sub
     
         Private Sub RepeatButton_MouseDown(ByVal sender As Object, ByVal e As  _
         System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
              'turn on the timer 
     
              timer.Enabled = True
         End Sub
     
         Private Sub RepeatButton_MouseUp(ByVal sender As Object, ByVal e As _
         System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseUp
              ' turn off the timer 
     
              timer.Enabled = False
         End Sub
     
    End Class

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    je sais pas, j'ai jamais développé sur compact framework...

    Qu'est-ce que tu veux dire par "il se passe rien" ? tu gères l'évènement Click du bouton ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 45
    Points : 18
    Points
    18
    Par défaut
    en faite en framework normal dans l'évènement click du bouton se répète bien à l'interval souhaité, mais en compact framework il se répète pas du tout et je vois pas d'où vient le pb

  6. #6
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    J'ai fait un code semblable à ceux proposés plus haut qui marche bien en WinForms, fait 100% à la mano, qui donne ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
        IncButton  .MouseDown  += IncButton_MouseDown  ;
          IncButton  .MouseUp    += IncButton_MouseUp    ;
          IncButton  .MouseLeave += IncButton_MouseLeave ;
     
          MoveTimer = new Timer();
          UpdateTimer .Interval = 100 ;
          UpdateTimer .Enabled  = false ;
          UpdateTimer .Tick += UpdateTimer_Tick  ; 
       ...
       int CurrentStep = 0 ;
       int MonCompteur =0 ;
       ...
       private void UpdateTimer_Tick(object sender, EventArgs e)
        { UpdateCompteur(0); UpdateTimer.Interval = 100;  }
     
        private void IncButton_MouseDown(object sender, EventArgs e)
        { UpdateCompteur(+1); UpdateTimer.Interval = 500; UpdateTimer.Enabled = true; }
     
        private void IncButton_MouseUp(object sender, EventArgs e)
        { UpdateTimer.Enabled = false; }
     
        private void IncButton_MouseLeave(object sender, EventArgs e)
        { UpdateTimer.Enabled =false ; }
     
        private void UpdateCompteur(int Step)
        {
          if (Step == 0) Step = CurrentStep ; else CurrentStep = Step;
          MonCompteur+=Step ;
          // ici : les actions liées au changement de valeur du compteur
        }
    J'ai pas mis le code pour le DecButton qui décrémente le compteur, code qui est similaire au IncButton avec simplement un UpdateCompteur(-1) dans DownButton_MouseDown.

    mais en compact framework il se répète pas du tout et je vois pas d'où vient le pb
    Vérifie que dans Compact framework CE sur pocket Pc, tu n'aurai pas un MouseUp systématiquement après le MouseDown, même en laissant le doigt appuyé.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

Discussions similaires

  1. Réponses: 10
    Dernier message: 23/04/2014, 15h08
  2. [Dojo] comment faire un dijit.form.Button
    Par daucy36 dans le forum Bibliothèques & Frameworks
    Réponses: 9
    Dernier message: 16/08/2011, 09h56
  3. Réponses: 0
    Dernier message: 30/11/2007, 14h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo