Paint Methode von TButton Überschreiben



  • Hallo.
    Ich versuche gerade das Erscheinungsbild meines Buttons zu ändern.
    Ich würde gern die Paint-Methode überschreiben.
    So jetzt ist mein erster Ansatz:
    Eine eigen Klasse von TCustomButtonControl ableiten die Paint-Methode überschreiben und fertig 🙂
    Leider gehts aber so net. Da er eine Methode namens "TextOutA(...)" nicht findet.
    Wie würds den richtig gehn?
    Gruß KY



  • Code zeigen.



  • also meine Klasse sieht so aus:

    class THeadButton : public TCustomButtonControl
    {
      private:
    
      public:
        THeadButton(TComponent * owner, TWinControl * parent):TCustomButtonControl(owner){};
        void __fastcall Repaint();
    };
    

    Hier wird se erzeugt:

    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
      close = new THeadButton(this,this);
      close->SetBounds(10,10,100,100);
    }
    

    Jetzt kommt volgende Fehlermeldung:

    [Linker Fehler] Unresolved external '__fastcall Actnctrls::TCustomButtonControl::DrawTextA(Types::TRect&, unsigned int&, System::AnsiString)' referenced from ...\HEADBUTTON\UNIT1.OBJ



  • DrawText ist eine Methode der Klasse TCanvas, also mußt du Canvas->DrawText() aufrufen.

    P.S: Das A hintendran wird durch die defines in der window.h erzeugt (und kann man vernachlässigen).



  • ich ruf aber DrawText(...) gar nirgends auf.
    Ich würde ja gern nur des Aussehen der Buttons ändern!



  • Hallo,

    Am einfachsten geht die ganze Sache doch über : Komponente -> Neue Komponente
    Dann den Vorfahrtyp angeben. Das Ganze sieht dann so aus :

    Header :

    //---------------------------------------------------------------------------
    
    #ifndef Button1H
    #define Button1H
    //---------------------------------------------------------------------------
    #include <SysUtils.hpp>
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    //---------------------------------------------------------------------------
    class PACKAGE TButton1 : public TButton
    {
    private:
    protected:
    public:
            __fastcall TButton1(TComponent* Owner);
    __published:
    };
    //---------------------------------------------------------------------------
    #endif
    

    CPP-Datei :

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    
    #pragma hdrstop
    
    #include "Button1.h"
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    // Mit ValidCtrCheck wird sichergestellt, daß die erzeugten Komponenten
    // keine rein virtuellen Funktionen besitzen.
    //
    
    static inline void ValidCtrCheck(TButton1 *)
    {
            new TButton1(NULL);
    }
    //---------------------------------------------------------------------------
    __fastcall TButton1::TButton1(TComponent* Owner)
            : TButton(Owner)
    {
    }
    //---------------------------------------------------------------------------
    namespace Button1
    {
            void __fastcall PACKAGE Register()
            {
                     TComponentClass classes[1] = {__classid(TButton1)};
                     RegisterComponents("Beispiele", classes, 0);
            }
    }
    //---------------------------------------------------------------------------
    

    Wird das Ganze jetzt compiliert, dann hast Du erstmal einen normalen TButton.
    Nun kannst Du alle benötigten Funktionen überschreiben wenn Du willst.
    Mit der Paint-Methode kannst Du das Aussehen verändern.

    Nash



  • Auf WebFritzi's Homepage gibts paar Buttons TBetterButton und TColorButton
    kannst ja mal schauen wie er es geschrieben hat

    http://www.webfritzi.de.vu/



  • Des mit der neuen Komponente hab ich auch schon gemacht, aber ist irgendwie etwas umständlich.
    Beim BCB6 kann ich eine Komponente und ein Projekt das meine Komponente nicht gleichzeitig entwickeln.
    Des Projekt, des meine Komponente verwendet, muss geschlossen sein.
    Und des ist mir zu blöd!



  • Erzeuge zum testen in deinem Projekt die Kommponente per Code, dann brauchste auch nicht das Projekt schliessen.



  • Des verstehe ich net was du meinst 🙂



  • Du setzt die Komponente per Code auf die Form die ja dann erst zur Laufzeit erstellt wird und nicht mit dem Formdesigner.
    Somit blockiert dein Projekt nicht mehr das neu installieren der Komponente falls du Änderungen gemacht hast.

    Also so:

    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    	THeadButton *HButton;
    
    	HButton = new THeadButton(this);
    
    	if (HButton) {
    		HButton->Parent=this;
    		HButton->Left=20;
    		HButton->Top=30;
    		HButton->Width=140;
    		HButton->Height=24;
    		HButton->Caption="Zur Laufzeit erzeugt";
    	}
    }
    


  • aaahhhh....
    natürlich
    *brettvormkopfwegschieb*
    mach sinn 🙂
    vielen dank!


Anmelden zum Antworten