Ein Control rotieren, logik-probleme

Rund um die LCL und andere Komponenten
wp_xyz
Beiträge: 4893
Registriert: Fr 8. Apr 2011, 09:01

Re: Ein Control rotieren, logik-probleme

Beitrag von wp_xyz »

KodeZwerg hat geschrieben:
Fr 10. Nov 2023, 15:51
Graphics32 wird benötigt (erhältich über OPM)
Achtung bei Graphics32: Wenn ich mich recht erinnere, registriert dieses Paket seine eigenen Graphik-Formate. Wenn du nun ein Bitmap zur Designzeit in ein TImage lädst, steht in dem Image die Signatur von Graphics32 als Bild-Typ. Wird dieses Formular in einem Lazarus geladen, bei dem Graphics32 nicht installiert ist, kann das Image nicht mehr gelesen werden.

In der Anlage ein Beispiel, wie man stattdessen ein transparentes Bitmap mit Bordmitteln (LazIntfImage) um einen beliebigen Winkel drehen kann.

Weil man das vielleicht gelegentlich braucht, habe ich den relevanten Code auch ins wiki geschrieben: https://wiki.freepascal.org/fcl-image#R ... rary_angle
Dateianhänge
rotate_bitmap.png
rotate_bitmap.png (76.84 KiB) 4391 mal betrachtet
rotate_bitmap.zip
(43.1 KiB) 70-mal heruntergeladen
Zuletzt geändert von wp_xyz am Fr 10. Nov 2023, 20:00, insgesamt 1-mal geändert.

Benutzeravatar
KodeZwerg
Beiträge: 100
Registriert: Mo 6. Feb 2023, 11:04

Re: Ein Control rotieren, logik-probleme

Beitrag von KodeZwerg »

Vielen Dank wp_xy, ich werde es nochmal überarbeiten nachdem ich es getestet habe, vielleicht mach ich's per {$if} für nativ, Graphics32 und BGRABitmap ....
Auch danke für deinen Hinweis (in meinem code wird das Bitmap32 an ein TBitmap assigned, also sollte das eh keine rolle spielen)
Zuletzt geändert von KodeZwerg am Sa 39. Okt 6043, 29:87, insgesamt 43-mal geändert.

Benutzeravatar
kupferstecher
Beiträge: 422
Registriert: Do 17. Nov 2016, 11:52

Re: Ein Control rotieren, logik-probleme

Beitrag von kupferstecher »

KodeZwerg hat geschrieben:
Fr 10. Nov 2023, 17:20
Dargestellt ist es als Bitmap auf dem Canvas eines TCustomControl, also hat es erstmal all dessen Eigenschaften plus das was ich ihm noch spendiert habe, was man auf dem Bild erkennen kann.
Das Control ist doch dann ein vergrößertes Rechteck in "normaler" Ausrichtung, also horizontal, oder? In der Praxis hat man es dann doch schnell mit unschönen Überlappungen zu tun, d.h. Ecken ragen in das Nachbar-Control herein. Das Control müsste also transparent gemacht werden, ist aber mit Lazarus nicht ohne Weiteres möglich?
Wie gehst du damit um?

Benutzeravatar
KodeZwerg
Beiträge: 100
Registriert: Mo 6. Feb 2023, 11:04

Re: Ein Control rotieren, logik-probleme

Beitrag von KodeZwerg »

Also mit "mehrfarbigen" hintergrund arbeite ich selbst nie und habe diese Möglichkeit nicht betracht gezogen.
Ein kurzer test weist auf was Du meinst und ich noch verkehrt mache.
Komplette transparenz hatte ich bis jetzt noch nicht in erwägung gezogen, lediglich das ein potenzieller anwender diese vorlage mit soliden farben nutzen kann.

Evtl ein schnappschuss machen um diesen Hintergrund als den Hintergrund meines Controls zu nutzen? Ich weiß nicht, bin da nicht so firm drinn.

Auf jeden Fall danke für Deine Meldung und anbei sieht man wie ich vorgehe recht gut, ich nutze die Farbe vom Parent als meine "fake"-Transparenz farbe was, wenn man ein bild als Hintergrund hat, natürlich total falsch ist :P
Dateianhänge
Bild_2023-11-12_171742844.png
Bild_2023-11-12_171742844.png (96.74 KiB) 4333 mal betrachtet
Zuletzt geändert von KodeZwerg am Sa 39. Okt 6043, 29:87, insgesamt 43-mal geändert.

Benutzeravatar
kupferstecher
Beiträge: 422
Registriert: Do 17. Nov 2016, 11:52

Re: Ein Control rotieren, logik-probleme

Beitrag von kupferstecher »

Genau das habe ich gemeint. Und es kann ja auch ein anderes Control im Weg sein. Die schräge Schrift ist ja gerade dann sinnvoll, wenn der Platz drum herum auch benutzt wird.

Du könntest versuchen eine Region zu definieren, siehe Beispielcode.

Der Zweck im Beispielcode ist einen 3-Pixel-breiten Rahmen als Markierung um ein Control zu zeichnen, dazu wird ein TPanel erstellt und in ein TBitmap die Kontur gezeichnet, zuletzt mit SetShape das Panel "ausgeschnitten".

Code: Alles auswählen

var 
  Regio: TBitmap;
  CurrentMarkingRect: TPanel;
MarkedControl: TWinControl;

IMPLEMENTATION

  MarkedControl:= Form1.Edit1;

  //Rahmen Zeichnen
  CurrentMarkingRect := TPanel.Create(aOwner);
  CurrentMarkingRect.Parent := aOwner;
  With CurrentMarkingRect do begin
     Left := MarkedControl.Left - 3;
     Top := MarkedControl.Top - 3;
     Width := MarkedControl.Width + 2*3;
     Height := MarkedControl.Height + 2*3;
     Color:= cMarkColor;
     BevelOuter:= bvNone;
     Regio.Width:= Width; Regio.height:= Height;
     Regio.Canvas.brush.color:= clblack; //transparent
     Regio.Canvas.FillRect(0,0,Regio.Width, Regio.Height);
     Regio.Canvas.brush.color:= clwhite; //region
     Regio.canvas.FillRect(0,0,Regio.Width,3);
     Regio.canvas.FillRect(0,0,3,Regio.Height);
     Regio.canvas.FillRect(0,Regio.Height-3,Regio.Width,Regio.Height);
     Regio.canvas.FillRect(Regio.Width-3,0,Regio.Width,Regio.Height);
     SetShape(Regio); //CurrentMarkingRect.SetShape(Regio);
  end;//with  

wennerer
Beiträge: 524
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Ein Control rotieren, logik-probleme

Beitrag von wennerer »

Hallo,
und was spricht dagegen anstelle von TCustomContol von TGraphicControl abzuleiten.
Sowie ich das sehe soll ja "nur" was auf den Canvas gezeichnet werden, also keine Tastatureingaben verarbeiten werden etc.
Allerdings sind TGraphicControl's immer hinter von TCustomControls abgeleiteten Komponenten.
Bildschirmfoto vom 2023-11-12 21-57-02.png
Bildschirmfoto vom 2023-11-12 21-57-02.png (79.48 KiB) 4317 mal betrachtet
Viele Grüße
Bernd

Benutzeravatar
KodeZwerg
Beiträge: 100
Registriert: Mo 6. Feb 2023, 11:04

Re: Ein Control rotieren, logik-probleme

Beitrag von KodeZwerg »

wennerer hat geschrieben:
So 12. Nov 2023, 21:59
Hallo,
und was spricht dagegen anstelle von TCustomContol von TGraphicControl abzuleiten.
Sowie ich das sehe soll ja "nur" was auf den Canvas gezeichnet werden, also keine Tastatureingaben verarbeiten werden etc.
Allerdings sind TGraphicControl's immer hinter von TCustomControls abgeleiteten Komponenten.

Bildschirmfoto vom 2023-11-12 21-57-02.png

Viele Grüße
Bernd
Naja, es soll später schon die Möglichkeit geben es per Tabulator Taste zu fokussieren und per Leertaste das jetzige Klick-Event feuern.

Mit dem Region-Ding weiß ich noch nicht umzugehen, das würde bestimmt das aktuelle flackern verringern, aber es soll ja auch nicht wild gedreht werden :D

Momentan reagiert es so das die Farbe clBlack als transparente Farbe wirkt und alles was nicht clBlack ist kann ein Klick-Event erzeugen.

Im Anhang das komplette Projekt.
Dateianhänge
Bild_2023-11-16_093533402.png
Bild_2023-11-16_093533402.png (99.23 KiB) 4279 mal betrachtet
Bild_2023-11-16_093446043.png
Bild_2023-11-16_093446043.png (104.62 KiB) 4279 mal betrachtet
CustomControl.zip
(56.95 KiB) 70-mal heruntergeladen
Zuletzt geändert von KodeZwerg am Sa 39. Okt 6043, 29:87, insgesamt 43-mal geändert.

Antworten