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

wxWidgets Discussion :

Soom à la molette


Sujet :

wxWidgets

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 268
    Par défaut Soom à la molette
    Bonjour,

    J'ai du mal à comprendre les fonctions proposées par wxMouseEvent pour effectuer un zoom à la molette (macro EVT_MOUSEWHEEL).

    Je ne saisi pas le rôle des fonctions :
    wxMouseEvent::GetWheelRotation
    wxMouseEvent::GetWheelDelta

    (
    détails ici)

    Si quelqu'un veux bien m'expliquer !


    Voila mon code à titre d'exemple où je dessine sur une wxScrolledWindow (qui ne marche pas bien sur) :

    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
    oid
    ImagePanel::OnMouseWheel(wxMouseEvent& event)
    {
    	int rotation = event.GetWheelRotation();
     
    	wxClientDC dc(this);
    	DoPrepareDC(dc);
    	dc.Clear();
     
    	if(rotation > 0)
    	{// Zoom in.
    		_zoomFactor += 0.1;
    	}
    	else
    	{//Zoom out.
    		_zoomFactor -= 0.1;
    	}
    	dc.SetUserScale(_zoomFactor, _zoomFactor);
    	dc.DrawBitmap(_bitmap, 0, 0, false);
    	}
    	event.Skip();
    }

  2. #2
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wxMouseEvent::GetWheelDelta
    Elle retourne un chiffre (120 en principe)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wxMouseEvent::GetWheelRotation
    Retourne un nombre qu'il faut diviser par delta, ce qui devrait donner 1 ou -1 pour indiquer la direction. (Le résultat de la division devrait être un entier)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(rotation > 0)
    	{// Zoom in.
    		_zoomFactor += 0.1;
    	}
    	else
    	{//Zoom out.
    		_zoomFactor -= 0.1;
    	}
    Un point d'arrêt juste avant le test devrait indiquer que cela fonctionne déjà.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 268
    Par défaut
    J'ai bien compris leur rôle, toutefois je me demande pourquoi ce code ne marche pas :

    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
    void
    MyPanel::OnMouseWheel(wxMouseEvent& event)
    {
            // rotation (entier positif ou negatif) qui précise le sens de la molette
    	int rotation = event.GetWheelRotation();
     
            // nombre de "coups de molette"
    	int step = event.GetWheelDelta() / 120;
     
    	if(_bitmap.IsOk())
    	{
    		if(rotation > 0)
    		{// Zoom in.
    			_zoomFactor += 0.1 * step;
    		}
    		else
    		{//Zoom out.
    			_zoomFactor -= 0.1 * step;
    		}
    		this->Refresh();
    	}
    	event.Skip();
    }

    avec ma fonction paint (appelée au Refresh) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void
    MyPanel::OnPaint(wxPaintEvent& event)
    {
    	if(_bitmap.IsOk())
    	{
    		wxPaintDC dc(this);
    		dc.Clear();
    		dc.SetUserScale(_zoomFactor, _zoomFactor);
    		dc.DrawBitmap(_bitmap, 0, 0, false);
    	}
    	event.Skip();
    }


    Edit : erreur de ma part, désolé...

  4. #4
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Oui le code c'est plus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //...
    int rotation = event.GetWheelRotation()/event.GetWheelDelta() ;
     
    if(_bitmap.IsOk())
    {
    	_zoomFactor += 0.1 * rotation ;
    }
    this->Refresh();
    //...

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 268
    Par défaut
    Oui, c'est exactement ça, c'est bien d'avoir mis le code à titre d'exemple (ce que j'avais oublié).

    Par contre, quand on veut zoomer sur une wxBitmap, l'utilisation de wxDC::SetUserScale(double xScale, double yScale) est vraiment à bannir ! En effet elle modifie la structure de l'image et les résultats sont vraiment mauvais.

    Je sens que je vais coder ma fonction zoom à l'aide d'un petit filtre (Mitchell-Netravali au hasard )

  6. #6
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Sinon pour pas recoder des fonctions de redimensionnement, tu peux utiliser Framewave d'AMD, libre, gratuit, efficace, simple, 5 fichiers à inclure maxi (seulement 2 pour toi, "fwBase.h" & "fwImage.h"), pas de dll/lib

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

Discussions similaires

  1. [Scrollbox] Scroll & Molette
    Par fred64 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 25/04/2006, 19h34
  2. gestion de la molette
    Par xavynfive dans le forum GLUT
    Réponses: 6
    Dernier message: 07/05/2005, 12h57
  3. Molette souris et DBCtrlGrid
    Par TieumB dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/09/2004, 12h16
  4. Simuler un coup de molette sur un memo...
    Par dynobremo dans le forum Composants VCL
    Réponses: 2
    Dernier message: 28/02/2003, 11h31
  5. [TP]La molette de la souris / le port PS/2
    Par LaGuimb dans le forum Turbo Pascal
    Réponses: 23
    Dernier message: 30/12/2002, 22h01

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