![]() |
Text Overlay
Ich zeichne auf Image.canvas und möchte nun einen Text überlagern ohne das dieser gelöscht wird.
Wie gehe ich da am besten vor? Betrifft das Projekt ![]() Irgendwo hier in ein Bitmap kopieren?
Delphi-Quellcode:
Mein Problem ist das ich im weiteren verlauf um die Grafik neu zu zeichnen.
procedure TForm1.btnHelpClick(Sender: TObject);
var Txt: string; R: TRect; begin if not HelpIsOn then begin Image1.Canvas.Font.Name := 'Consolas'; Image1.Canvas.Font.Size := 10; Image1.Canvas.Font.Style := [fsBold]; Txt := Txt + ' ' + sLineBreak + sLineBreak; Txt := Txt + ' Anleitung' + sLineBreak + sLineBreak; Txt := Txt + ' 1. Set drücken' + sLineBreak; Txt := Txt + ' 2. Run drücken' + sLineBreak; Txt := Txt + ' 3. Abwarten, zuschauen' + sLineBreak; Txt := Txt + ' 4. Kick X oder Kick Y drücken - spielen,' + sLineBreak; Txt := Txt + ' zuschauen ' + sLineBreak; Txt := Txt + ' 5. Stop drücken' + sLineBreak; Txt := Txt + ' 6. Roten oder schwarzen Punkt mit der Maus ' + sLineBreak; Txt := Txt + ' verschieben ' + sLineBreak; Txt := Txt + ' 7. Run drücken, weiterspielen' + sLineBreak; Txt := Txt + ' 8. Break oder Ende in der IDE' + sLineBreak; Txt := Txt + ' 9. Parameter D in SetParam ändern: 0 bis 10000' + sLineBreak; Txt := Txt + ' 10. Neu starten, weiterspielen' + sLineBreak; Txt := Txt + ' 11. Code nach .Net übersetzen oder Code' + sLineBreak; Txt := Txt + ' nach eigenen Vorstellungen erweitern' + sLineBreak; Txt := Txt + ' 12. Kluge Bemerkungen im Forum machen, den' + sLineBreak; Txt := Txt + ' Autor mit Lob überhäufen, Kritik üben :-)' + sLineBreak; Txt := Txt + ' ' + sLineBreak; Txt := Txt + ' 99. ? drücken um den blöden Text wegzumachen' + sLineBreak; R := Rect(Graph.xxc(Graph.xMin), Graph.yyc(Graph.yMax), Graph.yyc(Graph.yMin),Graph.xxc(Graph.xMax) ); Image1.Canvas.FillRect(R); DrawText(Image1.Canvas.Handle, PWideChar(Txt), -1, R, DT_LEFT); HelpIsOn := True end else begin Graph.PrepareScale; Graph.Draw; HelpIsOn := False; end; end; Die alte mit
Delphi-Quellcode:
lösche.
// Hintergrund löschen
Image.Canvas.FillRect(Image.Canvas.ClipRect); Der Text wird dann natürlich auch gelöscht. gruss |
AW: Text Overlay
Wäre es so schlimm den Text auch jedes mal neu zu rendern? Zur Not könntest du ihn ein Bitmap zeichnen und dann dann immer dieses als erstes auf das Canvas zeichnen (anstelle von FillRect).
|
AW: Text Overlay
Das Grundproblem dabei ist, dass
Delphi-Quellcode:
sehr flüchtend ist. Sobald - von wo auch immer - das Kommando neuzeichnen kommt ist das so Gemalte weg.
TImage.Canvas
Mal das auf die Bitmap von
Delphi-Quellcode:
.
TImage
|
AW: Text Overlay
Zitat:
Zitat:
gruss |
AW: Text Overlay
Du kannst dir allerdings auch eine
![]() ![]() Dadurch "kritzelst" du nicht auf dem Bild rum und trotzdem ist es "darüber". |
AW: Text Overlay
Zitat:
Zitat:
Nach dem löschen
Delphi-Quellcode:
Image.Canvas.FillRect(Image.Canvas.ClipRect);
einfach ein
Delphi-Quellcode:
DrawHelp in die Klasse TGraph eingefügt
if HelpIsOn then
DrawHelp;
Delphi-Quellcode:
Und von außen (Form) geschaltet.
procedure TGraph.DrawHelp;
var Txt: string; R: TRect; begin Image.Canvas.Font.Name := 'Consolas'; Image.Canvas.Font.Size := 10; Image.Canvas.Font.Style := [fsBold]; Txt := Txt + ' ' + sLineBreak + sLineBreak; Txt := Txt + ' Anleitung' + sLineBreak + sLineBreak; Txt := Txt + ' 1. Set drücken' + sLineBreak; Txt := Txt + ' 2. Run drücken' + sLineBreak; Txt := Txt + ' 3. Abwarten, zuschauen' + sLineBreak; Txt := Txt + ' 4. Kick X oder Kick Y drücken - spielen,' + sLineBreak; Txt := Txt + ' zuschauen ' + sLineBreak; Txt := Txt + ' 5. Stop drücken' + sLineBreak; Txt := Txt + ' 6. Roten oder schwarzen Punkt mit der Maus ' + sLineBreak; Txt := Txt + ' verschieben ' + sLineBreak; Txt := Txt + ' 7. Run drücken, weiterspielen' + sLineBreak; Txt := Txt + ' 8. Break oder Ende in der IDE' + sLineBreak; Txt := Txt + ' 9. Parameter D in SetParam ändern: 0 bis 10000' + sLineBreak; Txt := Txt + ' 10. Neu starten, weiterspielen' + sLineBreak; Txt := Txt + ' 11. Code nach .Net übersetzen oder Code' + sLineBreak; Txt := Txt + ' nach eigenen Vorstellungen erweitern' + sLineBreak; Txt := Txt + ' 12. Kluge Bemerkungen im Forum machen, den' + sLineBreak; Txt := Txt + ' Autor mit Lob überhäufen, Kritik üben :-)' + sLineBreak; Txt := Txt + ' ' + sLineBreak; Txt := Txt + ' 99. ? drücken um den blöden Text wegzumachen' + sLineBreak; R := Rect(Graph.xxc(Graph.xMin), Graph.yyc(Graph.yMax), Graph.yyc(Graph.yMin),Graph.xxc(Graph.xMax) ); Image.Canvas.FillRect(R); DrawText(Image.Canvas.Handle, PWideChar(Txt), -1, R, DT_LEFT); end;
Delphi-Quellcode:
Projekt aktualisiert!
procedure TForm1.btnHelpClick(Sender: TObject);
begin Graph.HelpIsOn := not Graph.HelpIsOn; Graph.Draw; end; ![]() gruss |
AW: Text Overlay
@EWeiss
Ich weiß nicht ob ich dich richtig verstanden habe, aber falls du meinst eine Hintergrundgrafik zu haben auf der sich im Vordergrund etwas abspielt, sowas in der Art hatte ich auch mal. Ich hab mir damals eine Bitmap-Klasse geschrieben bei der es mehrere Ebenen gab. Ebene 0 war somit der Hintergrund und ich konnte auf Ebene 1 zeichnen ohne den Hintergrund zu zerstören. Jedes mal wenn ich es wieder darstellen wollte, wurden die beiden Bilder zusammengefügt. Und damit das kein permanentes Neuzeichnen wird, wurden die Änderungen stets in einer Maske festgehalten, so dass man damit einen Clipping-Bereich für das Neuzeichnen hatte. Es wurden also immer nur die Änderungen neu gezeichnet. Aber bei deinem Beispiel mit dem Pendel würde ich auf die Maske verzichten. Einfach nur auf den Ebenen zeichnen und komplett übertragen. |
AW: Text Overlay
Nimm Graphics32, das bietet alles, was Du brauchst: Antialiasing, Transparency, Layers etc. und genügend Beispiele, um schnell in die Gänge zu kommen
|
AW: Text Overlay
Zitat:
Aber extra für so ein kleines Projekt eine Komponente einbinden wenn es mit Hausmitteln geht? Es tut ja was es soll wenn auch die Grafik nicht das gelbe vom EI ist. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:24 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