Est il possible d'ajouter la couleur a un TBevel en sachant que celui ci n'a pas de Canvas ?
Est il possible d'ajouter la couleur a un TBevel en sachant que celui ci n'a pas de Canvas ?
Salut !
TBevel dérive chez moi de TGraphicControl qui dispose d'un canvas.
Il faudrait essayer de dériver de TBevel et surcharger la méthode Paint... Juste pour tester !
A plus !
Merci henderson:
J'ai reussi a mettre de la couleur sur le Tbevel mais j'ai un soucis avec deux commandes " Shape " et " Style " celle ci ne fonctionnent plus je ne vois pas pour l'instant comment faire
le .cpp
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "BevelColor.h" #pragma package(smart_init) //--------------------------------------------------------------------------- // ValidCtrCheck is used to assure that the components created do not have // any pure virtual functions. // static inline void ValidCtrCheck(BevelColor *) { new BevelColor(NULL); } //--------------------------------------------------------------------------- __fastcall BevelColor::BevelColor(TComponent* Owner) : TBevel(Owner) { } //--------------------------------------------------------------------------- void __fastcall BevelColor::Paint() { RECT CoRect; CoRect.left = 0; CoRect.top = 0; CoRect.right = Width; CoRect.bottom = Height; Canvas->Brush->Color = Couleur; Canvas->FillRect(CoRect); } //--------------------------------------------------------------------------- void __fastcall BevelColor::SetCouleur(TColor Value) { FCouleur = Value; Invalidate(); } //--------------------------------------------------------------------------- namespace Bevelcolor { void __fastcall PACKAGE Register() { TComponentClass classes[1] = {__classid(BevelColor)}; RegisterComponents("Perso", classes, 0); } } //---------------------------------------------------------------------------
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 //--------------------------------------------------------------------------- #ifndef BevelColorH #define BevelColorH //--------------------------------------------------------------------------- #include <SysUtils.hpp> #include <Classes.hpp> #include <Controls.hpp> #include <ExtCtrls.hpp> //--------------------------------------------------------------------------- class PACKAGE BevelColor : public TBevel { private: TColor FCouleur; protected: virtual void __fastcall BevelColor::SetCouleur(TColor Value); public: __fastcall BevelColor(TComponent* Owner); void __fastcall Paint(); __published: __property Align; __property Anchors; __property TColor Couleur = {read=FCouleur, write=SetCouleur}; // new propriete __property Constraints; __property Cursor; __property Height; __property HelpContext; __property HelpKeyword; __property HelpType; __property Hint; __property Left; __property Name; __property ParentShowHint; __property Shape; __property ShowHint; __property Style; __property Tag; __property Top; __property Visible; __property Width; }; //--------------------------------------------------------------------------- #endif
Bonsoir Blondelle,
Je ne suis pas très doué, mais est ce que le problème ne vient pas de là :
Si je comprends bien, à chaque fois que l'on choisi la couleur, on retrace un rectangle ... Il faudrait prendre en compte le fait qu'un utilisateur puisse changer de couleur en pleine "création" sans pour autant effacer le canvas (sauf erreur de ma part, je pense qu'on l'efface à chaque fois que l'on modifie la couleur de font).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Canvas->Brush->Color = Couleur; Canvas->FillRect(CoRect);
Bon j'espère ne pas dire de bétise ... mais qui ne tente rien n'a rien![]()
Merci ero-sennin:
Je ne pense pas etre plus doue, mais c'est sans doute ce qui se passe, je n'ai pas encore trouve comment retrouver les fonctions qui sont devenues inactives
Ta méthode paint, c'est une surcharge de la méthode de l'ancêtre?
Niveau C++, j'ai pas encore attaqué les composants dérivés... je suis plus doué en Delphi.
Salut !
Tu peux essayer de rajouter un appel à TBevel::Paint dans la méthode Paint de ta classe dérivée, en dernière ligne :
A plus !
Code : Sélectionner tout - Visualiser dans une fenêtre à part TBevel::Paint();
Merci henderson:
J'ai integre ton code et j'ai recupere toutes les fonctions perdues.
Cette facon de proceder est elle valables pour recuperer toutes les fonction d'origine d'un composant que l'on derive?
Je remercie henderson qui ma beaucoup aide, je poste le code complet et je joind l'icone qui va avec le composant
le .cpp
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "BevelColor.h" #pragma package(smart_init) //--------------------------------------------------------------------------- // ValidCtrCheck is used to assure that the components created do not have // any pure virtual functions. // static inline void ValidCtrCheck(BevelColor *) { new BevelColor(NULL); } //--------------------------------------------------------------------------- __fastcall BevelColor::BevelColor(TComponent* Owner) : TBevel(Owner) { FCouleur = clBtnFace; // couleur par default a la creation } //--------------------------------------------------------------------------- void __fastcall BevelColor::Paint() { TBevel::Paint(); RECT CoRect; CoRect.left = 5; CoRect.top = 5; CoRect.right = Width - 5; CoRect.bottom = Height - 5; Canvas->Brush->Color = Couleur; Canvas->FillRect(CoRect); } //--------------------------------------------------------------------------- void __fastcall BevelColor::SetCouleur(TColor Value) { FCouleur = Value; Invalidate(); } //--------------------------------------------------------------------------- namespace Bevelcolor { void __fastcall PACKAGE Register() { TComponentClass classes[1] = {__classid(BevelColor)}; RegisterComponents("Perso", classes, 0); } } //---------------------------------------------------------------------------
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 //--------------------------------------------------------------------------- #ifndef BevelColorH #define BevelColorH //--------------------------------------------------------------------------- #include <SysUtils.hpp> #include <Classes.hpp> #include <Controls.hpp> #include <ExtCtrls.hpp> //--------------------------------------------------------------------------- class PACKAGE BevelColor : public TBevel { private: TColor FCouleur; protected: virtual void __fastcall BevelColor::SetCouleur(TColor Value); public: __fastcall BevelColor(TComponent* Owner); void __fastcall Paint(); __published: __property Align; __property Anchors; __property TColor Couleur = {read=FCouleur, write=SetCouleur}; // new propriete __property Constraints; __property Cursor; __property Height; __property HelpContext; __property HelpKeyword; __property HelpType; __property Hint; __property Left; __property Name; __property ParentShowHint; __property Shape; __property ShowHint; __property Style; __property Tag; __property Top; __property Visible; __property Width; }; //--------------------------------------------------------------------------- #endif
Salut Blondelle,
Je vois que tu as réussi à résoudre ce problème !
Je m'y été attardé un peu ce matin mais sans résultat ...![]()
Bon, maintenant, je voudrai savoir concernant ce code quelle(s) étai(en)t les erreurs ... et pourquoi ça ne fonctionnait pas.
Le TBevel:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void __fastcall BevelColor::Paint() { TBevel::Paint(); ... CoRect.left = 5; CoRect.top = 5; CoRect.right = Width - 5; CoRect.bottom = Height - 5; ... }aint(); pourquoi doit il être rappelé ?
Ensuite le 5 et -5 correspondent à la bordure du Bevel lorsqu'on change le style ??
Merci d'avance![]()
Salut ero-sennin:
Pour le TBevel:aint(); , il faudra voir avec le Maitre henderson
![]()
Pour les dimension 5, -5, si on prend les valeurs du Trect on ne voit pas les fonctions Shape et Style.
J'ai poste le code et l'icone tu peu tester pour voir la difference, regarde les tuto de CGI sur les composants![]()
Si quelqu'un a une amelioration qu'il en fait part je laisse le post ouvert encore quelque temps.
J'ai apporte une petite amelioration a mon code, et les couleurs sont moins baveuses.
Le .cpp
Enfin un peu de couleur dans ce triste TBevel
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 //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "BevelColor.h" #pragma package(smart_init) //--------------------------------------------------------------------------- // ValidCtrCheck is used to assure that the components created do not have // any pure virtual functions. // static inline void ValidCtrCheck(BevelColor *) { new BevelColor(NULL); } //--------------------------------------------------------------------------- __fastcall BevelColor::BevelColor(TComponent* Owner) : TBevel(Owner) { FCouleur = clBtnFace; // on force la couleur par default a l'ouverture } //--------------------------------------------------------------------------- void __fastcall BevelColor::Paint() { RECT CoRect; CoRect.left = 2; CoRect.top = 2; CoRect.right = Width - 2; CoRect.bottom = Height - 2; Canvas->Brush->Color = Couleur; Canvas->FillRect(CoRect); TBevel::Paint(); } //--------------------------------------------------------------------------- void __fastcall BevelColor::SetCouleur(TColor Value) { FCouleur = Value; Invalidate(); } //--------------------------------------------------------------------------- namespace Bevelcolor { void __fastcall PACKAGE Register() { TComponentClass classes[1] = {__classid(BevelColor)}; RegisterComponents("Perso", classes, 0); } } //---------------------------------------------------------------------------![]()
Salut !
Le principe est le même pour un composant :
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 class jBevel : public TBevel { private : TColor FColor; void __fastcall Paint(); protected : void __fastcall SetColor(TColor Value); public : __fastcall jBevel(TComponent *Owner); __fastcall ~jBevel(); __published : __property TColor Color={read = FColor, write=SetColor}; };
Pour le test, à mon niveau :
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 __fastcall jBevel::jBevel(TComponent *AOwner) : TBevel(AOwner) { if(AOwner->InheritsFrom(__classid(TWinControl))) Parent = (TWinControl*)AOwner; FColor = clAqua; Shape = bsLeftLine; } __fastcall jBevel::~jBevel() { } void __fastcall jBevel::SetColor(TColor Value) { FColor = Color; Repaint(); } void __fastcall jBevel::Paint() { Canvas->Brush->Color = FColor; Canvas->Brush->Style = bsSolid; Canvas->FillRect(Rect(0,0,Width, Height)); Canvas->Brush->Style = bsClear; TBevel::Paint(); //Appel de Paint de la strate TBevel pour dessiner les bordures }
Cette classe jBevel dérive de TBevel qui dérive de TGraphicControl qui dérive de TControl.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 jBevel *Bevel; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { Bevel = new jBevel(this); Bevel->SetBounds(20,20,150,150); } //---------------------------------------------------------------------------
La méthode Paint n'existe qu'à partir de TGraphicControl : virtual void __fastcall Paint(void);
Les concepteurs de BCB l'ont surchargée avec une méthode permettant de ne dessiner que des bordures pour en faire un TBevel.
La méthode Paint de la classe jBevel ne fait que surcharger la méthode Paint de TGraphicControl, sans réécrire celle de TBevel.
Cette surcharge est à comparer à une succession d'initialisations (au fil des mécanismes internes liés à la construction de dérivation en dérivation) d'un pointeur vers fonction.
Il est clair que c'est la dernière initialisation qui prime !
Donc si jBevel ne surchargeait pas Paint, jBevel hériterait bêtement (mécaniquement) de celle de TBevel.
Dans la méthode Paint de jBevel on effectue un appel à une méthode qui relève d'une strate en amont (TBevel) d'où la syntaxe : TBevel::Paint();
A plus !
Merci pour ces explications Henderson![]()
et également à toi Blondelle pour ce petit bout de code
![]()
Pas de probleme c'est avec plaisir par contre si tu a une solution pour avoir plusieurs nouveaux composants en meme temps dans la barre d'outils je suis preneur![]()
belle explication...Envoyé par henderson
en fait, c'est le principe du Super() en java, il me semble
J'ai plusieurs sources de composants, mais je n'arrive pas a les avoir tous dans la barre d'outils, quand je compile un composant a l'installation il ecrase le precedent, et je n'ai que le dernier composant cree, sur ce coup la je suis nul![]()
Partager