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 :

Nouvelle turlupinade bien assaisonnée : synchroniser les scroll bars de 2 RitchTextBoxes [Débutant]


Sujet :

C#

  1. #1
    Membre habitué Avatar de Nadinette
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Octobre 2012
    Messages : 264
    Points : 144
    Points
    144
    Par défaut Nouvelle turlupinade bien assaisonnée : synchroniser les scroll bars de 2 RitchTextBoxes
    Salut,

    J'ai 2 scripts
    Mon premier est un template, il contient des balises qui devront être remplacées genre : {|tag|}
    Mon second est le script généré, il contient le script correspondant au template mais les balises ont disparues.
    Mon tout est un configurateur dont la conceptrice aimerait bien syncroniser les scroll bar des ritch text boxes qui contiennent respectivement les deux textes,

    Idée, sachant que j'ai créé une méthode qui permet de peindre en couleur le {|tag|} et le texte correspondant dans le script, je pourrais ajouter un signet pour chaque tag.
    Ensuite, je voudrais que le dplacement PgeUp PageDown positionne le Tag en haut du 1er editeur et le texte remplacé en haut du second.

    Vous voyez ce que je veux dire ?

    A oui, RTB0 et RTB1 n'ont pas la même hauteur, sinon ça ne serait pas rigolo...

    Merci pour votre aide...

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    bonjour

    quelle techno ? winform ? WPF?

    Par contre, j'ai pas tout compris sur ton besoin de déplacement, script etc...

    Peut-être un peu de code ? capture d'écran pour mieux cerner le problème ?
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  3. #3
    Membre habitué Avatar de Nadinette
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Octobre 2012
    Messages : 264
    Points : 144
    Points
    144
    Par défaut
    Ma machine est en cours de déplacement, je ne peux pas faire de captures.
    Disons que c'est le même principe que winmerge. Il y a deux éditeurs et que les scroll bars sont synchro
    La techno c'est winform.
    Je n'allais pas faire un configurateur en WPF? je ne suis pas assez barje pour ça.

  4. #4
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    Essayes ici :

    http://stackoverflow.com/questions/1...-richtextboxes

    Ca fonctionne bien (la réponse qui commence par : "First, declare the following enums:")

    Après, seule "inconvénient", le déplacement du Scroll n'a lieu que sur relache de la barre de scroll ou bien quand tu cliques dessous la scroll bar mais quand tu fais
    glisser la scrollbar de manière continu, ça n'est pas répercuté de suite...

    (J'ai essayé en remplaçant SendMEssage par PostMessage, mais même résultat).

    Si quelqu'un sait faire ?
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  5. #5
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    Le code qui synchronise 2 richtextbox droppe sur le form:

    Il fait beaucoup de choses utiles en plus de synchroniser 2 RTB :
    - il synchronize les barres de defilement meme si les 2 RTB n'ont pas la meme hauteur et ne demarre pas à la meme position
    - la synchro est active ou pas par ChecBox...
    Ceci permet de demarrer la synchro à des positions differentes des Carets ....

    ingredients:
    -dropper 2 rtbs et un Checkbox sur le form:
    code .cs behind:
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
     
     
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    namespace WinSynchronizeScrollbar
    {
        public partial class Form1 : Form
        {
            // Constants and SendMessage function
     
     
            const int WM_USER  = 0x400;
            const int EM_GETSCROLLPOS  = WM_USER + 221;
            const int EM_SETSCROLLPOS  = WM_USER + 222;
     
            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            public static extern  int  SendMessage(IntPtr hWnd, 
                int msg, int  wParam,ref Point lParam );
           // Scrollpositions of rtb1 and rtb2
            Point ptScrollPos_RTB1, ptScrollPos_RTB2 ;
     
            // Wether the scroll was made by the user (false) or by the synched scrolling function (true)
            bool blnScrolled_RTB1, blnScrolled_RTB2;
     
            public Form1()
            {
                InitializeComponent();
            }
             private void Form1_Load(object sender, EventArgs e)
            {
                 // Set the default scrollposition of RTB's
     
                    SendMessage( this.rtb1.Handle, EM_GETSCROLLPOS, 0, ref ptScrollPos_RTB1);
     
                    SendMessage(this.rtb2.Handle, EM_GETSCROLLPOS, 0, ref ptScrollPos_RTB2);
            }
            private void rtb1_VScroll(object sender, EventArgs e)
            {
     
                //Do not continue if the scroll was made by this program and not by the user (to prevent endless loops)
     
                if (blnScrolled_RTB2) return;
     
                // Set a flag so RTB2 knows it is scrolled by RTB1 and not by the user
                blnScrolled_RTB1 = true;
     
                int  diff;
     
                // Check scrollposition after scrolling
     
                Point pt = new Point() ;
                SendMessage(this.rtb1.Handle, EM_GETSCROLLPOS, 0,ref pt);
     
                // Compare Y-value (height) with scrollposition before scrolling
                diff = pt.Y - ptScrollPos_RTB1.Y;
     
                // Set RTB1 scrollposition variable to new scrollposition
                ptScrollPos_RTB1 = pt;
     
                // Only sync scrolling when checkbox is checked
     
                if (this.chk.Checked )
                {
                   // Get RTB2 scrollposition
     
                    Point  pt2 =new Point();
                    SendMessage(this.rtb2.Handle, EM_GETSCROLLPOS, 0, ref pt2);
     
                    // Set RTB2 scrollpos Y (height) to old scrollposition + the difference in RTB1 scrollposition
     
                    Point newPoint=new Point(pt.X, diff + pt2.Y);
     
                    SendMessage(this.rtb2.Handle, EM_SETSCROLLPOS, 0,ref newPoint);
     
                }
     
     
                // Re-Set the flag
     
                blnScrolled_RTB1 = false;
     
            }
     
            private void rtb2_VScroll(object sender, EventArgs e)
            {
     
                if (blnScrolled_RTB1) return;
     
                blnScrolled_RTB2 = true;
     
                int diff;
     
                // Check 
     
                Point pt =new Point();
                SendMessage(this.rtb2.Handle, EM_GETSCROLLPOS, 0, ref pt);
     
                diff = pt.Y - ptScrollPos_RTB2.Y;
     
                ptScrollPos_RTB2 = pt;
     
     
                if (this.chk.Checked)
                {
     
                    Point pt2 = new Point();
                    SendMessage(this.rtb1.Handle, EM_GETSCROLLPOS, 0, ref pt2);
     
                    Point newPoint = new Point(pt.X, diff + pt2.Y);
                    SendMessage(this.rtb1.Handle, EM_SETSCROLLPOS, 0, ref newPoint);
     
                }
     
     
                blnScrolled_RTB2 = false;
     
            }
     
     
        }
    }
    NB1: le code est symetrique dans les 2 rtb1 et rtb2 et auto-explicative(self-explanatory).........

    NB2 :un code identique peut etre ecrit dans les event HScroll des 2 rtb en remplacant les references aux Coords Verticales(Y) par les references aux Coords Horizontales (X)....
    bon code....

  6. #6
    Membre habitué Avatar de Nadinette
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Octobre 2012
    Messages : 264
    Points : 144
    Points
    144
    Par défaut
    Merci je vais regarder ça bien qu'il ne me reste que 2 RTB.

    Pour la coloration de code j'ai opté pour la tuerie de ScintillaNet... Fantastique

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/09/2008, 12h32
  2. Fenetre sans Scroll Bar
    Par nicolas78986 dans le forum MFC
    Réponses: 15
    Dernier message: 01/06/2007, 03h15
  3. Faire disparaitre les Scrolling bar
    Par rockingstone dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 07/03/2006, 21h43
  4. [ATL] Petite question sur les progress bar
    Par MrMaze dans le forum MFC
    Réponses: 1
    Dernier message: 06/05/2005, 09h40
  5. [BCB5] Défilement automatique des scroll bars
    Par Christophe Brun dans le forum C++Builder
    Réponses: 2
    Dernier message: 05/12/2004, 16h59

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