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

API, COM et SDKs Delphi Discussion :

[D2009]Comment faire un skin pour ma TStringGrid?


Sujet :

API, COM et SDKs Delphi

  1. #1
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut [D2009]Comment faire un skin pour ma TStringGrid?
    Hello ,

    Je viens de me remettre un peu au Delphi (au boulot, on utilise Qt alors ...) et j'aimerai personnaliser la TStringGrid. En effet, je trouve cette grille assez moche avec les bonnes grosses entêtes bien carrés et d'une couleur ... pas top du tout. Le souci, hé bien, c'est que je ne sais pas du tout par où chercher pour dire de faire une sorte de skin...

    Après avoir recherché un peu sur le net, je tombe surtout sur les outils pour faire des skin, genre SkinCrafter, AlphaControls et j'en passe...

    Quelqu'un a t-il des pistes pour dire de faire de jolis compos ? Comment on doit s'y prendre ?

    Merci

  2. #2
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 705
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 705
    Par défaut
    Question bête : jouer avec le OnDrawCell ne te suffit pas ?
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  3. #3
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Heu ...

    Je pensais que le OnDrawCell était spécifique aux cellules non figées... Faut que je regarde ça de plus près alors. J'ai dû mal comprendre une chose.

    Merci Lung

  4. #4
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Bon, ba j'ai regardé un peu... Désolé de ne répondre que maintenant, j'avais trouvé un compo assez sympa : TKGrid

    En fait, je cherche à faire un peu un style windows seven... Genre, dans une cellule, au survol, ça fasse un effet comme sur la photo ci dessous
    Nom : Cellule.png
