Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Eigene Komponente X-beliebiges Aussehen (https://www.delphipraxis.net/210885-eigene-komponente-x-beliebiges-aussehen.html)

stahli 27. Jun 2022 09:17

AW: Eigene Komponente X-beliebiges Aussehen
 
Erst mal Respekt. Das sieht schon nicht schlecht aus. :thumb:

Ich gehe davon aus, dass Du Deine "COntrols" somit nur auf einer speziellen Zeichenfläche darstellen willst und nicht mit VCL-Controls zusammen in einem beliebigen Formular.

Dann finde ich Deinen Ansatz schon geeignet. Du kannst das etwa so sehen, wie im Delphi-Designer. Du hast hier im Delphi einen Button auf ein Formular gezogen.
Wenn Du ihn in der Größe ändern willst, musst Du ihn focussieren und erhältst "Anfasser", die Du dann ziehen kannst.
Die sind aber nicht Teil der Komponente sondern werden als Werkzeug von der IDE über dem Button selbst platziert.

Das entspricht Deiner Lösung und ist so auch sehr sinnvoll. Ich würde also grundsätzlich bei Deiner Lösung bleiben und die ggf. nur noch etwas an den Bedarf anpassen.

MarcRB75 27. Jun 2022 14:02

AW: Eigene Komponente X-beliebiges Aussehen
 
Ohhh das freut mich, dass es Dir gefällt.

Ich möchte jedoch statt des Image eine Paintbox verwenden, geht auch, weil diese durchsichtig ist und ich dadurch ggf. andere Linien durchsehen kann.
Denn wenn ich z.B. 2 Images überlagere, ist nur das ganze Front-Image zu sehen, das hintere nicht. Mit Transparent ect ... das funktioniert leider nicht.

Wenn ich Dich richtig verstehe:
Das Ganze (Bogen, alle Punkte) plaziere ich auf einem Image/Paintbox, die ich vorher als neue Komponente mache.
Gut, das geht, das bekomme ich hin.

Ja die Punkte selbst, möchte ich aber auch als "Werkzeug" benutzen, zur Komponente selbst (Bogen mit Anfangs+Endpunkt), wenn diese auf ein Formular gezogen wird. Das bekomme ich auch hin, ist kein Problem.

Aber wie kann ich dann, wie Du mir zuvor geschrieben hast, die Linien/Punkte "Ausstanzen", so dass kein viereckiger Rahmen entsteht, wenn ich
die "Bogen-Komponte" auf ein Formular lege?

Könntest Du mir bitte sagen, wie das geht oder wie ich das machen muss?

Angenommen ich habe alle Punkte des Bogens und die der Punkte ermittelt, wie kann ich dann n diese Form "Ausstanzen", so dass ein schöner Rahmen drumherum entsteht? Könntest Du mir das bitte sagen?

himitsu 27. Jun 2022 14:12

AW: Eigene Komponente X-beliebiges Aussehen
 
Durchsichtig ist sie nicht wirklich.
Aber, die PaintBox ist keine eigeneständiges WinControl, sondern hackt sich in den Parent rein und mals sich auf dessen Desktop ... daher kann der Desktop vorher noch seinen Inhalt da hinmalen, wo sich die PaintBox anschließend hinmalt.

Ebenso machen es TLabel und TBevel. (das "echte" Windows-Label, ist TStaticText ... weil zufällig die "Label"-Klasse "STATIC" heißt)

MarcRB75 27. Jun 2022 14:18

AW: Eigene Komponente X-beliebiges Aussehen
 
also das mit der Paintbox funktioniert sehr gut. Alle Zeichnungen oder sonstiges "schimmert durch" :-)

stahli 27. Jun 2022 14:54

AW: Eigene Komponente X-beliebiges Aussehen
 
Zitat:

Zitat von MarcRB75 (Beitrag 1507944)
Aber wie kann ich dann, wie Du mir zuvor geschrieben hast, die Linien/Punkte "Ausstanzen", so dass kein viereckiger Rahmen entsteht, wenn ich
die "Bogen-Komponte" auf ein Formular lege?

Könntest Du mir bitte sagen, wie das geht oder wie ich das machen muss?

Angenommen ich habe alle Punkte des Bogens und die der Punkte ermittelt, wie kann ich dann n diese Form "Ausstanzen", so dass ein schöner Rahmen drumherum entsteht? Könntest Du mir das bitte sagen?


1) Ausstanzen

Da ist m.E. genau die Frage. Du sagst, Du willst die Bogenkomponente "auf ein Formular legen". Bedeutet das, Du willst sie benutzen wie und neben einem Edit, Panel oder Button?
Oder willst Du sie nur auf der Fläche eines anderen Controls darstellen und benutzbar machen?

