Auf TPanel zeichnen möglich?



  • Hallo Gemeinschaft,

    wie kann ich auf einem TPanel zeichnen?

    Folgendes Problem: Ich habe auf einem Panel mehrere Label. Diese haben leider keine Grenzlinie (Border) oder dreidimensionale Darstellung, deshalb würde ich gern einen Rahmen um die Label zeichnen lassen.
    Ich habe schonmal einen "handgezeichneten" ProgressBar auf einem StatusBar-Panel realisiert, allerdings hatte ich da das Ereignis DrawPanel zur Verfügung. So ein Ereignis gibt es aber bei TPanel nicht... 😞

    Vielen Dank für's Lesen und ggf. für's Antworten

    MfG



  • 1. Setz doch die Labels in eigene Panels und gib denen nen Rahmen
    2. Mach ne Kompo abgeleitet von TPanel und mach die
    Property Canvas public/Published. dann kannste malen.

    Gruss
    frank



  • Auch diese Frage kann ich Dir beantworten. 🙂
    Warum verwendest Du kein Panel als Label? Ist ein bisschen Overkill, das Teil hat aber Ränder, eine Beschriftung und was es noch alles braucht.



  • DerAltenburger schrieb:

    1. Setz doch die Labels in eigene Panels und gib denen nen Rahmen

    witte schrieb:

    Warum verwendest Du kein Panel als Label?

    Verblüffend einfach, Danke, aber...

    witte schrieb:

    Ist ein bisschen Overkill, das Teil hat aber Ränder, eine Beschriftung und was es noch alles braucht.

    ...ich würd' gern sauber zu programmieren, also muss ich wohl die Version nehmen:

    DerAltenburger schrieb:

    2. Mach ne Kompo abgeleitet von TPanel und mach die
    Property Canvas public/Published. dann kannste malen.

    Da waren sie wieder, meine 3 Probleme... Wie mach ich jetzt die Kompo am einfachsten? Wollte schon immer mal eine selbst schreiben, daraus ist aber bisher nie was geworden. Daher bin ich etwas überfordert... Könnt ihr mir dabei helfen?



  • Hallo

    Das Forum hat ein Tutorial zum Thema Komponenten entwickeln.

    bis bald
    akari



  • Danke akari, da bin ich schon drin 🙂



  • @Kolumbus: von welcher Komponente willste jetzt ableiten? Von TPanel, weil die direkte Verwendung von TPanel zu teuer ist?🙄



  • Hallo

    @Kolumbus : Was erwartest du? Das ist die passende Antwort auf deine schwammige Frage

    Wollte schon immer mal eine selbst schreiben, daraus ist aber bisher nie was geworden. Daher bin ich etwas überfordert... Könnt ihr mir dabei helfen?

    bis bald
    akari



  • Ganz kurz:
    .H- datei

    //---------------------------------------------------------------------------
    #ifndef CanvasPanelH
    #define CanvasPanelH
    //---------------------------------------------------------------------------
    #include <SysUtils.hpp>
    #include <Controls.hpp>
    #include <Classes.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    //---------------------------------------------------------------------------
    typedef void __fastcall (__closure *TCanvasPanelAfterPaint)(TCanvas *ACanvas,TRect ARect);
    //---------------------------------------------------------------------------
    class PACKAGE TCanvasPanel : public TPanel
    {
    private:
            TCanvasPanelAfterPaint FOnAfterPaint;
            virtual void __fastcall Paint(void);
    protected:
    public:
            __fastcall TCanvasPanel(TComponent* Owner);
    __published:
            __property Canvas;
            __property TCanvasPanelAfterPaint OnAfterPaint={read=FOnAfterPaint,write=FOnAfterPaint};
    };
    //---------------------------------------------------------------------------
    #endif
    

    .cpp- Datei

    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    
    #include "CanvasPanel.h"
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    // ValidCtrCheck wird benutzt, um sicherzustellen, daß die erzeugten Komponenten keine
    // rein virtuellen Funktionen haben.
    //
    
    static inline void ValidCtrCheck(TCanvasPanel *)
    {
            new TCanvasPanel(NULL);
    }
    //---------------------------------------------------------------------------
    __fastcall TCanvasPanel::TCanvasPanel(TComponent* Owner)
            : TPanel(Owner)
    {
      DoubleBuffered=true;
    }
    //---------------------------------------------------------------------------
    void __fastcall TCanvasPanel::Paint(void)
    {
      TPanel::Paint();
      if (FOnAfterPaint!=NULL)
      { FOnAfterPaint(Canvas,ClientRect);
      }
    }
    //---------------------------------------------------------------------------
    namespace Canvaspanel
    {
            void __fastcall PACKAGE Register()
            {
                     TComponentClass classes[1] = {__classid(TCanvasPanel)};
                     RegisterComponents("Image", classes, 0);
            }
    }
    //---------------------------------------------------------------------------
    

    Damit geht:
    1. direct in Canvas Zeichnen (nicht zu empfehlen ???)
    2. Immer nach dem Zeichnen des Panels in OnAfterPaint- Ereignis zeichnen.

    Das muss dann nur in eine Komponente rein.

    Gruss
    frank



  • @ witte: Gute Frage...eigentlich könnt' ich ja von TLabel ableiten und da nen Rahmen drumzeichnen, oder? Oder ich leite von TEdit ab und füge Möglichkeiten für Textausrichtung (Alignment und Layout wie beim Label) hinzu? Weil die gefehlt haben, habe ich TLabel genommen. Oder ich mache für das Panel das Zeichnen public? Keine Ahnung was nun besser ist...

    @ akari: Cool down please 🙂 Die Frage nach Hilfe war etwas voreilig... erstmal muss ich mir natürlich das Tut. reinziehen und dann weiß ich hoffentlich, wo ich noch Hilfe brauch und kann konkret Fragen stellen!

    @ DerAltenburger: Danke, ich schau's mir an!



  • Hallo Kolumbus,

    nim doch einfach die TStaticText Komponente.
    Die hat Border und Bevel Properties.

    Gruß Peter.



  • Hallo,

    @Peter24: Danke für den Hinweis! 🙂

    Die Komponente passt leider auch nicht ganz, da bei dieser die Layout-Eigenschaft fehlt um den Text vertikal auszurichten. Aber sonst passt sie ziemlich gut. Sie könnte also auch als Vorlage für meine eigene Komponente dienen, was es mir nicht gerade einfacher macht.

    Leider ist das Tut. zur Komponentenentwicklung stellenweise sehr schwer zu verstehen, wegen a) Rechtschreibung und Grammatik und weil es b) einige Zusammenhänge etwas schnell abhandelt bzw. unverständlich darstellt... aber ich will mich nicht beschweren, wenigstens gibt es ein Tut - ich schaffe das! :schland:

    MfG



  • Es gibt eine einfacher Möglichkeit

    TCanvas* PictureCanvas;
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    PictureCanvas = new  TCanvas;
    PictureCanvas->Handle=GetWindowDC(Panel1->Handle);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
    delete PictureCanvas;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Panel1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y)
    {
    PictureCanvas->Ellipse(0,0,Panel1->Width,Panel1->Height);
    }
    //---------------------------------------------------------------------------
    


  • [Edit] falscher Thread...


Log in to reply