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 :

wxTextCtrl et barres de défilement


Sujet :

wxWidgets

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 268
    Points : 393
    Points
    393
    Par défaut wxTextCtrl et barres de défilement
    Bonjour,

    Tout d'abord le comportement d'une partie de mon appli :

    Je dispose d'un wxTextCtrl avec donc du texte à l'intérieur. Ce texte est assez voire très long dans certains cas.
    Je dispose aussi de plusieurs petites images, et à chaque fois que je clique sur une de ces images, le texte affiché dans le wxTextCtrl change.

    Le problème est que, si je change la scrollbar du wxTextCtrl et que je clique sur un autre image, la scrollbar revient à sa position initiale (au début). Or moi, je veux qu'elle reste à cette position et que le contenu du wxTextCtrl change ainsi de vue.

    J'ai essayé avec les fonctions de wxWindow, cad récupérer les postion de la scrollbar (GetScrollPos etc...) et la reaffecter au changement d'image (SetScrollPos etc...), le problème est que la scrollbar change bien mais pas le contenu de la fanêtre (la vue).

    Une idée pour remédier au problème ?

    Note : je ne souhaite pas utiliser wxScrolledWindow !
    Merci.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par atm0sfe4r Voir le message
    J'ai essayé avec les fonctions de wxWindow, cad récupérer les postion de la scrollbar (GetScrollPos etc...) et la reaffecter au changement d'image (SetScrollPos etc...), le problème est que la scrollbar change bien mais pas le contenu de la fanêtre (la vue).
    Tu as essayé avec wxTextCtrl::ShowPosition ?
    Citation Envoyé par atm0sfe4r Voir le message
    Note : je ne souhaite pas utiliser wxScrolledWindow !
    tu as changé d'avis

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 268
    Points : 393
    Points
    393
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Tu as essayé avec wxTextCtrl::ShowPosition ?
    Je viens d'essayer et rien n'y fait :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // position précédente au début de ma fonction d'affichage
    	_scrollPos = _textCtrl->GetScrollPos(wxVERTICAL);
     
            // ... ici je supprime l'ancien texte
            // .......
            // .... j'affiche mon nouveau texte ici
     
           // Je met le curseur à la position précedemment sauvegardée
    	_textCtrl->ShowPosition((long)_scrollPos);

    Citation Envoyé par 3DArchi Voir le message
    tu as changé d'avis
    Non, j'utilises un wxTextCtrl pour afficher du texte et une wxScrolledWindow pour afficher une image

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    C'est pas beau le up
    Peux-tu me montrer comment tu supprimes l'ancien et affiche le nouveau texte dans ce passage de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // position précédente au début de ma fonction d'affichage
    _scrollPos = _textCtrl->GetScrollPos(wxVERTICAL);
     
    // ... ici je supprime l'ancien texte
    // .......
    // .... j'affiche mon nouveau texte ici
     
    // Je met le curseur à la position précedemment sauvegardée
    _textCtrl->ShowPosition((long)_scrollPos)

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Une solution est de passer par ScrollLines :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // position précédente au début de ma fonction d'affichage
    _scrollPos = _textCtrl->GetScrollPos(wxVERTICAL);
     
    // ... ici je supprime l'ancien texte
    // .......
    // .... j'affiche mon nouveau texte ici
     
    // Je met le curseur à la position précedemment sauvegardée
    _textCtrl->ScrollLines(-1*_textCtrl->GetScrollPos(wxVERTICAL));
    _textCtrl->ScrollLines(_scrollPos);

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 268
    Points : 393
    Points
    393
    Par défaut
    Salut,

    Désolé d'abord pour le up

    Alors, c'était bien ma faute, car je reinitialiser ma _scrollPos entre temps dans le code, c'est presque réglé.

    J'utilise ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // position précédente au début de ma fonction d'affichage
    	_scrollPos = _textCtrl->GetScrollPos(wxVERTICAL);
     
            // ... ici je supprime l'ancien texte
            // .......
            // .... j'affiche mon nouveau texte ici
     
           // Je met le curseur à la position précedemment sauvegardée
    	_textCtrl->ShowPosition((long)_scrollPos);

    Seulement la position change tout de même, en effet elle remonte peu à peu au fur et à mesure que je change d'image.... et si j'utilises la fonction ScrollLines , ça scrolle caremment tout en bas ...

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par atm0sfe4r Voir le message
    et si j'utilises la fonction ScrollLines , ça scrolle caremment tout en bas ...
    ScrollLines(val_) ne déroule pas à la ligne val_ mais augment la position courante de val_ lignes. Donc, il faut d'abord se mettre à la ligne 0 puis se déplacer de val_ lignes. C'est pour ça que dans mon exemple il y avait les 2 appels.

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 268
    Points : 393
    Points
    393
    Par défaut
    Oui, en effet je l'ai remarqué.
    Voici le code utilisé :

    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
    void
    myPanel::paint()
    {
    	// sauve la position de la scrollbar
    	_scrollPos = _textCtrl->GetScrollPos(wxVERTICAL);
     
    	// efface le contenu précédent
    	_textCtrl->Clear();
     
    	// nouveau texte a afficher
    	wxString text(blablabla);
    	_textCtrl->WriteText(text);
     
    	// nouvelle position
    	_textCtrl->ScrollLines(-1 *  _scrollPos);
    	_textCtrl->ScrollLines(_scrollPos);
    }

    Seulement on a l'impression que la scrollbar double sa _scrollPos, comme si la remise à 0 ne marchait pas... grrrrr

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par atm0sfe4r Voir le message
    Oui, en effet je l'ai remarqué.
    Voici le code utilisé :

    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
    void
    myPanel::paint()
    {
    	// sauve la position de la scrollbar
    	_scrollPos = _textCtrl->GetScrollPos(wxVERTICAL);
     
    	// efface le contenu précédent
    	_textCtrl->Clear();
     
    	// nouveau texte a afficher
    	wxString text(blablabla);
    	_textCtrl->WriteText(text);
     
    	// nouvelle position
    	_textCtrl->ScrollLines(-1 *  _scrollPos);
    	_textCtrl->ScrollLines(_scrollPos);
    }

    Seulement on a l'impression que la scrollbar double sa _scrollPos, comme si la remise à 0 ne marchait pas... grrrrr
    Salut,
    Je ne penses pas qu'il faille utiliser _textCtrl->ScrollLines(-1 * _scrollPos); mais bien _textCtrl->ScrollLines(-1*_textCtrl->GetScrollPos(wxVERTICAL));
    Au passage, il est fortement recommandé de ne pas utiliser de noms de variables/classes/fonctions commençant par '_'.
    [EDIT]:
    Citation Envoyé par ISO/IEC 9899:1999 (or C99 Standard)
    "All identifiers that begin with an underscore and either an uppercase letter or another
    underscore are always reserved for any use."

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 268
    Points : 393
    Points
    393
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    Je ne penses pas qu'il faille utiliser _textCtrl->ScrollLines(-1 * _scrollPos); mais bien _textCtrl->ScrollLines(-1*_textCtrl->GetScrollPos(wxVERTICAL));
    J'ai aussi testé comme ça, même problème

    Citation Envoyé par 3DArchi Voir le message
    Au passage, il est fortement recommandé de ne pas utiliser de noms de variables/classes/fonctions commençant par '_'.
    Il me semble que ta citation concerne le langage C. De plus, j'ai eu accès a quelques "gros" projets utilisant cette syntaxe avec wxWidgets, et il n'y avait pas de problème.

    Mystère...

  11. #11
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par atm0sfe4r Voir le message
    J'ai aussi testé comme ça, même problème
    J'ai fais un petit test et ça marche...
    Citation Envoyé par atm0sfe4r Voir le message
    Il me semble que ta citation concerne le langage C. De plus, j'ai eu accès a quelques "gros" projets utilisant cette syntaxe avec wxWidgets, et il n'y avait pas de problème.
    Un compilateur C++ doit vérifier la norme C. C'est plus une recommandation qu'un risque d'erreur. Disons que ça fait parti des règles de bon codage

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 268
    Points : 393
    Points
    393
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Un compilateur C++ doit vérifier la norme C. C'est plus une recommandation qu'un risque d'erreur. Disons que ça fait parti des règles de bon codage
    Tu remet en doute toutes mes conventions de programmation


    De plus, je ne comprend pas comment cela peut marcher : GetScrollPos() retourne la position de la scrollbar, et ScrollLines(val) scrolle un nombre de lignes....

    D'ailleurs, après un test, ma position est de 120 alors que j'ai à peine scroller 6 lignes, ce qui explique le scroll important à la suite d'un appel à ScrollLines(val)..

    On va y arriver promis ^^

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 268
    Points : 393
    Points
    393
    Par défaut
    Alors nouvelle option testée mais encore sans succès :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    _textCtrl->SetScrollPos(wxVERTICAL, scrollPos);
    _textCtrl->ScrollWindow(scrollPos, 0);
    avec scrollPos la position sauvegardée de la scrollBar.

    Il doit bien y avoir un moyen!

  14. #14
    dug
    dug est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 151
    Points : 84
    Points
    84
    Par défaut
    Hello,

    bon, je sais pas si cela peut t'aider, mais dans mon appli, j'ai un petit bout de code qui peut te donner des pistes:

    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
     
    // fonction associé à l'évènement: 	EVT_SCROLLWIN( TCtrlGrid::OnScrollWin )
    void	TCtrlGrid::OnScrollWin( wxScrollWinEvent& ev )
    {
    	wxEventType	TypeEvent = ev.GetEventType();
    	int			iPosition = ev.GetPosition();
    	int			x;
     
     
    	//	positionnement de la barre de scrolling vertical
    	if( ev.GetOrientation() == wxVERTICAL )
    	{
     
    		//	gestion des boutons haut bas de la barre de scrolling
    		if( TypeEvent == wxEVT_SCROLLWIN_LINEUP || TypeEvent == wxEVT_SCROLLWIN_LINEDOWN )
    		{
    			//	récupère la position de la vue visible, pour connaitre la position de la bar de scrolling
    			GetViewStart( &x, &iPosition );
     
    			//	appuie sur les flèches de la scrollbar
    			if( TypeEvent == wxEVT_SCROLLWIN_LINEUP )
    				iPosition--;
     
    			if( TypeEvent == wxEVT_SCROLLWIN_LINEDOWN )
    				iPosition++;
    		}
     
     
    		//	gestion du page up page down de la barre de scrolling
    		if( TypeEvent == wxEVT_SCROLLWIN_PAGEUP || TypeEvent == wxEVT_SCROLLWIN_PAGEDOWN )
    		{
    			//	calcul le nombre de scroll pour un page up ou down
    			GetClientSize( &x, &iPosition );
    			iPosition -= wxGrid::GetColLabelSize();
    			iPosition = iPosition / GetScrollLineY();
     
    			//	inverse le sens si page up
    			if( TypeEvent == wxEVT_SCROLLWIN_PAGEUP )	iPosition *= -1;
     
    			//	calcul la position finale du scrollbar, par rapport à la position actuelle
    			int y;
    			GetViewStart( &x, &y );
    			iPosition = y + iPosition;
    		}
     
    		//	positionnement de la barre de scrolling
    		wxGrid::Scroll( -1, iPosition );
    		((wxGrid*)pGrid)->Scroll( -1, iPosition );
    	} else {
    		//	execution par défaut
    		ev.Skip();
    	}
    }
    ce code ce trouve dans un objet qui surcharge wxGrid (qui hérite de wxScrolledWindow).
    Dans cette objet, la variable pGrid pointe sur un autre objet surchargeant wxGrid. Il permet de faire bouger deux grilles en même temps, pour pouvoir avoir deux grilles côte à côte, avec un Splitter entre les deux.

    hésite pas si tu as des questions.
    a+

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 268
    Points : 393
    Points
    393
    Par défaut
    Salut,

    Merci mais ta méthode s'applique à une wxGrid.

    Pour un wxTextCtrl, l'idée est de récupérer le nombre de lignes jusqu'à la position de la scrollbar (ce que je cherche à faire) puis simplement se servir de :

    wxWindow::ScrollLines
    virtual bool ScrollLines(int lines)

    afin de retrouver la position précédente.

  16. #16
    dug
    dug est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 151
    Points : 84
    Points
    84
    Par défaut
    heu, et avec la fonction wxTextCtrl::HitTest, si tu prends un pixel en haut à gauche dans ton contrôle, tu devrais pouvoir récupérer la position du caractère en question, et donc la ligne.

    sinon, tu as peut être moyen de surcharger l'évènement en question en surchargeant l'objet, faut voir dans le .h correspondant directement.

    perso, j'avais besoin d'un TextArea multiligne dans une grille, je l'ai fais moi même en graphique, avec des boutons haut bas, mais y a pas la scrollbar. Si ça t'intéresse...

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 268
    Points : 393
    Points
    393
    Par défaut
    J'ai regardé cette fonction, je peut récupérer la position à l'aide de XYToPosition ensuite, mais je vois pas comment je peut obtenir le nombre de lignes scrollées...

  18. #18
    dug
    dug est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 151
    Points : 84
    Points
    84
    Par défaut
    c'est sur qu'il a pas l'air très maniable le TextCtrl... après, il utilise les propriétés des textctrl de chaque plateforme on dirait.
    dans "wx/msw/textctrl.h", il y a une fonction OnKeyDown qu'il utilise peut etre lorsque la bar de scrolling est utilisé...

    sinon, y a pas un objet pour afficher une page web, peut être que tu auras plus de possibilité de ce coté là, surtout si tu veux afficher des styles de texte différent et des images...
    ce sujet me sera utile aussi d'ailleurs

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 268
    Points : 393
    Points
    393
    Par défaut
    C'est fou qu'on ne puisse pas faire ce que je souhaite avec wx. Ce n'est quand même pas la mer à boire !

    2 méthodes à mon avis :

    1 - transformer la position sauvegardée de la scollbar en nombre de lignes scrollées. Dans ce cas là ca serait simple en utilisant la fonction wxWindow::ScrollLines.

    2 - scroller directement la fenêtre (dans mon cas le wxTextCtrl) et scroller son contenu.

    La solution 1 doit être applicable, il y a juste à trouver comment. Heureusement cette fonction ne m'est pas indispensable pour le moment. Je continue à chercher.

Discussions similaires

  1. Faire descendre la barre de défilement >> TrichEdit
    Par Hell dans le forum Composants VCL
    Réponses: 6
    Dernier message: 30/06/2012, 23h38
  2. [Forms] barre de défilement en dessous
    Par bargou dans le forum Forms
    Réponses: 8
    Dernier message: 11/01/2005, 10h23
  3. Oter la barre de défilement horizontale d'un TDBGrid
    Par adelavarenne dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/06/2004, 15h37
  4. Evenement sur les barres de défilement d'une ScrollBox
    Par Nico118 dans le forum C++Builder
    Réponses: 2
    Dernier message: 06/05/2004, 14h56
  5. Barre de défilement
    Par GO dans le forum Composants VCL
    Réponses: 2
    Dernier message: 26/01/2003, 17h40

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