Wenn Du sie z.B. wie ein nicht-rechteckiges Panel benutzen willst, dann kannst Du Dir meinen zweiten Link im Beitrag #2 nochmal anschauen. Da werden dann einfach Teile des rechteckigen Controls weggeschnitten bzw. ausgestanzt.
Das Problem ist, dass Du "innerhalb" des Controls keine "Anfasser" positionieren kannst, bzw. damit dann nur eine Verkleinerung machbar wäre. Wenn Du die Anfasser weiter nach außen ziehen willst, wäre das nicht möglich, da das Control ja dort keinen Zugriff mehr auf sein Umfeld hat.
Das heißt, die Anfasser müssen dann immer von einer höheren Ebene (Designer oder Formular) bereitgestellt werden. In dessen Bereich kannst Du dann die Anfasser bewegen - auch außerhalb der Bogenkomponente.

Wenn Du keine Vermischung deiner Bogenkomponente mit anderen VCL-Controls brauchst und Du Dich auf eine individuelle Zeichenfläche beschränken kannst, dann kannst Du Dir das Beschneiden von VCL-Controls ersparen und einfach Deine Bogencontrols auf eine beliebige Zeichenfläche malen.


2) Transparenz

Die VCL unterstützt keine wirkliche Transparenz. Wie himitsu beschrieben hat malt ein Label z.B. einfach seinen Text auf die Zeichenfläche seines Parent. Also malt zuerst der Parent seine Zeichenfläche fertig (z.B. weiße Füllung) und dann malt das Label noch seinen Text darauf. Dadurch scheint das Label transparent zu sein.
Wenn der Parent sich aber neu malt (z.B. wegen einer Größenänderung) ist die Fläche wieder weiß und das Label muss seinen Text erneut zeichnen um wieder sichtbar zu sein.
Ein Label über die gesamte Formularbreite zu setzen und dabei andere Controls zu überdecken ist nicht möglich.
Mit einem Panel geht das, da ist dann aber keine echte Transparenz möglich.
Die VCL ist da also etwas eingeschränkt.

Diese "Pseudotransparenz" kannst Du für Dich natürlich nachbilden.
Du könntest Dein Hintergrundbild auf Deine Zeichenfläche kopieren und dann darauf Deine Bogencontrols zeichnen. Bei jeder Änderung musst Du dann natürlich wieder beides machen.
Je nachdem wie aufwändig diese Aktionen sind, könnte es sinnvoll sein, die neue "Gesamtbildberechnung" (Hintergrund + Bögen) in einen Thread auszulagern und erst das Ergebnis dann tatsächlich auf der Zeichenfläche darzustellen.
Das kann Flackern und/oder ein hängen der Anwendung vermeiden helfen.


Wenn Du ein wenig zu dem Thema stöbern willst, kannst Du Dich hier mal umschauen:
https://www.delphipraxis.net/175033-...-schlecht.html


3) VCL-Control oder eigenständige Zeichenfläche

Also die wichtigste Entscheidung ist wohl zunächst, ob Du mit einer bestimmten Zeichenfläche klar kommst, auf denen alle Deine Figuren bearbeitet und genutzt werden oder ob Du Deine Controls wie ein Edit oder Panel überall in einer Anwendung einsetzen willst...

MarcRB75 28. Jun 2022 09:13

AW: Eigene Komponente X-beliebiges Aussehen
 
Vielen Dank für Deine Antwort.

Ich verstehe das jetzt, mit dem Ausstanzen und dem "Anfasser". Dann ist das wohl doch keine so gute Idee.

Ich werde, wenn ich auf einen "Button" drücke, mir den Bogen und die Punkte erzeugen lassen. Das geht auch.
Naja... ich wollte das zwar "eleganter" lösen ... aber vielleicht kann man doch nicht alles so umsetzen, auch wenn man
es noch so gerne möchte.

Das mit der Transparenz spielt ja dann in diesem Fall auch keine Rolle mehr, weil der Bogen direkt erzeugt und sofort sichtbar ist.

Nochmal vielen Dank an Dich und die anderen, dass Ihr Euch solche Mühe für Eure Antworten gegeben habt.

stahli 28. Jun 2022 09:37

AW: Eigene Komponente X-beliebiges Aussehen
 
Gerne.

Eine andere Lösung könnte noch sein, dass Du einen Bogen mit einem Mausklick darauf selektieren kannst (wie in anderen Grafikprogrammen).
Das wäre intuitiv aber Du musst den Pfad für jeden Bogen in einer eigenen Region verwalten.

Quasi genau das, was Du mit dem Ausstanzen erreichen wolltest, aber "virtuell". Du merkst Dir verschiedene Regionen für Deine Bögen und prüfst bei einem Klick auf die Zeichenfläche, ob dabei eine Bogenregion erwischt wird. Die Regionen könntest Du sogar stapeln (die neueste immer zuerst prüfen und die älteste zuletzt), dann kannst Du sie sogar übereinander legen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:50 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz