AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Text Overlay

Ein Thema von EWeiss · begonnen am 30. Mär 2015 · letzter Beitrag vom 30. Mär 2015
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

Text Overlay

  Alt 30. Mär 2015, 17:03
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
http://www.delphipraxis.net/184476-p...-new-post.html

Irgendwo hier in ein Bitmap kopieren?

Delphi-Quellcode:
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;
Mein Problem ist das ich im weiteren verlauf um die Grafik neu zu zeichnen.
Die alte mit
Delphi-Quellcode:
  // Hintergrund löschen
  Image.Canvas.FillRect(Image.Canvas.ClipRect);
lösche.
Der Text wird dann natürlich auch gelöscht.


gruss
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#2

AW: Text Overlay

  Alt 30. Mär 2015, 17:14
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).
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Text Overlay

  Alt 30. Mär 2015, 17:14
Das Grundproblem dabei ist, dass TImage.Canvas sehr flüchtend ist. Sobald - von wo auch immer - das Kommando neuzeichnen kommt ist das so Gemalte weg.

Mal das auf die Bitmap von TImage .
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Text Overlay

  Alt 30. Mär 2015, 17:20
Zitat:
Wäre es so schlimm den Text auch jedes mal neu zu rendern?
Auch dann würde er mit Graph.Draw anschließend gelöscht.

Zitat:
Mal das auf die Bitmap von TImage .
Werd's mal versuchen

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Text Overlay

  Alt 30. Mär 2015, 17:46
Du kannst dir allerdings auch eine Delphi-Referenz durchsuchenTPaintBox über das Image legen und dort im Delphi-Referenz durchsuchenTPaintBox.OnPaint alles reinmalen was du möchtest.

Dadurch "kritzelst" du nicht auf dem Bild rum und trotzdem ist es "darüber".
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Text Overlay

  Alt 30. Mär 2015, 18:07
Du kannst dir allerdings auch eine Delphi-Referenz durchsuchenTPaintBox über das Image legen und dort im Delphi-Referenz durchsuchenTPaintBox.OnPaint alles reinmalen was du möchtest.

Dadurch "kritzelst" du nicht auf dem Bild rum und trotzdem ist es "darüber".
Habe es jetzt mal so wie von BUG vorgeschlagen gemacht.
Zitat:
Wäre es so schlimm den Text auch jedes mal neu zu rendern?
Mit ein paar kleinen Änderungen funktioniert das soweit ganz gut.

Nach dem löschen

Image.Canvas.FillRect(Image.Canvas.ClipRect);

einfach ein
Delphi-Quellcode:
  if HelpIsOn then
    DrawHelp;
DrawHelp in die Klasse TGraph eingefügt
Delphi-Quellcode:
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;
Und von außen (Form) geschaltet.

Delphi-Quellcode:
procedure TForm1.btnHelpClick(Sender: TObject);
begin

  Graph.HelpIsOn := not Graph.HelpIsOn;
  Graph.Draw;
end;
Projekt aktualisiert!
http://www.delphipraxis.net/184476-p...s-projekt.html

gruss

Geändert von EWeiss (11. Jul 2019 um 16:42 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#7

AW: Text Overlay

  Alt 30. Mär 2015, 18:16
@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.
  Mit Zitat antworten Zitat
Sailor

Registriert seit: 20. Jul 2008
Ort: Balaton
112 Beiträge
 
Delphi 2010 Professional
 
#8

AW: Text Overlay

  Alt 30. Mär 2015, 18:34
Nimm Graphics32, das bietet alles, was Du brauchst: Antialiasing, Transparency, Layers etc. und genügend Beispiele, um schnell in die Gänge zu kommen
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Text Overlay

  Alt 30. Mär 2015, 18:37
Nimm Graphics32, das bietet alles, was Du brauchst: Antialiasing, Transparency, Layers etc. und genügend Beispiele, um schnell in die Gänge zu kommen
Gut gemeint
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:51 Uhr.
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