Kleines Kreischen malen



  • Ja also ich habe jetzt noch ein bisschen herumprobiert.

    Habe ein Label erstellt und das versucht:

    this->lb->Canvas->Pen->Color = clBlack;
      this->lb->Canvas->Brush->Color = clBlack;
      this->lb->Canvas->Rectangle(5,5, 10,10);
      this->lb->Canvas->Refresh();
      this->lb->Repaint();
      this->lb->Refresh();
    

    Es passiert: NICHTS

    Ist mein ganzes Projekt kaputt oder wie? find ich sehr sehr komisch...

    Was mich auch gewunder hat, ist, dass der Borland Builder das neue Label nicht autmoatisch in die Klassendefinition eingefügt hat:

    TLabel *lb;
    

    musste ich selbst in TForm1 einfügen.

    Also sieht es so aus, als sei mein Compiler irgendwie kaputt?



  • Selbst in einem neuen Projekt tut sich so überhaupt nix:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    this->lb->Canvas->Pen->Color = clBlack;
      this->lb->Canvas->Brush->Color = clBlack;
      this->lb->Canvas->Rectangle(5,5, 10,10);
      this->lb->Canvas->Refresh();
      this->lb->Repaint();
      this->lb->Refresh();
    }
    //---------------------------------------------------------------------------
    


  • Du zeichnest von Hand in dein Label und überzeichnest es nachher, indem du die automatische Paint-Funktion der Komponente aufrufst?



  • Also falls noch einem was einfällt, dann wäre ich wirklich sehr dankbar!

    Ich geh jetzt erstmal ins Bettechen. Machts gut!



  • Da haben wir wohl gleichzeitig geschrieben.

    Wenn ich repaint() rausnehme, geschieht immer noch nichts 😞



  • void __fastcall TForm4::Button1Click(TObject *Sender)
    {
    	this->lb->Canvas->Pen->Color = clBlack;
      this->lb->Canvas->Brush->Color = clBlack;
      this->lb->Canvas->Rectangle(1,1, 5,5);
    
    }
    

    funtioniert bei mir wunderbar
    Das problem ist aber, dass Label ein dynamisch-"komisches" verhalten der grösse (width-height) hat.. deshalb bei mir gefüllt mit

    lb->Caption = "                                                  ."
    

    halt testweise



  • Sehr sehr seltsam.

    Dein Beispiel funktioniert!

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      this->lb->Canvas->Pen->Color = clBlack;
      this->lb->Canvas->Brush->Color = clBlack;
      this->lb->Canvas->Rectangle(1,1, 5,5);
    }
    //---------------------------------------------------------------------------
    

    Nur direkt in FormCreate() geht es nicht. Warum nicht?

    Vielleicht ist das auch die Lösung meines Problems. Ich muss mal schauen...

    Weil letztendlich passiert das bei mir alles in FormCreate (Dort wird der Controller erzeugt, der dann das Model mit den Labels erzeugt, usw.)



  • Das mit der größe und der Caption lässt sich übrigens mit AutoSize = false lösen. So passt es bei mir dann.
    Trotzdem würde mich jetzt noch interessieren, warum das in FormCreate nicht geht



  • Ich denke mal, dass >NACH< FormCreate ein Repaint() oder ähnliches kommt.
    Danach sind deine sachen überzeichnet. Am besten dafür ein OnPaint-Erreignis nutzen oder Message abfangen.

    Da zB nach Minimieren und wieder Maximieren oder Fenster darüber ziehen (Einfach, dass das Label neu gezeichnet werden muss) ist dein Rechteck weg.



  • Hallo

    Ja, das hab ich ja schon von Anfang an gesagt : TLabel hat kein OnPaint-Event, also sind alle Zeichnung flüchtig. Verwende TImage oder TPaintBox anstelle des TLabels, und zeichne eben auch noch den Text selber.

    Die Alternative, bei TLabel noch zusätzlich die eintsprechende WinAPI-Message abzufangen und sozusagen selber einen OnPaint-Event zu erzeugen, ist für Anfänger nur noch undurchschaubarer und komplizierter.

    bis bald
    akari



  • Hallo,

    und ich muss meine Festellung im obigen Post zurückziehen.
    Die Farbeinstellung im Konstruktor sorgt eigentlich nur für die Hintergrundfarbe des Labels und war kein Canvas->Rectangle...
    War wohl gestern 'n langer Tag für mich.

    *EimerAscheüberdenKopfkipp* 🙄



  • Ich bedanke mich vielmals bei euch!

    TImage ist geradezu perfekt für mein Vorhaben. Ich erzeuge so jetzt einen schönen Kreis im Konstruktor:

    this->Canvas->Brush->Color = clBlack;
           this->Canvas->FillRect(TRect(0,0,width,height));
    
           this->Canvas->Brush->Color = cl;
           this->Canvas->Ellipse(0,0, width, height);
    

    Und bei einem Klick wird der Kreis gefärbt:

    this->Canvas->Brush->Color = pl->getColor();
           this->Canvas->Ellipse(0,0, this->Width, this->Height);
    

    Vielen Dank!



  • Kann ich es irgendwie hinbekommen, dass die Kreise scharfe Ränder haben?
    Das wär jetzt noch ein kleiner Schönheitsfehler, aber ist nicht so schlimm



  • Hallo

    Was meinst du mit scharfen Rändern? Die Genauigkeit ist natürlich durch die Auflösung beschränkt. "Runder" wird es nur durch Interpolation, was das VCL-Canvas aber nicht beherrscht. Eventuell gibts direkte WinAPI-Funktionen dafür, ansonsten nur selbstprogrammiert oder externe Bibliotheken wie DirectDraw (Overkill für das...)

    bis bald
    akari



  • Gut. Dann lass ichs!

    Trotzdem danke 🙂



  • GDI+ wäre nich eine alternative.


Anmelden zum Antworten