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++Builder Discussion :

TDrawGrid + bulle d'aide (hint) multiligne [Non suivi]


Sujet :

C++Builder

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 7
    Points : 8
    Points
    8
    Par défaut TDrawGrid + bulle d'aide (hint) multiligne
    Bonjour,
    je cherche a faire une grille de type TDrawgrid qui affiche
    des informations relatives a la cellule sur laquelle se trouve la souris.

    Deroulement du programme :

    Un timer se declenche toutes les secondes, provoque un certain nombre de traitement sur un tableau en memoire (tableau_memoire) et demande a la grille de se repeindre (invalidate). La fonction drawcell dessine les differentes cellules en fonction de certains criteres de tableau_memoire.

    Je voudrais que lorsque la souris passe sur une case de la TDRAWGRID, je recupere les infos contenues dans tableau_memoire (case correspondante dans tableau_memoire) et les afficher dans une bulle d'aide qui doit etre multiligne.

    Je voudrais dans un premier temps connaitre votre avis pour savoir
    dans quel evenement je dois mettre le code pour remplacer le texte de Hint (je cherche un truc du genre OnMouseOver sur le tdrawgrid qui me fournirait la ligne et la colonne) et savoir si ca marche le multiligne dans les Hints.
    D'autre part, peut on forcer l'affichage d'une bulle d'aide (une fonction ShowHint() par exemple, cela pour ne pas attendre le delai d'affichage d'une bulle d'aide ?

    Merci d'avance, je suis sous BCB6

    Bonne journée

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    ah oui, j'allais oublier, c'est pour plus tard mais autant en profiter,
    comment feriez vous pour faire un genre de double buffering avec une
    tdrawgrid :

    En gros, j'ai deux tdrawgrid, une que j'affiche et l'autre en memoire, je
    modifie celle en memoire et une fois que c'est fait je recopie tout dans celle
    qui est affichée.

    Ca se ferait comment cette drole de bete :
    et est ce que ca peut valoir le coup (notamment si l'affichage doit etre
    modifié rapidement et qu'il ya des images a dessiner dans les cellules)

    Merci encore

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    En dérivant de TCustomForm ou bien en rajoutant une nouvelle form au projet tu peux
    réaliser une petite fenêtre pouvant servir de Hint. Voici un exemple avec une TCustomForm :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class JHint : public TCustomForm
    {
    public :
    TStringList *List;
    Graphics::TBitmap *Bitmap; //pour ma version BC3 et pour accélérer le graphisme
        __fastcall JHint(TComponent *Owner);
        __fastcall ~JHint();
        void __fastcall Paint();
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    __fastcall JHint::JHint(TComponent *Owner) : TCustomForm(Owner, 0)
    {
    BorderStyle = bsNone;
    FormStyle = fsStayOnTop;
    List = new TStringList();
    Bitmap = new Graphics::TBitmap();
    Color = (TColor)0x00FFEFDF; //bleu pâle sinon clAqua c'est bien aussi
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    __fastcall JHint::~JHint()
    {
    delete Bitmap;
    Bitmap = NULL;
    delete List;
    }
    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
    void __fastcall JHint::Paint()
    {
    int w, h;
    int maxwidth=0;
    int maxheight=0;
    if(Bitmap != NULL)
        {
        for(int j = 0; j < List->Count; j++)
            {
            w = Canvas->TextWidth(List->Strings[j]);
            if(w > maxwidth) maxwidth = w;
            h = Canvas->TextHeight(List->Strings[j]);
            if(h > maxheight) maxheight = h;
            }
        SetBounds(Left, Top, maxwidth + 8, (h * List->Count) + 8 );
        if((Bitmap->Width != Width) || (Bitmap->Height != Height))
            {
            Bitmap->Width = Width; Bitmap->Height = Height;
            }
        TCanvas *C = Bitmap->Canvas; //pour mon BCB3
        C->Pen->Color = clBlack;
        C->Pen->Mode =pmCopy;
        C->Pen->Style = psSolid;
        C->Brush->Color = Color; //pour éviter un scintillement
        C->Brush->Style = bsSolid;
        C->Rectangle(0,0, Width, Height);
        C->Brush->Style = bsClear; //on ne dessine que le texte
        int y = 4;
        for(int j = 0; j < List->Count; j++)
            {
            C->TextOut(4, y, List->Strings[j]);
            y+=h;
            }
        Canvas->Draw(0,0,Bitmap);
        }
    }
    Pour la form principale (ici Form1), ou bien celle où se dessine le TDrawGrid :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JHint *jHint; //déclaration globale
    Dans son constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jHint = new JHint(Owner);
    Voici la mise en oeuvre du Hint :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void __fastcall TForm1::DrawGrid1MouseMove(TObject *Sender,
          TShiftState Shift, int X, int Y)
    {
    jHint->Left = Form1->Left + DrawGrid1->Left + X + 16;
    jHint->Top = Form1->Top + DrawGrid1->Top + Y + 48;
    jHint->List->Clear();
    //Je vais montrer tout ça :
    jHint->List->Add("Souris");
    jHint->List->Add("X = " + IntToStr(X));
    jHint->List->Add("Y = " + IntToStr(Y));
    //je n'ai pas trouvé mieux ici :
    jHint->Repaint();
    jHint->Show();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y)
    {
    jHint->Hide();
    }

    Certainement à améliorer car je n'ai pas géré en profondeur la position de la fenêtre
    ...donc je te laisse faire !

    A plus !

Discussions similaires

  1. Bulle d'Aide au niveau d'un formulaire
    Par sagitarium dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 22/05/2006, 15h47
  2. [debutant] bulle d'aide à la eclipse
    Par Trolls dans le forum Composants
    Réponses: 3
    Dernier message: 10/11/2005, 11h00
  3. bulle d'aide sur image/lien
    Par chtef dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 14/02/2005, 11h34
  4. Dessiner sa propre bulle d'aide
    Par laetus dans le forum C++Builder
    Réponses: 4
    Dernier message: 23/08/2004, 13h57

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