![]() |
Transparentes Editfeld/Memo
Hi!
In meinem Programm soll der User auf ein Bild (Paintbox) Text schreiben können, sodass das Bild im Hintergrund nur durch den Text überdeckt wird, nicht durch Hintergrundfarbe des Textes (d.h. der Text soll keine Hintergrundfarbe besitzen). Das Bild soll möglichst selten und dann nur zu möglichst kleinen Teilen neu gemalt werden, um Flimmern zu vermeiden. Ich habe ein paar "transparent" Komponenten aus dem Internet ausprobiert, aber bei diesen wurde diese Sache immer so gelöst, dass die Paintbox als ganzes ein OnPaint Signal bekommen hat (wenn man z.B. Buchstaben löscht und das Bild teilweise neu gemalt werden muss). Ich würde gerne erreichen, dass immer nur ein kleiner Teil des Bildes neu gemalt wird. Eine Möglichkeit wäre: Falls Text gelöscht wird (beim Schreiben von neuem Text ist es ja nicht erforderlich irgendwas am Bild zu ändern), soll die Paintbox nicht nur eine Nachricht erhalten, dass neu gemalt werden muss, sondern auch an welcher Stelle. Dann könnte ich nur diese Pixel neu schreiben lassen. Ich weiß aber leider nicht, wie man so etwas realisieren könnte (sodass die Textfläche ansonsten immernoch transparent ist). Wie wäre so etwas machbar? Ich benutze Delphi6. |
Re: Transparentes Editfeld/Memo
Zitat:
Delphi-Quellcode:
machen.
paintbox1.Canvas.Brush.Style := bsClear;
Um den Text löschen zu können, müsstest du die Position des entsprechenden Textes kennen. Dann kopierst du aus dem Originalbild, was du vorher in den Speicher geladen hast zum Beispiel mit CopyRect() die entsprechenden Bereiche heraus und überzeichnest damit den Text. |
Re: Transparentes Editfeld/Memo
Ich möchte es am besten so haben, dass der User auf dem Bild wie auf einem Memo schreiben kann (sodass auch angezeigt wird, wo sich der Cursor gerade befindet usw.). Ich habe mit Paintbox vorher noch nie was gemacht, hat die sowas integriert? Oder wie meintest du das jetzt
|
Re: Transparentes Editfeld/Memo
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
du möchtest praktisch aus einer Paintbox ein Memo machen? Das wird aber aufwendig sein und die PaintBox wird zu sowas wohl auch nicht besonders gut geeignet sein, da sie kein WinControl ist. Du müsstest praktisch LineBreak, Text selektieren, scrollen usw alles selber machen. Eventuell könntest du trotzdem ein Memo nehmen und dort die Nachricht WM_PAINT und WM_CHAR abfangen. Ansonsten könntest du eine eigene Komponente erstellen. Ich habe dir mal schnell eine kleine Demo geschrieben, damit du weist was ich meinte. Du kannst dort Text eingeben und ihn wieder mit der Back Taste löschen dabei wird CopyRect verwendet. Den Cursor aus dem Memo habe ich jedoch noch nicht wegbekommen, dazu könnte man aber eine andere Komponente nehmen. |
Re: Transparentes Editfeld/Memo
Ich verstehe was du meinst, auf diese Weise würde es ziemlich aufwendig. In deinem Beispielprogramm wird jetzt das Memo nur noch benutzt, um zu erfahren, wann welche Fensternachricht geschickt wurde (ist also fast überflüssig). Wäre es nicht möglich, mehr von den vorhandenen Funktionen von TMemo auszunutzen? Also dass z.B. TMemo seinen Text wie gewohnt schreibt, mit der Ausnahme, dass es vorher nicht den ganzen Hintergrund löscht usw. Die Eingabe der Returntaste ändert ja auch auch nur die Cursorposition (das Scrollen wenn man am Ende des Memos angekommen ist brauche in meiner Anwendung nicht).
Aber ich verstehe auch nicht wirklich wie das mit der Fensternachricht WM_PAINT genau läuft. Ich habe einmal ausgeben lassen, wann diese Nachricht bei einem Memo bei "normalem Betrieb" ankommt. Komischerweise passiert z.B. wenn man die Backspace Taste drückt nur manchmal. Ich hätte erwartet, dass es immer passiert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz