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 ?
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
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
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
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
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
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 .
Oui comme la propose henderson.
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
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?
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
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
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
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:aint(); pourquoi doit il être rappelé ?
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; ... }
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.
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
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); } } //---------------------------------------------------------------------------
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
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 henderson:
Pour l'aide et tes explications
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
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
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
belle explication...Envoyé par henderson
en fait, c'est le principe du Super() en java, il me semble
Ils ne savaient pas que c'était impossible alors ils l'ont fait (Mark Twain)
_ _ _ _ _ _ _ _ _
La planète ne nous appartient pas, elle nous a été prêtée par nos enfants
_ _ _ _ _ _ _ _ _
Technos : Access, C++ Builder, SQL, PostgreSQL, Crystal Reports, XML entre autres
c'est quoi le soucy?Envoyé par blondelle
Ils ne savaient pas que c'était impossible alors ils l'ont fait (Mark Twain)
_ _ _ _ _ _ _ _ _
La planète ne nous appartient pas, elle nous a été prêtée par nos enfants
_ _ _ _ _ _ _ _ _
Technos : Access, C++ Builder, SQL, PostgreSQL, Crystal Reports, XML entre autres
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
--
Plutot que d'essayer de réinventer la roue, apprenons à nous en servir
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager