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 :

composant perso et transparence


Sujet :

C++Builder

  1. #1
    Membre régulier Avatar de jehrikhan
    Inscrit en
    Mars 2008
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 90
    Points : 89
    Points
    89
    Par défaut composant perso et transparence
    Bonjour a tous, je me suis créé un composant VCL du genre bouton rectangle avec les bords arondis.
    Le bouton fonctionne sans soucis, mais mon problème c'est que lorsque que je le pose sur une form avec une couleur de fond on voit le contour du bouton en gris.


    Y'a-t-il un moyen de passer le composant en transparent pour qu'il prenne la couleur de fond de la form ou quelque chose du genre?

    voici le code de mon composant :

    MyButton.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
    29
    30
    31
    32
    33
    34
    35
    36
    //---------------------------------------------------------------------------
     
    #ifndef MyButtonH
    #define MyButtonH
    //---------------------------------------------------------------------------
    #include <SysUtils.hpp>
    #include <Classes.hpp>
    #include <Controls.hpp>
    //---------------------------------------------------------------------------
    class PACKAGE TMyButton : public TCustomControl
    {
    private:
      bool FEtat; // Etat du bouton // TRUE : appuyé//false : au repos
      AnsiString FCaption; //texte a afficher sur le bouton
      Graphics::TBitmap *BtOn;
      Graphics::TBitmap *BtOff;  
      void __fastcall SetEtat(bool AEtat);
      void __fastcall SetCaption(AnsiString ACaption);
      TNotifyEvent OnClickChange;
     
    protected:
      void __fastcall Paint();
      DYNAMIC void __fastcall MouseDown(TMouseButton Button, Classes::TShiftState Shift, int X, int Y);
      DYNAMIC void __fastcall MouseUp(TMouseButton Button, Classes::TShiftState Shift, int X, int Y);
     
    public:
      __fastcall TMyButton(TComponent* Owner);
      __fastcall ~TMyButton();
     
    __published:
      __property AnsiString Caption = {read=FCaption,write=SetCaption};
      __property bool Etat = {read=FEtat, write=SetEtat};
      __property TNotifyEvent OnClick = {read=OnClickChange, write=OnClickChange};
    };
    //---------------------------------------------------------------------------
    #endif
    MyButton.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
    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
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
     
    #pragma hdrstop
    //resource contenant les images pour le bouton
    #pragma resource "bt.res" 
    #include "MyButton.h"
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    //  ValidCtrCheck est utilisé pour vérifier que les composants créés n'ont
    // aucune fonction virtuelle pure.
    //
     
    static inline void ValidCtrCheck(TMyButton *)
    {
      new TMyButton(NULL);
    }
    //---------------------------------------------------------------------------
    __fastcall TMyButton::TMyButton(TComponent* Owner)
      : TCustomControl(Owner)
    {
      Width = 81;
      Height = 33;
      FEtat = false;
      //charge les images du bouton depuis la resource
      BtOn = new Graphics::TBitmap();
      BtOn->LoadFromResourceName((int)HInstance,"BT_ON");
      BtOff = new Graphics::TBitmap();
      BtOff->LoadFromResourceName((int)HInstance, "BT_OFF");
      BtOn->Transparent= true;
      BtOff->Transparent=true;
     
      Caption = "MyButton";
    }
    //---------------------------------------------------------------------------
    __fastcall TMyButton::~TMyButton()
    {
      delete BtOn;
      delete BtOff;
    }
    //---------------------------------------------------------------------------
    void __fastcall TMyButton::Paint()
    {
      if (FEtat == true)
        Canvas->Draw(0,0,BtOn);
      else
        Canvas->Draw(0,0,BtOff); 
     
      // écrit le texte du bouton
      TRect RText;
      RText = ClientRect;
      RText.top = 6;
      HDC hdc = GetDC(Handle);
      SetBkMode(hdc, TRANSPARENT);
      HPEN pen = CreatePen(PS_DASH,0,RGB(0,0,0));
      SelectObject(hdc, pen);
      DrawText(hdc, FCaption.c_str(), FCaption.Length(), &RText, DT_VCENTER|DT_CENTER);
    }
    //---------------------------------------------------------------------------
    void __fastcall TMyButton::SetEtat(bool AEtat)
    {
      if(FEtat!=AEtat)
      {
        FEtat = AEtat;
        if(OnClickChange!=NULL) OnClickChange(this);
        Invalidate();
      }
    }
    //---------------------------------------------------------------------------
    void __fastcall TMyButton::SetCaption(AnsiString ACaption)
    {
      if(FCaption != ACaption)
        FCaption = ACaption ;
      Invalidate();
    }
    //---------------------------------------------------------------------------
    void __fastcall TMyButton::MouseDown(TMouseButton Button, Classes::TShiftState Shift, int X, int Y)
    {
      Etat = true;
    }
    //---------------------------------------------------------------------------
    void __fastcall TMyButton::MouseUp(TMouseButton Button, Classes::TShiftState Shift, int X, int Y)
    {
      Etat = false;
    }
    //---------------------------------------------------------------------------
     
    namespace Mybutton
    {
      void __fastcall PACKAGE Register()
      {
         TComponentClass classes[1] = {__classid(TMyButton)};
         RegisterComponents("Perso", classes, 0);
      }
    }

    merci d'avance

  2. #2
    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 jehrikhan
    Deux liens sur la creation de composants par CGI, sur le Site
    http://chgi.developpez.com/compo7/

    http://chgi.developpez.com/compo6/
    Je vous mets en prime un deuxième contôle fenêtré à télécharger : Colorbtn.zip

  3. #3
    Membre régulier Avatar de jehrikhan
    Inscrit en
    Mars 2008
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 90
    Points : 89
    Points
    89
    Par défaut
    merci pour ta réponse blondelle.
    Enfin mon soucis était surtout de trouver comment ajouter la propriété Transparent a mon composant.
    Ce qui a priori n'est pas possible pour un objet héritant de TCustomControl, il faut donc le faire hériter de TGraphicControl

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

Discussions similaires

  1. Taille composant perso via le layout ?
    Par Neilos dans le forum Composants
    Réponses: 6
    Dernier message: 04/12/2005, 17h33
  2. [C#]Problème sur composant perso (Bouton Transparent)
    Par SLE dans le forum Windows Forms
    Réponses: 1
    Dernier message: 06/10/2005, 00h12
  3. Composant perso disparaît lors du redimensionnement du composant parent
    Par GENERYS dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 05/10/2005, 22h07
  4. Rendre un composant perso Scrollable
    Par GENERYS dans le forum Composants
    Réponses: 2
    Dernier message: 26/09/2005, 14h36
  5. Réponses: 1
    Dernier message: 08/07/2005, 02h46

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