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 :

Colorer un TScrollBar


Sujet :

C++Builder

  1. #1
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut Colorer un TScrollBar
    Bonjours
    J'ai cherche a avoir une Scrollbar avec une bande qui se colore avant la position du curseur, j'y suis parvenu, il me reste un probleme si le curseur est clique et deplace la bande reprend sa couleur d'origine et se recolore au relachement du click
    le code
    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
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
        //On enregistre la valeur initial la fonction WindowProc du Panel
        //Puis on lui assigne notre fonction NewWndProc
        FOriginalProc = ScrollBar1->WindowProc;
        ScrollBar1->WindowProc = NewWndProc;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ScrollBar1Scroll(TObject *Sender,
          TScrollCode ScrollCode, int &ScrollPos)
    {
    TControlCanvas * pcn = new TControlCanvas;
    pcn->Control = ScrollBar1;
    pcn->Brush->Color = clRed;
    int a = ((ScrollBar1->Width - 60));
    pcn->FillRect(Rect(20,0,20 + (((ScrollBar1->Position * a)-1)/100),ScrollBar1->Height));
    delete pcn;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ScrollBar1Change(TObject *Sender)
    {
    TControlCanvas * pcn = new TControlCanvas;
    pcn->Control = ScrollBar1;
    pcn->Brush->Color = clRed;
    int a = ((ScrollBar1->Width - 60));
    pcn->FillRect(Rect(20,0,20 + (((ScrollBar1->Position * a)-1)/100),ScrollBar1->Height));
    delete pcn;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::NewWndProc(TMessage& Message)
    {
    TControlCanvas * pcn = new TControlCanvas;
    pcn->Control = ScrollBar1;
    pcn->Brush->Color = clRed;
    int a = ((ScrollBar1->Width - 60));
    pcn->FillRect(Rect(20,0,20 + (((ScrollBar1->Position * a)-1)/100),ScrollBar1->Height));
    delete pcn;
    FOriginalProc(Message);
    }
    //---------------------------------------------------------------------------
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Tu pourrais dans NewWndProc filter le Message sur WM_PAINT, BACKGROUND, NCPAINT ... !
    Voir si il est possible de ne pas appeler FOriginalProc selon le Message (surtout si la fonctionne redessine après ton propre dessin)

    Que tu sois obligé de mette le code dans OnScroll et OnChange cela me semble beaucoup !

    Est-ce que dans le Message de NewWndProc reçois-tu WM_CTLCOLORSCROLLBAR ?
    Tu pourras renvoyer un Handle de Brush contenant le couleur de fond
    En 2007, le message était intercepté par la méthode CNCtlColorScrollBar de TScrollBar, tu dois donc pouvoir bosser dessus !
    DefWndProc utilisé dans CNCtlColorScrollBar est une propriété protégée, tu dois pouvoir donc y accéder par héritage ou par Hack (par du code Delphi)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut ShaiLeTroll
    Merci pour tes reponses
    WM_PAINT, BACKGROUND, NCPAINT ainsi que WM_CTLCOLORSCROLLBAR ne sont pas interceptes par NewWndProc, si je ne filtre pas des le relache du boutton gauche de la souris la barre coloree s'affiche, c'est pendant le MouseMove qu'il n'y a pas " colorisation "
    Je n'ai pas trouve dans l'aide en ligne " CNCtlColorScrollBar ", je continue a chercher
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    CNCtlColorScrollBar n'est pas documenté, c'est protégé, il faut lire le code

    Tu n'as pas lu mon lien vers la MSDN :
    The WM_CTLCOLORSCROLLBAR message is sent to the parent window of a scroll bar control when the control is about to be drawn. By
    Petit code d'un Heritage sauvage TScrollBar, cela ne fonctionne pas en C++Builder !

    Sinon modifie la WindowProc du Parent de la TScrollBox !

    Si c'est la Form, c'est très simple un classique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      BEGIN_MESSAGE_MAP
        VCL_MESSAGE_HANDLER(WM_CTLCOLORSCROLLBAR, TMessage, CNCtlColorScrollBar)
      END_MESSAGE_MAP(TForm)
    sinon à la Mano !
    Ce code fonctionne aussi bien pour la TForm ou un TPanel (c'est mon cas, un TPanel dans un TTabSheet d'un PageControl)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      TWndMethod ScrollBarColoredParentOldWindowProc;
      TBrush *FScrollBarColoredBrush;
      void __fastcall ScrollBarColoredParentNewWindowProc(Messages::TMessage &Message);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //---------------------------------------------------------------------------
    /*constructor*/__fastcall TVCLManipForm::TVCLManipForm(TComponent* Owner)
      : TForm(Owner)
    {
    ...    
      ScrollBarColoredParentOldWindowProc = ScrollBarColored->Parent->WindowProc;
      ScrollBarColored->Parent->WindowProc = ScrollBarColoredParentNewWindowProc;
    ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //---------------------------------------------------------------------------
    /*destructor*/__fastcall TVCLManipForm::~TVCLManipForm()
    {
      delete FScrollBarColoredBrush;
      FScrollBarColoredBrush = NULL;
    }
    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
     
    //---------------------------------------------------------------------------
    void __fastcall TVCLManipForm::ScrollBarColoredParentNewWindowProc(Messages::TMessage &Message)
    {
      if ((Message.Msg == WM_CTLCOLORSCROLLBAR) && (Message.LParam == (int)ScrollBarColored->Handle))
      {
        if ( ! FScrollBarColoredBrush)
          FScrollBarColoredBrush = new TBrush();
     
        if (CheckBoxScrollBarBitmap->Checked)
        {
          if ( ! FScrollBarColoredBrush->Bitmap)
            FScrollBarColoredBrush->Bitmap = ImageBMP->Picture->Bitmap;
        }
        else
        {
          FScrollBarColoredBrush->Bitmap = NULL;
          FScrollBarColoredBrush->Color = clMoneyGreen;
        }
     
        Message.Result = (int)FScrollBarColoredBrush->Handle;
      }
      else
        ScrollBarColoredParentOldWindowProc(Message);
    }
    J'ai triché, ImageBMP est un TImage que j'avais déjà (950x264, il affiche juste ce qu'il faut sans déformation et fait automatiquement une mosaïque si la barre est plus grande, c'est du plus bel effet), TVCLManipForm est un monstre depuis que je suis passé en C++Builder, j'y mets tous mes essais sur la VCL (bcp traduit de mes 10 ans de delphi)

    un code plus léger avec un TBitmap local : How to create a TScrollBar with a background bitmap
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    ShaiLeTroll j'ai essaye ton code qui modifie la couleur de fond de la ScrollBar, j'y ai ajoute mon code et on arrive a avoir une ScrollBar bicolore, il reste toujours un probleme lorsque l'on deplace le curseur lors du MOUSEMOVE la couleur donnee par mon code s'efface et s'affiche au relachement du boutton souris je post le code
    le .h
    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
     
    //---------------------------------------------------------------------------
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    #include <Graphics.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published: // IDE-managed Components
            TScrollBar *ScrollBar1;
            TButton *Button1;
            TCheckBox *CheckBox1;
            TImage *Image1;
    private: // User declarations
            void __fastcall ScrollBarColoredParentNewWindowProc(Messages::TMessage &Message);
    public:  // User declarations
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    le .cpp
    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
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
      TWndMethod ScrollBarColoredParentOldWindowProc;
      TBrush *FScrollBarColoredBrush;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
      ScrollBarColoredParentOldWindowProc = ScrollBar1->Parent->WindowProc;
      ScrollBar1->Parent->WindowProc = ScrollBarColoredParentNewWindowProc;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ScrollBarColoredParentNewWindowProc(Messages::TMessage &Message)
    {
    if ((Message.Msg == WM_CTLCOLORSCROLLBAR) && (Message.LParam == (int)ScrollBar1->Handle))
    {
            if ( ! FScrollBarColoredBrush)
            FScrollBarColoredBrush = new TBrush();
    if (CheckBox1->Checked)
    {
            if ( ! FScrollBarColoredBrush->Bitmap)
            FScrollBarColoredBrush->Bitmap = Image1->Picture->Bitmap;
    }
    else
    {
            FScrollBarColoredBrush->Bitmap = NULL;
            FScrollBarColoredBrush->Color = clBlue;
    }
        Message.Result = (int)FScrollBarColoredBrush->Handle;
      }
      else
        ScrollBarColoredParentOldWindowProc(Message);
    TControlCanvas * pcn = new TControlCanvas;
    pcn->Control = ScrollBar1;
    pcn->Brush->Color = clRed;
    int a = ((ScrollBar1->Width - 60));
    pcn->FillRect(Rect(20,0,20 + (((ScrollBar1->Position * a)-1)/100),ScrollBar1->Height));
    delete pcn;
    }
    //---------------------------------------------------------------------------
    Sur le net j'ai trouve un bout de code qui fait la meme chose mais sans TImage, ni TCheckBox, le probleme du MOUSEMOVE est toujours present
    le .h
    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
     
    //---------------------------------------------------------------------------
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published: // IDE-managed Components
            TScrollBar *ScrollBar1;
            void __fastcall FormCreate(TObject *Sender);
    private: // User declarations
            void __fastcall colorise_scrollbars(TMessage & Msg);
    public:  // User declarations
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    le .cpp
    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
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    TWndMethod wp;
    HBRUSH hb;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    wp = Form1->WindowProc;
    Form1->WindowProc = colorise_scrollbars;
    // Couleur du fond de la ScrollBar
    hb = CreateSolidBrush(RGB(0, 0, 255));
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::colorise_scrollbars(TMessage & Msg)
    {
    if((Msg.Msg == WM_CTLCOLORSCROLLBAR)) //&& (Msg.LParam == (int)ScrollBar1->Handle))
    {
    Msg.Result = (int)hb;
    }
    else
    {
    wp(Msg);
    }
    // Couleur avant le curseur
    TControlCanvas * pcn = new TControlCanvas;
    pcn->Control = ScrollBar1;
    pcn->Brush->Color = clRed;
    int a = ((ScrollBar1->Width - 60));
    pcn->FillRect(Rect(20, 0, 20 + (((ScrollBar1->Position + .4) * a )/100), ScrollBar1->Height));
    delete pcn;
    }
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par blondelle Voir le message
    ShaiLeTroll j'ai essaye ton code qui modifie la couleur de fond de la ScrollBar,
    Tout à fait, c'est son but

    Citation Envoyé par blondelle Voir le message
    j'y ai ajoute mon code et on arrive a avoir une ScrollBar bicolore,
    Je n'ai pas testé ton code, il écrase le dessin standard des boutons pour un carré rouge ?

    Je sais que l'on peut faire cela part style, faudrait voir les nouveautés de C++Builder XE2 à ce sujet (j'espère que les ScrollBar sont modifié avec le reste de l'application sinon ça fera tache)

    Citation Envoyé par blondelle Voir le message
    sans TImage, ni TCheckBox,
    mon code c'est une démo qui montre ce qui est faisable, les TCheckBox sont là pour faire cohabiter plusieurs codes, je n'ai jamais ce genre de chose dans une vraie application
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. Coloration syntaxique
    Par _-Sky-_ dans le forum Composants
    Réponses: 4
    Dernier message: 03/01/2004, 21h58
  2. [windows] recherche outils coloration syntax. pour -> htm
    Par hpfx dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 02/10/2003, 01h52
  3. Coloration syntaxique ASM dans un RichEdit
    Par Crick dans le forum Composants VCL
    Réponses: 5
    Dernier message: 20/12/2002, 01h53
  4. TObject->Color et composantes RGB
    Par Flo. dans le forum C++Builder
    Réponses: 10
    Dernier message: 14/06/2002, 17h07
  5. [Kylix] Memo color
    Par Metal3d dans le forum EDI
    Réponses: 1
    Dernier message: 21/05/2002, 17h12

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