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 :

Image de fond StringGrid


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 206
    Par défaut Image de fond StringGrid
    Salut,
    Mon projet étant terminé, je voudrais m'attarder sur l'estétique de ma grille et lui mettre une image de fond.

    Le code que j'utilise affiche bien mon image mais par dessus mes cellules et non en image de fond :/

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
          int ARow, TRect &Rect, TGridDrawState State)
    {
     
            Graphics::TBitmap *pBitmap = new Graphics::TBitmap();
            pBitmap->LoadFromFile("C:\\Documents and Settings\\Compaq_Propriétaire\\Bureau\\Albat_r.bmp");
            StringGrid1->Canvas->Draw(0,0,pBitmap);
    }

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 206
    Par défaut
    Bonjour,

    alors j'ai vu qu'il été possible de mettre une image de fond dans une stringgrid mais en delphi.
    Je ne sais pas si c'est possible sous builder ?!?!

    Dans mon projet sous builder peut-on rajouter le code en delphi ?
    Y'a t'il des risques ? Si non quelq'un pourrait m'aider à l'inclure svp

  3. #3
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Je me demande s'il ne faut pas prendre en charge tout le dessin de la grille cellule par cellule ?
    Donc charger l'image de fond dans un bitmap et puis :

    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
    void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int Col,
          int Row, TRect &Rect, TGridDrawState State)
    {
    TCanvas * C = StringGrid1->Canvas;
    int we = StringGrid1->DefaultColWidth;
    int he = StringGrid1->DefaultRowHeight;
    TRect Dest = Rect;
    TRect Srce = Rect;
    Srce.Left -= we;
    Srce.Top -= he;
    Srce.Right -= we;
    Srce.Bottom -= he;
    C->CopyRect(Dest, Bitmap->Canvas, Srce);
    AnsiString N = StringGrid1->Cells[Col][Row];
    int tx =  (we - C->TextWidth(N)) / 2;
    int ty = (he - C->TextHeight(N)) / 2;
    C->Brush->Style = bsClear;
    C->TextOut(Dest.Left + tx, Dest.Top + ty, N);
    }
    Je ne connais pas de solution plus simple donc...
    Celà dit... si l'image du bitmap est plus petite que la zone client du stringgrid, alors il faudra gérer plus en détail...

    A plus !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 206
    Par défaut
    Merci, c'est presque ca !

    en fait, l'image de fond commence a la ligne 1 et colonne 1 au lieu de 1 0
    et lorsque je charge le contenu de mon stringgrid, j'ai :


    au lieu de (avec l'image de fond) :

  5. #5
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Dans ce cas supprimer le decalage dans le bitmap en Left et Right au niveau de Srce puisque le bord du bitmap coïncide avec la zone client du stringgrid.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ...
    //Srce.Left -= we; //inutile
    Srce.Top -= he;
    //Srce.Right -= we; //inutile
    Srce.Bottom -= he;
    ...
    A plus !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 206
    Par défaut
    Merci et pour l'écriture qui est pas normal (on dirait que c'est ecrit 2fois la meme chose mais avec un décalage) ?

  7. #7
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Je n'ai pas de problème avec l'écriture du texte.
    En ce moment mon test est celui là :

    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
    void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int Col,
          int Row, TRect &Rect, TGridDrawState State)
    {
    TCanvas *C = StringGrid1->Canvas;
    AnsiString N = StringGrid1->Cells[Col][Row];
    TRect Srce = Rect;
    TRect Dest = Rect;
    int he = StringGrid1->DefaultRowHeight;
    int we = StringGrid1->DefaultColWidth;
    Srce.Top -= he;
    Srce.Bottom -= he;
    C->CopyRect(Dest, Bitmap->Canvas, Srce);
    TColor c = clBlack;
    switch(Col)
        {
        case 1 : c = clBlue; break;
        case 2 : c = clRed; break;
        case 3 : c = clYellow; break;
        case 5 : c = clWhite; break;
        }
    C->Font->Color = c;
    int x = (we - C->TextWidth(N)) / 2;
    int y = (he - C->TextHeight(N)) / 2;
    C->Brush->Style = bsClear;
    C->TextOut(Dest.Left + x, Dest.Top + y, N);
    }
    Je ne fais rien d'autre dans cette méthode !

    A plus !

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 206
    Par défaut
    C'est bon j'ai trouvé l'erreur enfin ce qui cloché quoi.

    je change la couleur de texte de la 2eme colonne et lorsque je mettais en commentaire mon test, l'écriture se faisait bien mais que la 2eme colonne.

    J'ai mis en commentaire cette parti de ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C->TextOut(Dest.Left + tx, Dest.Top + ty, N);
    et en dessous je redefini les attributs de la stringgrid et là ca marche !

    Merci car sans ton code je n'aurais pu trouvé :/

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

Discussions similaires

  1. Image de fond pour xdm
    Par BloodyImp dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 15/09/2004, 16h47
  2. boîte de dialogue avec image de fond + texte
    Par Eugénie dans le forum MFC
    Réponses: 13
    Dernier message: 31/08/2004, 13h32
  3. image de fond à la taille de la form
    Par littledoudou dans le forum C++Builder
    Réponses: 5
    Dernier message: 20/01/2004, 14h15
  4. Comment mettre une image en fond de JFrame
    Par marc26 dans le forum Débuter
    Réponses: 3
    Dernier message: 19/01/2004, 17h57
  5. [VB6] [Graphisme] Image de fond stretchable dans mdiform
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 17/02/2003, 10h45

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