Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Form aus Bild erstellen
Mahjong - Sa 11.06.05 13:57
Titel: Form aus Bild erstellen
Also ich habe mir überlegt, das es schön wäre, ein Form zu haben, das die Form eines Bildes hat, sprich mit allen Ecken,kanten,rundungen usw. , geht so etwas, und wenn ja wie ?
Moderiert von
Tino: Titel geändert.
der_zaehe - Sa 11.06.05 14:14
das geht.
du musst erst mal die eigenschaft "BorderStyle" deines formulars auf "bsNone" setzen. dann packst du dir ein bild auf dein formular, das die größe des formulars haben sollte.
jetzt wichtig! dein bild muss folgende eigenschaften haben:
aussen, da wo es später transparent sein soll, muss es eine ganz bestimmte farbe haben, welche ist egal, aber es muss überall die gleiche farbe sein. (z.B. RGB 255,0,0)
dann setzt du die formulareigenschaft "TransparentColor" auf TRUE und stellst als "TransparentColorValue" die farbe ein, die danach transparent sein soll, die farbe die dein Bild aussen hat.
fertig!
root_at_localhost - Sa 11.06.05 14:21
Gibt's da eigentlich auch nen Weg mit Delphi 4 (da hatte TForm noch kein TransparentColor)
delfiphan - Sa 11.06.05 14:30
root_at_localhost hat folgendes geschrieben: |
| Gibt's da eigentlich auch nen Weg mit Delphi 4 (da hatte TForm noch kein TransparentColor) |
Falls du die Sources einer Delphiversion hast, bei der es TransparentColor gibt, kannst du ja schauen, wie es dort gemacht wird und es auf Delphi4 übertragen.
alzaimar - Sa 11.06.05 14:49
Prinzipiell geht das mit 'regions'. Schau mal in der Windows-Hilfe nach. Eine 'Region' beschreibt den Umriss eines WinControls! Der kann jede beliebige Form haben:
Eine Region kann auf diverse Art und Weise erzeugt werden: Ich mache das, indem ich die Hintergrundbitmap Zeile für Zeile analysiere und die Bereiche, die ich sehen will, sukkzessive als 1-pixel hohe Rechtecke zu der Region hinzufüge. Das geht ganz einfach über einen WinAPI-Aufruf. Welche das sind, überlasse ich Dir als Übung.
Du machst Folgendes (pseudocode):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| For i:=0 To BackGroundBitmap.Height - 1 do begin InRegion := False; For j:= 0 to BackGroundBitmap.width - 1 do if BackGroundBitmap.pixels[j,i] = clMyTransparentcolor Then If InRegion Then begin AddRegion (i,jleft,j-1); InRegion := False; End else begin InRegion := True; jLeft := j; end; If InRegion Then AddRegion (i,jleft, BackGroundBitmap.width - 1); End |
Die Prozedur
AddRegion (i,j0,j1) fügt das Rechteck
Rect (j0,i-1, j1, i) in die Region ein. Wie gesagt: Da reicht ein Call. Noch ein Tipp: Du musst unterscheiden, ob die Region leer ist oder nicht (also, ob Du AddRegion zum 1.Mal aufrufst, oder nicht).
Der vollständige, lauffähige, kommentierte und getestete Code ist übrigens kostenpflichtig :mrgreen:
retnyg - Sa 11.06.05 15:40
alzaimar hat folgendes geschrieben: |
| Der vollständige, lauffähige, kommentierte und getestete Code ist übrigens kostenpflichtig :mrgreen: |
benutzt dann aber hoffentlich scanline statt pixels :roll:
alzaimar - So 12.06.05 06:10
Was, meinst Du, bedeutet das Wort "Pseudocode"? Eine veranschaulichende Implementierung, ohne auf sprachspezifische und optimierende Eigenheiten Rücksicht zu nehmen.
Weiterhin solltest Du das Wort "Übung" in meinem Text entdeckt haben, verbunden mit dem Verb "überlassen". Das impliziert was?
root_at_localhost - So 12.06.05 13:19
Danke für die Hilfe, mit dem Schlüsselword Regions und dem Tipp Scanline zu verwenden wars nicht schwierig...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!