Entwickler-Ecke

Multimedia / Grafik - Transparenter Zähler auf Paintbox


MrZBot - Mi 15.07.09 18:40
Titel: Transparenter Zähler auf Paintbox
Hey Community

Ich brauche Hilfe!

Wie kann ich auf eine Paintbox drauf eine Schrift transparent zeichnen, die sich selbst wieder überschreibt? Ich will einen Zähler auf eine Paintbox drauf machen, die aber nicht überschrieben werden darf. Der Zähler selber muss sich natürlich insich schon überschreiben, sonst erkennt man nichts. Nur: wie mache ich das?

P.S.: Ich bin ein Anfänger


ffgorcky - Mi 15.07.09 18:45

Hmm...
das Thema wird wohl öfter angesprochen - z.B. hier:
TLabel auf einem TPaintBox zur Laufzeit erstellen. [http://www.delphi-forum.de/viewtopic.php?t=67954&start=0&postorder=asc&highlight=label+paintbox]


MrZBot - Mi 15.07.09 18:52

Zitat:
Du musst Parent auf das Formular setzen!
bitte was?
was hat das mit Parent auf sich? oO

edit: ich habe bereits versucht, ein label transparent vor die Paintbox zu setzen. das geht nicht. die paintbox wird trotzdem überschrieben


jaenicke - Mi 15.07.09 21:23

Wie stellst du dir das vor? Wenn du etwas vor die PaintBox zeichnest, dann ist der Inhalt der PaintBox an der Stelle nun einmal verloren. Was normalerweise auch kein Problem ist, da eine PaintBox normalerweise ja in OnPaint einfach sich selbst neu zeichnet bei Bedarf oder wenn man es manuell auslöst.


MrZBot - Do 16.07.09 12:33

Die paintbox soll eine Grafik enthalten, die vorher einmal erstellt wurde. nun soll darauf ein zähler laufen. sieht aber grässlich aus wenn dieser nicht transparent ist...
Edit: was meinst du mit
Zitat:
Was normalerweise auch kein Problem ist, da eine PaintBox normalerweise ja in OnPaint einfach sich selbst neu zeichnet bei Bedarf oder wenn man es manuell auslöst.
? Kann ich damit "verlorene" Stellen also wieder herstellen ohne die Grafik neu zu berechnen? Wenn ja, das würde vollkommen ausreichen. Wie ginge das denn?


jaenicke - Do 16.07.09 19:49

http://www.michael-puff.de/Developer/Delphi/Code-Snippets/OffScreenBitmap.shtml
;-)


turboPASCAL - Do 16.07.09 21:23

Huch, noch ein Tread dazu...
Naja, war di etipperei im anderen umsonst. ;)

Also wenn die Paintbox ein Bild enthält geht das automatisch verloren wenn sich ein anderes darüber befindet oder befand.
Dann muss alles neu gezeichnet werden.
Ist da ein Image nich angebrachter ?

Was willst du denn machen? Ändert sich denn in Irgend einer Weise die Graphic in der Paintbox ?


MrZBot - Fr 17.07.09 13:53

Nein, die Paintbox enthält lediglich eine Grafik, welche nur einmal im Programm berechnet wird. Kann ich die Paintbox etwa einfach zu einem Image machen?


turboPASCAL - Fr 17.07.09 15:04

Um deine Frage zu beantworten, nein. Es kommt darauf an wie du die Graphic erstellst.

Also:
* erstelle ein (T)Bitmap und zeichne darauf dein Bild
* erstelle ein weiteres Bitmap in ein Stück deines Bildes kommt um den Hintergrund des Texttes zu löschen
* zeichne es im PaintboxPaint-Event mit Paintbox.Canvas.Draw(0,0, Bitmapname) in die Paintbox
* zeichne nun dein "Label" also den Text per Paintbox.Canvas.TextOut(...) darüber
* fertig.

Oder;
* erstelle ein (T)Bitmap und zeichne darauf dein Bild
* weise einem (T)Image dein Bild zu per ImageX.Picture.Assign(Bitmapname)
* klatsche ein Label auf das Image und erfreue dich ggf. an dem Geflacker