Affichages : 98
Taille : 1,3 Ko

    Le petit hic, c'est que je ne vois pas comment appliquer 2 couleurs pour la même cellule

    Merci

  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
    Salut

    Comme dit plus haut, tu peux jouer avec les OnDrawCell qui s'appliquent a toutes les cellules ... Tu as juste a créer ton bitmap dégradé et à le peindre avec StretchDraw sur ta surface délimitée par Rect.

    J'avais fait une unité qui dessinais un dégradé un peu comme celui de ta pièce jointe ... Si ca t'intérresse, je m'en sert dans le composant ComboBox de mon Chat (dans ma signature) ... un peu de pub, ca fait pas de mal ...

    Bonne chance

  6. #6
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Salut Mick

    Oui, j'avais pensais à cette solution. J'aurai dû expliquer un peu plus en faite... Bon, c'est vrai, j'ai pas vraiment creusé plus que ça mais avec le bitmap j'ai quand même une questions/souci avec ça :

    - Mon bitmap, si il est trop petit (ou trop grand même), avec la méthode du StretchDraw, je risque de perdre en qualité ... Car le petit hic, c'est que je ne sais pas à l'avance la taille que pourra prendre ma cellule...

    Bon, c'est vrai que la taille ne devrait pas varier tant que ça, mais j'aimerai bien pouvoir m'affranchir directement du bitmap. En fait, j'aurai aimé appeler la méthode fillrect en spécifiant la moitié du Rect de la cellule avec une couleur X, et appeler une seconde fois la méthode avec une autre couleur de brush... Mais bon, je ne sais pas si c'est faisable, d'où la question précédente

    En tout cas, super ton chat
    Merci

  7. #7
    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

    Merci

    Je vais t'expliquer ma méthode. J'ai créé un bitmap de 50*1 pixels que j'utilise en StretchDraw. Avec 50 pixels, la résolution est très bonne, même si tu dessines sur 100*100 pixels, ce qui ne devrait pas t'arriver .... Si c'est trop petit, tu n'auras pas non plus de problème ...

    Sinon, oui, tu peux utiliser 2 fois FillRect, il te suffit de décomposer ton Rect de base en 2 TRect, et d'appeler successivement FillRect en changeant la couleur de Brush. Par contre, le rendu risque de ne pas être super, car dans ton image, il y a un léger dégradé de couleurs, ce que tu n'auras pas avec le FillRect. D'ou l'idée de base de créer un BitMap.

    Sinon, il y avait une autre méthode, mais je la trouve super galère ... Il te faut utiliser les unités Themes et UxTheme avec la méthode DrawIcon ... Avec ca, tu peux dessiner a peu près tous les composants de style Vista. Tu peux te débrouiller apres pour avoir le même dégradé que pour un TButton par exemple ... Je ne sais pas si je retrouverai le programme par contre ...

    Bonne chance

    Edit : Retrouvé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var t : TThemedElementDetails;
        r : trect;
    begin
        T.Element:=Themes.teButton;
        T.Part:=i-1;
        T.State:=j-1;
        ThemeServices.DrawIcon(Canvas.Handle,T,R,8,1);  //Les 2 derinères constantes peuvent être modifiées
    end;

  8. #8
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Salut Mick,

    Je te remercie pour tes recommandations

    En effet, l'effet du TRect ne me donnera pas de dégradé, je n'y avais pas pensé...

    Pour ce qui est du TThemedElementDetails, c'est vrai, je n'y avais même pas pensé! En plus, il y a quelques temps, je m'y étais intéressé! Le but étant de dessiner des checkboxes... Et j'y arrivé bien j'avoue.

    Encore merci pour tes retours d'expériences
    Je jetterai un oeil sur l'histoire du bitmap.

    @+

  9. #9
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut
    Salut Ero.

    Tu cherche a appliquer un dégrder sur une cellule ou autre ?

    genre ça



    a+

  10. #10
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Salut Buzz!

    Oui, ça peut être une des solutions envisageables. Soit un dégradé, soit faire une effet "glossy/crystal" (si je ne me trompe pas), un peu comme la capture que j'ai faite dans un de mes messages précédents

  11. #11
    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
    Tiens, je viens de retrouver le code que j'ai fait pour faire un effet Glass ... L'avantage c'est que tu peux modifier la teinte du BMP (parametre Hue). Ensuite, tu n'as qu'a faire un StretchDraw du ABitmap la ou tu le veux.

    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
    const
      SAT_BEGIN      = 200;
      SAT_MIDDLE     = 220;
      SAT_END        = 208;
      LUM_BEGIN      = 237;
      LUM_MIDDLEUP   = 233;
      LUM_MIDDLEDOWN = 229;
      LUM_END        = 225;
     
    var ABitmap : TBitmap;
     
    procedure DrawBitmapSelectionVista (Height : integer; Hue : byte);
    var i : integer;
        Sat, Lum : word;
    begin
      ABitmap.Height:=Height;
      ABitmap.Width:=1;
     
      for i:=0 to Height-1 do
      begin
        if i<=(Height div 2) then
        begin
          Sat:=SAT_BEGIN+((i*(SAT_MIDDLE-SAT_BEGIN)) div (Height div 2));
          Lum:=LUM_BEGIN-((i*(LUM_BEGIN-LUM_MIDDLEUP)) div (Height div 2));
        end
        else
        begin
          Lum:=LUM_MIDDLEDOWN-(((i-(Height div 2))*(LUM_MIDDLEDOWN-LUM_END)) div (Height div 2));
          Sat:=SAT_MIDDLE-(((i-(Height div 2))*(SAT_MIDDLE-SAT_END)) div (Height div 2));
        end;
     
        ABitmap.Canvas.Pixels[0,i]:=ColorHLSToRGB(Hue,Lum,Sat);
      end;
    end;

  12. #12
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Hello Mick ,

    Je prends note de ta méthode
    Je regarderais ça de plus près dès que j'ai un peu de temps devant moi.

    Merci

  13. #13
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Hé bien j'ai testé la solution de Mick (la dernière), et j'avoue, ça me va très bien.
    Bon, je vais poussé le bouchon un peu plus loin. Savez-vous comment faire pour modifier la couleur des lignes de la grille... Car ca fait "vulgère" la grosse bordure noire .... (voir photo de Buzz)

    Merci

  14. #14
    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
    Tu peux travailler comme tu veux avec le canvas de ta StringGrid ! Il te suffit de faire des :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    StringGrid1.Canvas.MoveTo; 
    StringGrid1.Canvas.LineTo;
    comme tu les souhaite ...

    Une technique simple consiste a ajouter dans le OnDrawCell un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    begin
      StringGrid1.Canvas.Pen.Color:=clBlue;
      StringGrid1.Canvas.Brush.Style:=bsClear;
      InflateRect(Rect,1,1);
      StringGrid1.Canvas.Rectangle(Rect);
    end;

  15. #15
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Par défaut
    Grand merci à toi Mick!

    C'est dingue comment j'ai pu perdre! Faut dire, ça fait bien longtemps que je n'ai plus pratiqué... Je vais surement faire ma grille avec ta méthode en mettant la propriété Ctl3d à false pour ne pas avoir cette grosseur de ligne dans les fixed cols/rows.

    Ca avec l'effet glass, ça va bien "rajeunir" ma p'tite grille

    Merci bien

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

Discussions similaires

  1. Comment faire des etats pour une application web ?
    Par ovh dans le forum Autres outils décisionnels
    Réponses: 6
    Dernier message: 06/07/2021, 04h25
  2. Comment faire un bouton pour envoyer un mail
    Par rafa55 dans le forum Access
    Réponses: 4
    Dernier message: 21/06/2006, 17h43
  3. [GUI-C++]Comment faire des Skin et un UI "Smooth"
    Par baert dans le forum Bibliothèques
    Réponses: 14
    Dernier message: 20/05/2006, 20h23
  4. [Débutant] Comment faire un compteur pour un bouton?
    Par Paulinho dans le forum AWT/Swing
    Réponses: 21
    Dernier message: 07/01/2006, 21h51
  5. Comment faire des menus pour DVD-vidéo
    Par BigBenQ dans le forum Vidéo
    Réponses: 3
    Dernier message: 21/11/2005, 12h37

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