Kleines Kreischen malen



  • 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