;)


Lannes - Fr 17.07.09 15:49

Hallo,
user profile iconMrZBot hat folgendes geschrieben Zum zitierten Posting springen:
Nein, die Paintbox enthält lediglich eine Grafik, welche nur einmal im Programm berechnet wird.
genau da ist der Vorschlag von user profile iconjaenicke umzusetzen.
Du erstellst einmal im Programm die Grafik auf einem OffScreenBitmap. Das wird in OnPaint bei Bedarf auf der PaintBox ausgegeben + zusätzlich dein Zähler. Einen neuen Zähler kannst Du dann duch Aufruf von PaintBox.Paint ausgeben.

So im Groben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
//Felder für OffScreenBitmap und Zähler
  private
    FBitMap : TBitMap;
    FCounter : Integer;

//FormCreate
  FBitMap := TBitMap.Create;
  FCounter := 0;
  // Grafik zeichnen

//DormDestroy
  FBitMap.Free;

//PaintBoxPaint
  // Grafik von FBitMap auf PaintBox ausgeben
  if Counter <> 0 then
    // Zähler über Grafik zeichnen TextOut( Counter) ...

//ButtonClick zum verändern der Zähleranzeige
  inc(FCounter);
  PaintBox.Paint:


Ps.: meine Vorposter haben das im wesentlichen auch so vorgeschlagen, aber vielleicht wird es so deutlicher.


MrZBot - So 19.07.09 20:08

Also ich sehe das richtig, es gibt keinen sehr einfachen Weg? ^^

dannw erde ich das fürs erste mal umgehen...ich will den Code ja auch verstehen und in den Beispielen hier habe ich eig fast immer höchstens die Hälfte verstanden...ich bin noch zu frisch in Delphi ;-)


@ Lannes
user profile iconMrZBot hat folgendes geschrieben Zum zitierten Posting springen:
P.S.: Ich bin ein Anfänger


Tilman - Sa 01.08.09 16:25

Es ist wirklich ganz einfach. Du musst dir nur vorstellen dass du halt nicht direkt auf die Paintbox malst, sondern erstmal auf ein Bild das sich unsichtbar im Speicher befindet, und dieses Bild wird dann so oft wie du es brauchst auf die Paintbox übertragen. Vermutlich hast du noch nie Komponenten zur laufzeit erzuegt, aber das geht ganz einfach. Du deklarierst sie wie eine Variable, und musst sie dann vor dem ersten Verwenden noch erzeugen, wie meine Vorposter bereits gezeigt haben, aber hier nochmal ganz einfach:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
  Form1: TForm1;
  Bild: TBitmap;  // <--- hier wird dein Bild als Variable deklariert

procedure TForm1.FormCreate(Sender: TObject);
begin
// OnCreate von Form1
  Bild := TBitmap.Create;; //<--- hier wird es erzeugt
  Bild.width := 100;   // Das Bild sollte so groß und breit sein
  Bild.heigth := 100;  // Wie deine Paintbox
end;


Wenn du korrekt vorgehen willst solltest du es dann OnDestroy vom Form wieder freigeben mit bild.free.

Auf das Bild kannst du genauso malen wie auf die Paintbox, halt bild.canvas statt Paintbox.canvas

Um Das Bild auf die Paintbox zu übertragen machst du an der Stelle wo früher Paintbox.canvas.maleirgendwas stand Paintbox.Canvas.Draw(0,0,Bild); und fertig. Damit bleibt dein Bild immer schön gespeichert und du kannst es jederzeit wieder herstellen. Anschließend kannst du wenn du magst direkt auf die Paintbox deinen Coutdown malen, oder dazu ein zweites TBitmap-Bild verwenden... ganz nach deinem Geschmack.


MrZBot - So 02.08.09 17:50

Danke Tilman, jetzt habe ich es mit deiner Hilfe hingekriegt. Mag sien, dass die voherigen Poster dasselbe meinten, ich habe aber erst deinen Beitrag verstanden ^^