Layer mit TImage und Transparenz
-
AlterMann
- Beiträge: 239
- Registriert: So 13. Dez 2009, 09:43
- OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
- CPU-Target: x86 64Bit
- Wohnort: Niederösterreich
Layer mit TImage und Transparenz
Hallo
Ich versuche mittels zweier gleich großer, übereinanderliegender Images Layer zu realisieren.
Der Untere soll die Druckvorschau einer Seite anzeigen, und am Oberen möchte ich einen Textbaustein anzeigen, sodaß der Benutzer diesen positionieren kann.
Ich schaff es einfach nicht, daß man den Text am oberen durchsieht.
Ich habe ein kleines Beispiel angehängt (bei dem die beiden Images allerdings zur besseren Sichtbarkeit nicht deckungsgleich angeordnet sind)
Vielleicht hat wer einen Tipp für mich?
Ich versuche mittels zweier gleich großer, übereinanderliegender Images Layer zu realisieren.
Der Untere soll die Druckvorschau einer Seite anzeigen, und am Oberen möchte ich einen Textbaustein anzeigen, sodaß der Benutzer diesen positionieren kann.
Ich schaff es einfach nicht, daß man den Text am oberen durchsieht.
Ich habe ein kleines Beispiel angehängt (bei dem die beiden Images allerdings zur besseren Sichtbarkeit nicht deckungsgleich angeordnet sind)
Vielleicht hat wer einen Tipp für mich?
Früher war alles besser. Und aus Holz!
Re: Layer mit TImage und Transparenz
Nimm keine Images, sondern zeichne Text und Bild auf einen Canvas in OnPaint.AlterMann hat geschrieben: Vielleicht hat wer einen Tipp für mich?
Mit Canvas.Draw und Canvas.TextRect (oder TextOut).
-
Soner
- Beiträge: 774
- Registriert: Do 27. Sep 2012, 00:07
- OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
- CPU-Target: x86_64-win64
- Wohnort: Hamburg
Re: Layer mit TImage und Transparenz
Das Ding(TImage) verhält sich ganz merkwürdig. Ich glaube man muss erst komplett das Bild zeichnen dann auf Transparent umschalten. Wen du das machst, dann ist es transparent:
1. Im Objektinspektor:
Image2.Transparent:=false;
2. Nach dem Programmstart klick auf [Text]-Knopf.
3. Jezt auf [Sichbarkeit]-Knopf klicken.
Jetzt wird es Transparent gezeichnet.
Aber wenn du erst [Sichbarkeit]-Knopf klickst, dann auf [Text]-Knopf dann wird es nicht Transparent gezeichnet.
Ich habe den Eindruck, dass Lazarus Maskedbild erstellt um Transparent zu zeichnen, wenn du einmal Transparenz gesetzt hast, dann werden alle weiteren Zeichnungen in Transparenz-Mode nicht mehr angezeigt.
Also nach jede Änderung alle Zeichnungen in ein Bitmap machen und an TImage weitergeben.
1. Im Objektinspektor:
Image2.Transparent:=false;
2. Nach dem Programmstart klick auf [Text]-Knopf.
3. Jezt auf [Sichbarkeit]-Knopf klicken.
Jetzt wird es Transparent gezeichnet.
Aber wenn du erst [Sichbarkeit]-Knopf klickst, dann auf [Text]-Knopf dann wird es nicht Transparent gezeichnet.
Ich habe den Eindruck, dass Lazarus Maskedbild erstellt um Transparent zu zeichnen, wenn du einmal Transparenz gesetzt hast, dann werden alle weiteren Zeichnungen in Transparenz-Mode nicht mehr angezeigt.
Also nach jede Änderung alle Zeichnungen in ein Bitmap machen und an TImage weitergeben.
-
AlterMann
- Beiträge: 239
- Registriert: So 13. Dez 2009, 09:43
- OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
- CPU-Target: x86 64Bit
- Wohnort: Niederösterreich
Re: Layer mit TImage und Transparenz
@Soner: Das hat mir schon sehr geholfen.
Aus- und Einschalten der Transparenz während der Ausgabe hilft wirklich. Danke
@theo: Meinst Du auf den Canvas des unteren Images, oder auf einen anderen? Kann ich denn einen Canvas ohne zugehörige Komponente einfach einfügen (zur Laufzeit?)?
Aus- und Einschalten der Transparenz während der Ausgabe hilft wirklich. Danke
@theo: Meinst Du auf den Canvas des unteren Images, oder auf einen anderen? Kann ich denn einen Canvas ohne zugehörige Komponente einfach einfügen (zur Laufzeit?)?
Früher war alles besser. Und aus Holz!
Re: Layer mit TImage und Transparenz
Mag ja sein, dass ich gar nicht kapiert hab' was später daraus werden soll, aber eigentlich arbeitet man doch mit PNG oder ähnlichen Formaten und benutzt Alphablending um "Durchscheinen" (semi-transparente Pixel) zu realisieren und nicht mit CookieCutter-Transparenz mit Hilfe von einzelnen Farben??? Oder ???
Bei anspruchsvolleren Dingen sieht das eh sehr bescheiden aus...
Edit: Man kann doch ein transparentes TLabel ganz einfach auf jedem TImage positionieren...
Bei anspruchsvolleren Dingen sieht das eh sehr bescheiden aus...
Edit: Man kann doch ein transparentes TLabel ganz einfach auf jedem TImage positionieren...
Re: Layer mit TImage und Transparenz
Jedes Formular hat einen Canvas, da muss man nichts spezielles machen.AlterMann hat geschrieben: @theo: Meinst Du auf den Canvas des unteren Images, oder auf einen anderen? Kann ich denn einen Canvas ohne zugehörige Komponente einfach einfügen (zur Laufzeit?)?
Das in OnPaint reicht schon:
Code: Alles auswählen
procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.Brush.Color:=clYellow;
Canvas.FillRect(10,10,100,50);
Canvas.TextOut(15,15,'Test');
end; -
AlterMann
- Beiträge: 239
- Registriert: So 13. Dez 2009, 09:43
- OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
- CPU-Target: x86 64Bit
- Wohnort: Niederösterreich
Re: Layer mit TImage und Transparenz
Was es werden soll:SoE hat geschrieben:Mag ja sein, dass ich gar nicht kapiert hab' was später daraus werden soll, ...
Ich habe vor einiger Zeit eine Unit geschrieben, die mir eine Druckvorschau erstellt.
Dort werden die einzelnen Seiten in dynamisch erzeugten TBitMapobjekten gespeichert, vor dem Drucken angezeigt, wenn man möchte noch nummeriert (Seite x von y) und Ich kann Seiten noch auswählen die gedruckt werden sollen.
Im Hauptprogramm verhält sich die Vorschau wie ein TPrinter.
Da ich nun noch einzeln postitionierbare Textbausteine brauche aber die Druckroutine nicht zweimal im Code haben wollte, dachte ich, ich öffne die Druckvorschau, kopiere die Seite vom Bitmap in ein Image auf einem anderen Formular (alle diese Objekte haben die selben Abmaße in Pixeln wie die Canvas vom Drucker) und lege ein transparentes Image drüber.
Auf dieses zeichne ich den zu positionierenden Textbaustein, schiebe ihn darauf herum bis er passt (ich denke das geht auf einer sonst leeren Canvas wesentlich einfacher als auf der vollen, wo schon das zu druckende Formular daruf gezeichnet ist) und übernehme ihn dann auf den Ausdruck.
Ich hoffe das war irgendwie verständlich ...
Früher war alles besser. Und aus Holz!
Re: Layer mit TImage und Transparenz
Ach so...Da ich nun noch einzeln postitionierbare Textbausteine brauche aber die Druckroutine nicht zweimal im Code haben wollte, dachte ich, ich öffne die Druckvorschau, kopiere die Seite vom Bitmap in ein Image auf einem anderen Formular (alle diese Objekte haben die selben Abmaße in Pixeln wie die Canvas vom Drucker) und lege ein transparentes Image drüber.
Also mein erster Ansatz wäre ohne beide TImages auszukommen, falls das nicht geht, dann nur ein TImage benutzen, das zweite soll ja sowieso transparent sein, wird also eigentlich nicht gebraucht... oder?
Also quasi direkt auf das Bitmap zeichnen oder das Bitmap in ein TImage laden und dann direkt auf das Bitmap im TImage zeichnen oder ein TLabel erzeugen und auf dem TImage herumschieben. Kommt halt drauf an wieviel Text so ein Textbaustein enthält und woraus dieser besteht. (Komponente oder selbst gezeichnet ... und wie das Verschieben erledigt werden soll oder muß...)
Oder wie theo schon gesagt hat: direkt auf das andere Formular zeichnen...
Je weniger man braucht (Form, TImage...) desto besser... naja zumindest meistens...
-
AlterMann
- Beiträge: 239
- Registriert: So 13. Dez 2009, 09:43
- OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
- CPU-Target: x86 64Bit
- Wohnort: Niederösterreich
Re: Layer mit TImage und Transparenz
So hab ich es jetzt letztendlich gelöst.SoE hat geschrieben:... oder ein TLabel erzeugen und auf dem TImage herumschieben....
Vielen Dank für die vielen Anregungen
Christian
Früher war alles besser. Und aus Holz!