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

C# Discussion :

Gestion des scroll avec molette et key


Sujet :

C#

  1. #1
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut Gestion des scroll avec molette et key
    Bonjour,
    Je sèche sur le problème de la gestion des scroll avec la molette de la souris.
    P.ex.
    - mouvement de la molette = scroll vertical
    - mouvement de la molette + touche ctrl enfoncée = scroll horizontal
    - faire en sorte que les scroll ne se remettent pas à 0 lors d'un repaint
    - etc....

    Si quelqu'un connaît un tuto ou tout autre doc, je suis preneur.

    Merci et bonne journée

  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
    - mouvement de la molette = scroll vertical
    Il faut gérer l'évènement MouseWheel
    La propriété Delta des paramètres de l'évènement indique si la molette a été tournée vers le haut (valeur positive) ou vers le bas (valeur négative)

    - mouvement de la molette + touche ctrl enfoncée = scroll horizontal
    évènement MouseWeel + vérifier la propriété Control.ModifierKeys

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private void LeControle_MouseWheel(object sender, MouseEventArgs e)
    {
        if ((Control.ModifierKeys & Keys.Control) == Keys.Control)
        {
            // la touche Control est enfoncée
        }
        else
        {
            // la touche Control n'est pas enfoncée
        }
    }
    - faire en sorte que les scroll ne se remettent pas à 0 lors d'un repaint
    Je vois pas de quoi tu parles

  3. #3
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut
    évènement MouseWeel + vérifier la propriété Control.ModifierKeys
    D'accord mais le scroll vertical se fait de toute manière
    Il faut peut-être ajouter que je suis dans un override d'un UserControl de OnMouseWheel et que je veux srcoller horizontalement si le Alt est appuyé
    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
     
    protected override void OnMouseWheel(MouseEventArgs e)
        {      
          switch (ModifierKeys)
          {         
            case Keys.Alt:
              (Parent as Panel).VerticalScroll.Enabled = false;
              if (e.Delta > 0)
              {
                if (hScroll > 100)
                {
                  hScroll -= 100;
                }
                else
                {
                  hScroll = 0;
                }            
              }
              else
              {
                hScroll += 100;
              }
              (Parent as Panel).HorizontalScroll.Value = hScroll;
              break;
            case Keys.Escape:
              Dock = DockStyle.None;
              Width += 100;
              Height += 100;
              (Parent as Panel).VerticalScroll.Maximum = Height;
              (Parent as Panel).HorizontalScroll.Maximum = Width;
              (Parent as Panel).VerticalScroll.Value += 100;
              (Parent as Panel).HorizontalScroll.Value += 100;
              break;
            case Keys.None:
              base.OnMouseWheel(e);
              break;
          }     
        }
    - faire en sorte que les scroll ne se remettent pas à 0 lors d'un repaint
    Si les scroll sont à une valeur donnée, lorsque je change de fenêtre active et que je reviens sur mon application, les scrolls se retrouve à la position 0

  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
    Citation Envoyé par ppphil Voir le message
    D'accord mais le scroll vertical se fait de toute manière
    Arf... Alors, en regardant un peu avec Reflector, je vois que le MouseEventArgs qui est passé à OnMouseWheel est en fait un HandledMouseEventArgs. Donc je pense que l'astuce suivante devrait marcher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    protected override void OnMouseWheel(MouseEventArgs e)
    {
        ...
     
        HandledMouseEventArgs h = (HandledMouseEventArgs)e;
        h.Handled = true; // pour empêcher le traitement par défaut
    }
    (pas testé)

    Citation Envoyé par ppphil Voir le message
    Si les scroll sont à une valeur donnée, lorsque je change de fenêtre active et que je reviens sur mon application, les scrolls se retrouve à la position 0
    là je t'avoue que je comprends pas trop pourquoi... c'est pas le comportement normal a priori


    Sinon, fais gaffe, le switch n'est pas forcément une bonne façon de tester ModifierKeys, parce qu'il peut y avoir plusieurs touches pressées en même temps (par exemple ALT et CTRL), et dans ce cas tu n'entreras dans aucun des cas prévus par le switch...

    D'autre part, tu devrais toujours appeler base.OnMouseWheel (pas seulement dans le cas "Keys.None"), sinon les handlers abonnés à l'évènement MouseWheel ne seront pas appelés

  5. #5
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut
    Ok ! Merci !
    En effet, il faut annihiler le comportement de base du MouseWheel. C'est tout bon.
    Merci pour la remarque concernant le switch !!! Ca m'évitera de me prendre la tête plus tard !!
    Pour les scroll qui reviennent à 0 lors d'un changement de fenêtre au premier plan...

    Salut et bonne soirée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/02/2015, 13h23
  2. Gestion des transactions avec les composants DOA
    Par lper dans le forum Bases de données
    Réponses: 2
    Dernier message: 01/12/2008, 16h06
  3. Gestion des factures avec interbase
    Par AlexB59 dans le forum Bases de données
    Réponses: 1
    Dernier message: 25/10/2005, 12h05
  4. Gestion des cookies avec Indy 10
    Par membrax dans le forum Web & réseau
    Réponses: 5
    Dernier message: 21/09/2005, 18h44
  5. Class de gestion des images avec rotation
    Par Johnny Boy dans le forum MFC
    Réponses: 1
    Dernier message: 03/05/2005, 11h54

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