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 :

Reactualiser la transparence d'un label


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 39
    Points : 18
    Points
    18
    Par défaut Reactualiser la transparence d'un label
    Bonjour,
    j'utilise un label sur un font de travail ou je fais du dessin
    Ce label est réactualisé toute les sec
    le font de travail peut changer de couleur en cliquant sur une zone avec la souris
    Mon problème est que la transparence du label ne se réactualise pas si je change la couleur du font de travail.
    il reste toujours avec une transparence liée au premier fond

    Comment faire?

    Merci d'avance

  2. #2
    Membre expérimenté
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Points : 1 427
    Points
    1 427
    Par défaut
    Regardes l'état de la propriété ParentColor.
    Si elle est à vrai, elle prendra la couleur de son parent, sinon, tu pourras lui en affecter une via la propriété Color.
    + + +

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 39
    Points : 18
    Points
    18
    Par défaut
    Merci bakaneko mais cela ne resous pas le probleme

    Que ParentColor soit true ou false j'ai le meme souci.
    En changeant le fond mon label garde le premier fond ce qui me rend un affichage assez génant

    Pour plus d'explication je travaille sur un graphique qui a un fond blanc avec des index noirs. Mais j'ai la posibilité de zoomer des parties du graphique. Donc j'ai définit des zones de selection qui ne sont que des rectangles de couleurs gris.

    Le probleme se situe lorsque je clique sur la partie ou se trouve mon label, j'ai la zone de selection grise qui apparait et lorsque mon label est réactualisé (par le timer) il est toujours avec un fond blanc

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 39
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    je sais vraiment pas comment faire avec ce probleme de rafraichissement. N'y aurais t'il pas qq qui a déja eu ce problème et qui pourrais m'aider.

    Merci d'avance

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 39
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    Pour comprendre mon problème je vous mets en lien deux captures d'écran qui traduisent le soucis

    Merci d'avance
    Images attachées Images attachées   

  6. #6
    Membre chevronné

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 377
    Points : 1 762
    Points
    1 762
    Par défaut
    Salut !

    Si tu ne trouves pas de solution avec un TLabel, il est possible de créer l'illusion avec un TCustomControl dont la mise en oeuvre n'est pas très compliquée.
    Le principe sera de copier dans la zone client de l'objet, le fond sous l'objet via son canvas, puis de dessiner la chaine et ce, dans une méthode Paint qu'il suffit de surchager.
    Sur ce forum, j'ai déjà donné du code allant dans ce sens (mais je ne me souviens plus du sujet ) alors peut-être avec une recherche...
    Celà dit.. ça ne me demandera que le temps de le rédiger...
    A plus !

  7. #7
    Membre expérimenté
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Points : 1 427
    Points
    1 427
    Par défaut
    Sinon, tu peux directement écrire sur ton Canvas avec la fonction TextOut.
    + + +

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 39
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    je n'utilise pas de Textout car je serais obligé de rafraichir toutes les secondes le fond qui est assez lourd puisque c'est un graphique. Ce qui provoque des petits sauts d'image qui ne sont pas réduit avec le double buffer

    C'est pour celà que j'avais déja posser la question sur le raffraichissement du textout

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Pour éviter le scintillement essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1.DoubleBuffered:=true;
    .
    Si ça ne marche pas j'ai un lien pour toi.
    Neilos

  10. #10
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour,

    Quand l'espace de travail change de couleur tu met :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Label1 -> Transparent = false ;
    Label1 -> Transparent = true ;
    bon courage ...
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 39
    Points : 18
    Points
    18
    Par défaut
    Merci pour les infos mais marche toujours pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Ecran10->Mesure->Transparent=false;
            setselect(&graphique,constTableau);
            Ecran10->Mesure->Transparent=true;
    j'ai essayé la solution d'enlever la transparence avant l'appel de la fonction permettant de créer mon rectangle de sélection et de le remettre en transparence après. Cela n'a rien changer je garde le fond blanc avec les index.

    Par contre ce qui est surprenant c'est que comme c'est un graphique je trace des courbes qui affiche un nouveau point toutes les trois sec, si je positionne mon label sur une courbe, je vois la courbe avancer sous mon label donc dans ce cas, il est bien transparent et il reactualise le fond.

    Moi pas comprendre pourquoi dans le cas ou le label est sur une courbe ca marche et dans le cas ou le label est sur une zone de selection ca ne marche pas.

    je précise que le test a été effectué avec le même label

    Regardez l'image que j'ai lié avec ce post
    Images attachées Images attachées  

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 39
    Points : 18
    Points
    18
    Par défaut
    Bonjour j'ai simplifié le problème
    Si qq pouvais testé mon exemple et me dire ce qui cloche
    je crée une Form qui a un label et un bouton
    pour le label transparent = true

    si je clique sur le bouton je créé un rectangle de couleur sur le label
    puis je rafraichis le label
    resultat label dans la couleur de la Form par défaut dans le rectangle de couleur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    Form1->Canvas->Brush->Color=clGray;
    Form1->Canvas->Rectangle(150,50,350,300);
    Form1->Label1->Refresh();
    }
    //---------------------------------------------------------------------------
    il y a pas plus simple

    et le prob est toujours la voir image ci dessous

    je suis sur que c'est une fonction a rajouté pas trop compliqué alors svp essayé ce bout de code qui prend 1 min et dites moi si vous avez compris mon erreur

    Millllllle Merci d'avance
    Images attachées Images attachées  

  13. #13
    Membre chevronné

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 377
    Points : 1 762
    Points
    1 762
    Par défaut
    Salut !

    Je te propose l'essai suivant, comprenant Form1, deux timers et une class jLabel dérivant de TCustomControl

    Timer1->Interval = 1000; //dessine le label
    Timer2->Interval = 1500; //graphisme sur la form, gère une modification des couleurs

    Ici j'utilise un bitmap pour dessiner puis je copie ce bitmap dans la zone client de Form1.
    Le bitmap fait office de double buffering donc ne pas l'activer.
    J'ai donné au label (jLabel) de quoi être déplacé sur la form, pour cet essai.

    Voici comment se présente le .h de l'unité

    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
    52
    53
    54
    55
    56
    57
    //---------------------------------------------------------------------------
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    //---------------------------------------------------------------------------
    class jLabel : public TCustomControl
    {
    private :
    AnsiString FCaption;
    protected :
        void __fastcall SetCaption(AnsiString N);
    public :
        __fastcall jLabel(TComponent *Owner);
        __fastcall ~jLabel();
        void __fastcall Paint();
     
        //-------------------------------------------------------------
        /*
        Pour cette démo je développe le mécanisme pour déplacer l'objet
        */
        TPoint Start;
        void __fastcall WhenDown(TObject *Sender, TMouseButton Button,
                    TShiftState Shift, int X, int Y);
        void __fastcall WhenMove(TObject *Sender, TShiftState Shift,
                    int X, int Y);
        void __fastcall WhenUp(TObject *Sender, TMouseButton Button,
                    TShiftState Shift, int X, int Y);
        //-------------------------------------------------------------
     
    __property AnsiString Caption={read=FCaption, write=SetCaption};
    };
     
    class TForm1 : public TForm
    {
    __published:	// Composants gérés par l'EDI
        TTimer *Timer1;
        TTimer *Timer2;
        void __fastcall FormPaint(TObject *Sender);
        void __fastcall FormResize(TObject *Sender);
        void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
        void __fastcall Timer1Timer(TObject *Sender);
        void __fastcall Timer2Timer(TObject *Sender);
    private:	// Déclarations de l'utilisateur
    public:		// Déclarations de l'utilisateur
        __fastcall TForm1(TComponent* Owner);
        //Méthode pour le graphisme
        void __fastcall DrawBitmap();
    };
    //--
    extern PACKAGE TForm1 *Form1;
    //--
    #endif

    Voici maintenant le .ccp de l'unité :

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    //--
    #include <vcl.h>
    #pragma hdrstop
     
    #include "Unit1.h"
    //--
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
     
    //--
    Graphics::TBitmap *Bitmap = new Graphics::TBitmap;
    COLORREF V1_Color = clRed;
    COLORREF V2_Color = clBlue;
    COLORREF V3_Color = clGreen;
    //--
     
    __fastcall jLabel::jLabel(TComponent *Owner)
        : TCustomControl(Owner)
    {
    if(Owner->InheritsFrom(__classid(TWinControl))) Parent = (TWinControl*)Owner;
    FCaption = "---";
    Canvas->Brush->Style = bsClear;
    Canvas->Font->Color = clBlack;
    Left = 10; Top = 10;
    BringToFront();
    }
    //--
    __fastcall jLabel::~jLabel()
    {
    }
    //--
    void __fastcall jLabel::Paint()
    {
    int we = Canvas->TextWidth(FCaption);
    int he = Canvas->TextHeight(FCaption);
    SetBounds(Left,Top,we,he);
    Canvas->CopyRect(Rect(0,0,we,he), Bitmap->Canvas, BoundsRect);
    Canvas->TextOut(0,0,FCaption);
    //--------------- pour le test
    OnMouseDown = WhenDown;
    }
    //--
    void __fastcall jLabel::SetCaption(AnsiString N)
    {
    FCaption = N;
    Paint();
    }
     
    //--------------pour le test
    void __fastcall jLabel::WhenDown(TObject *Sender, TMouseButton Button,
                    TShiftState Shift, int X, int Y)
    {
    OnMouseMove = WhenMove;
    OnMouseUp = WhenUp;
    Start = Point(X,Y);
    }
    //--------------pour le test
    void __fastcall jLabel::WhenMove(TObject *Sender, TShiftState Shift,
                    int X, int Y)
    {
    int left = Left + X - Start.x;
    int top = Top + Y - Start.y;
    SetBounds(left, top, Width, Height);
    Paint();
    }
    //--------------pour le test
    void __fastcall jLabel::WhenUp(TObject *Sender, TMouseButton Button,
                    TShiftState Shift, int X, int Y)
    {
    OnMouseMove = NULL;
    OnMouseUp = NULL;
    }
    //---------------------------------------------------------------------------
     
    jLabel *Label_A1;
     
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    Label_A1 = new jLabel(this);
    }
    //--
     
    void __fastcall TForm1::FormPaint(TObject *Sender)
    {
    DrawBitmap();
    }
    //--
    void __fastcall TForm1::FormResize(TObject *Sender)
    {
    DrawBitmap();
    }
    //--
    void __fastcall TForm1::DrawBitmap()
    {
    if(Bitmap != NULL)
        {
        int we = ClientWidth;
        int he = ClientHeight;
        if(Bitmap->Width != we) Bitmap->Width = we;
        if(Bitmap->Height != he) Bitmap->Height = he;
        TCanvas *C = Bitmap->Canvas;
        C->Brush->Style = bsSolid;
        C->Brush->Color = Color;
        C->FillRect(Rect(0,0,we,he));
     
        C->Brush->Color = (TColor)V1_Color;
        C->Rectangle(20,20,100,100);
     
        C->Brush->Color = (TColor)V2_Color;
        C->Ellipse(50,50, 200, 150);
     
        C->Brush->Color = (TColor)V3_Color;
        C->Rectangle(100, 40, 120, 400);
     
        Canvas->Draw(0,0,Bitmap);
        }
    }
    //--
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
    delete Bitmap;
    Bitmap = NULL;
    }
    //--
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    Label_A1->Caption = IntToStr(GetTickCount());
    }
    //--
    void __fastcall TForm1::Timer2Timer(TObject *Sender)
    {
    V1_Color = RGB(GetRValue(V1_Color) + 10,
                   GetGValue(V1_Color) - 15,
                   GetBValue(V1_Color) + 30);
     
    V2_Color = RGB(GetRValue(V2_Color) - 20,
                   GetGValue(V2_Color) + 20,
                   GetBValue(V2_Color) - 10);
     
    V3_Color = RGB(GetRValue(V3_Color) + 10,
                   GetGValue(V3_Color) + 20,
                   GetBValue(V3_Color) + 30);
    DrawBitmap();
    Label_A1->Repaint();
    }
    //--
    Ca devrait être une solution en attendant mieux !

    A plus !

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 39
    Points : 18
    Points
    18
    Par défaut
    Merci Henderson

    j'ai essayé et ca a l'air de bien marcher par contre je trouve cette solution un peu compliqué
    je vais l'intégré dans le code et je vais voir si ca colle

    mais encore merci pour le temps que tu as passé dessus

    Si qq avait une autre solution je reste preneur

  15. #15
    Membre chevronné

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 377
    Points : 1 762
    Points
    1 762
    Par défaut
    Salut !

    Elle semble compliquée parce que l'on passe par le développement d'une classe avec toute la rédaction du code inhérente à la conception.
    Par contre, une fois que c'est fait... ce n'est plus à faire en dehors peut-être de l'adapter à d'autres contextes !
    C'est aussi la problématique de l'utilisateur qui a toujours du mal à passer du coté de la conception.
    On peut opter pour une pêche aux composants miracles, alors qu'on a ces composants miraculeux au bout des doitgts !
    Le coût se mesure en temps perdu à attendre et surtout en énervement !

    A plus !

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 39
    Points : 18
    Points
    18
    Par défaut
    Ouais je suis d'accord par contre la pour l'intégré dans le code ca risque d'être assez difficile étant donné que sur l'Ecran je disposse d'une image, sur l'image j'ai dessiné un rectangle blanc et sur le rectangle blanc je peux dessiner un rectangle gris.ce qui fait que pour copier le fond du jLabel dans la bitmap c'est assez fastidieux mais je vais continuer d'essayer

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Points : 376
    Points
    376
    Par défaut
    Bonjour,

    Désolé si ma réponse peut paraître stupide, mais pourquoi ne pas utiliser une image pour dessiner dedans plutôt que de dessiner dans la form ?

    Pour reprendre ton petit exemple avec une form, un TLabel et un bouton, tu ajoutes un TImage sur la forme (chargée avec un bitmap blanc) et tu modifies le code d'activation du bouton par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Image1->Canvas->Brush->Color=clGray;
    Image1->Canvas->Rectangle(150,50,350,300);
    Label1->Refresh();
    Amicalement

Discussions similaires

  1. [Débutant] transparence d'un label
    Par oami89 dans le forum VB.NET
    Réponses: 2
    Dernier message: 10/04/2012, 23h48
  2. Transparance d'une label en c#
    Par AmineDev9 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 16/01/2009, 09h12
  3. [Debutant]Transparence sur un Label ou GroupBox
    Par ghan77 dans le forum Composants VCL
    Réponses: 1
    Dernier message: 15/12/2005, 16h53
  4. Réponses: 4
    Dernier message: 12/04/2005, 19h51
  5. [VB.NET] Comment garder un label transparent.
    Par djmcg dans le forum Windows Forms
    Réponses: 9
    Dernier message: 05/03/2005, 21h02

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