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

Lazarus Pascal Discussion :

TStringGrid : une image en fond de ligne [partiellement résolu] [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut TStringGrid : une image en fond de ligne [partiellement résolu]
    Bonjour,

    Je travaille encore un peu sur les TStringGrids de Lazarus, histoire de voir ce que je peux améliorer au niveau de l'esthétique.

    J'aimerais reproduire un effet d'image en arrière plan de ligne quand le pointeur de la souris la survole, par exemple un dégradé de couleur ou un effet de relief au "fond" de la ligne survolée.

    Pour l'instant j'en suis là.

    Sous Ubuntu 12.04, cela donne ceci en action : video.avi

    J'ai intercepté des évènements (LM_MOUSEMOVE et LM_MOUSEWHEEL). Mettre une image dans une cellule : OK [cf la FixedCols ici]... Mais placer une image en fond de cellule et y "coller" dessus le texte que contient la cellule, malgré tous mes efforts, c'est l'échec complet. Est-ce faisable ? Peut-on régler les problèmes de transaparence sous Win et Nux ?

    Vous remarquerez sur la vidéo le merveilleux rendu d'Ubuntu 12.04 avec la version de Lazarus de son dépôt (0.9.30.2-2) ... La StringGrid de droite avec ses jolis traits marrons est une TStringGrid d'origine ! Heureusement sous 10.04 ou Debian, avec une version SVN de Lazarus/FPC, c'est correct. Une différence cependant de comportement : sous Windows quand la souris quitte la StringGrid, le fond de la dernière ligne survolée disparaît alors que sous Nux, par défaut avec le même code, le fond reste affiché. Cela se corrige mais il faut tout vérifier.

    Cordialement. Gilles
    Dernière modification par Invité ; 01/08/2012 à 11h38.

  2. #2
    Membre Expert

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Par défaut
    Salut

    Je n'ai pas bien compris. Tu cherches a avoir ton texte sur l'image de fond ? Si c'est cela, au moment ou tu dessines ton image de fond avec Draw, fais également un DrawText par dessus.

    J'avais travaillé également sur l'esthétique des StringGrid, va voir ici, j'avais rencontré quelques problèmes :
    http://www.developpez.net/forums/d11...s-tcustomgrid/

    Si ça t’intéresse, je peux te filer ce que j'ai commencé (et abandonné)

    Bonne chance

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    La première partie est réglée : le problème rencontré était le suivant :


    Ici pour que cela soit visible : Canvas.Brush.Color := clGreen;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (aCol >0 ) and (aRow >= FixedRows) and (arow = aRowSurvol) then begin
     { Dessin du fond }
     Canvas.Draw(aRect.Left+((aRect.Right-aRect.Left-Form1.Image2.Picture.Bitmap.Width) div 2),
       aRect.Top+((Arect.Bottom-aRect.Top-Form1.Image2.Picture.Bitmap.Height) div 2),Form1.Image2.Picture.Bitmap);
     { Texte }
     DrawText(Canvas.Handle, PChar(sTmp), Length(sTmp), aRect,
               DT_SINGLELINE or DT_VCENTER or DT_LEFT or DT_END_ELLIPSIS);
    end;
    La question était comment rendre le fond du Texte transparent ? Je cherchais "le Canvas.Brush.Color doit prendre quelle valeur ?" Dans mes rêves, j'aurais aimé qu'une commande Canvas.Brush.Color := clNone corresponde à ce que je cherchais... d'ailleurs je ne comprend pas ce clNone. Il correspond à quel cas qu'une couleur (éventuellement prédéfinie) ne pourrait pas remplacer ?

    En réalité, il suffit de rajouter avant de dessiner le texte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Canvas.Brush.style := bsClear;
    Autre question en suspens : Quelle est la bonne méthode pour ajuster la largeur (pas la hauteur) du Bitmap à la taille de la cellule ?
    1. Strech --> Non : le rendu est déplorable. De plus je ne veux pas calculer la taille du dessin dans chaque cellule... C'est beaucoup trop long. La fluidité du survol s'en ressent.
    2. Créer une image pour chaque colonne par addition d'une bande verticale de 1 pixel (qui serait l'image par défaut) de manière à l'adapter à chaque ColWidth[]... avec une méthode en cas de déplacement ou redimensionnement de la colonne ? Le problème est qu'il faut créer un nombre important de TBitmap si la largeur des colonnes diffères. Une idée serait de créer le plus long (large) et de le découper à la bonne taille... Je dois avouer mes limites en matière de dessin. Je ne veux pas de bibliothèque sophistiquée. C'est jouable de manière simple cette approche ?


    Cordialement. Gilles
    Dernière modification par Invité ; 01/08/2012 à 11h48.

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    Canvas.DrawRect (ou CopyRect ?) à partir d'un BitMap de largeur supérieure à la plus large colonne, mais ça oblige à connaître hauteur et largeur de la cellule...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre Expert

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Par défaut
    Je ne comprends pas non plus le problème.

    Pour ma part, j'utilisais un StretchDraw qui rendait très bien. Tout était fluide, le rendu donnait bien, donc tout allait bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Canvas.StretchDraw(CellRect(ACol, ARow), BmpSelect);
    Ou BmpSelect était un bitmap contenant le dégradé, de largeur 1pixel, et d'une hauteur supérieure a la hauteur max d'une ligne.

    Le résultat était très bien, très fluide, je m'en servais pour une surbrillance des cellules au survol de la souris. Je suis sous D2005 et Windows Seven. Regarde aussi du coté de DoubleBuffered.

    Pour ta remarque, clNone est, je pense, une couleur définie par le système pour je ne sais quelle raison. Il ne s'agit pas d'une couleur de transparence, mais d'une vraie couleur donc.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour mick605,

    J'ai lu la discussion à laquelle vous faites références. Je dois dire que cela ma dépasse complètement.

    Ok j'ai adopté votre méthode. Le DrawStrech fonctionne effectivement bien pour l'allongement horizontal. Le résultat est moins satisfaisant pour l'étirement vertical, mais là, même en "découpant", je n'ai pas d'autre solution (sauf à mettre une image d'une hauteur très importante...). Enfin, ceci est moins important. En effet, cela semble rester fluide... J'essayerai avec un RowCount significatif.

    Par contre je rencontre un autre problème que j'aurais aimé simplifier :
    Code actuel :
    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
     if (aCol >0 ) and (aRow >= FixedRows) and (arow = aRowSurvol) then begin
       { Dessin du fond }
       Canvas.StretchDraw(CellRect(ACol, ARow), Form1.Image2.Picture.Bitmap);
       //Canvas.Draw(aRect.Left+((aRect.Right-aRect.Left-Form1.Image2.Picture.Bitmap.Width) div 2),
       //  aRect.Top+((Arect.Bottom-aRect.Top-Form1.Image2.Picture.Bitmap.Height) div 2),Form1.Image2.Picture.Bitmap);
     
        { Texte }
        Canvas.Brush.style := bsClear;    //Après l'image si usage de TextOut
     
        //Déplacement
        InflateRect(aRect, -3, 0);    {Décalage abscisse du texte}
        aRect.Right:= aRect.Right -3; {Nécessaire  pour centrage et align. droite}
        if  Columns[aCol-1].Alignment <> taCenter then
            DrawText(Canvas.Handle, PChar(sTmp), Length(sTmp), aRect,
              DT_SINGLELINE or DT_VCENTER or DT_LEFT or DT_END_ELLIPSIS)
        else
            DrawText(Canvas.Handle, PChar(sTmp), Length(sTmp), aRect,
              DT_SINGLELINE or DT_VCENTER or DT_CENTER or DT_END_ELLIPSIS)
     
       //Canvas.TextStyle -> Default TextStyle of TextRect not TextOut... donc
     end;
    Résultat :


    Il existe un décalage horizontal entre l'affichage par défaut et le Drawtext... Savez-vous à quelle variable implantée dans le code de Lazarus il correspond ?

    Rq : valable également pour Canvas.TextOut(aRect.Left +3,aRect.Top +2,sTmp);
    Mais avec TextOut il faut régler en plus le problème de l'ordonnée notammant pour le centrage vertical.

    => Donc pour l'instant adoption de DrawText qui me semble plus simple.

    Cordialement. Gilles
    Dernière modification par Invité ; 02/08/2012 à 12h45.

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

Discussions similaires

  1. mettre une image en fond d'un TStringGrid
    Par farid0031 dans le forum C++Builder
    Réponses: 2
    Dernier message: 10/06/2009, 22h55
  2. Comment mettre une image en fond d'un TStringGrid
    Par blondelle dans le forum C++Builder
    Réponses: 5
    Dernier message: 25/11/2008, 19h13
  3. resizer une image de fond en fonction de la resolution
    Par the_edge dans le forum Général JavaScript
    Réponses: 30
    Dernier message: 02/11/2006, 14h47
  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

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