Autor |
Beitrag |
MrZBot
      
Beiträge: 20
|
Verfasst: Mi 15.07.09 18:40
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
      
Beiträge: 573
WIN XP/2000 & 7Prof (Familie:Win95,Win98)
|
Verfasst: Mi 15.07.09 18:45
Hmm...
das Thema wird wohl öfter angesprochen - z.B. hier:
TLabel auf einem TPaintBox zur Laufzeit erstellen.
|
|
MrZBot 
      
Beiträge: 20
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 20
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 16.07.09 19:49
|
|
turboPASCAL
      
Beiträge: 193
Erhaltene Danke: 1
Win XP / Vischda
D6 PE / D2005 PE
|
Verfasst: 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 ?
_________________ Nein, ich bin nicht der turboPASCAL aus der DP, ich seh nur so aus...
|
|
MrZBot 
      
Beiträge: 20
|
Verfasst: 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
      
Beiträge: 193
Erhaltene Danke: 1
Win XP / Vischda
D6 PE / D2005 PE
|
Verfasst: 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

_________________ Nein, ich bin nicht der turboPASCAL aus der DP, ich seh nur so aus...
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Fr 17.07.09 15:49
Hallo,
MrZBot hat folgendes geschrieben : | Nein, die Paintbox enthält lediglich eine Grafik, welche nur einmal im Programm berechnet wird. |
genau da ist der Vorschlag von jaenicke 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:
| private FBitMap : TBitMap; FCounter : Integer;
FBitMap := TBitMap.Create; FCounter := 0; FBitMap.Free;
if Counter <> 0 then inc(FCounter); PaintBox.Paint: |
Ps.: meine Vorposter haben das im wesentlichen auch so vorgeschlagen, aber vielleicht wird es so deutlicher.
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
MrZBot 
      
Beiträge: 20
|
Verfasst: 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
MrZBot hat folgendes geschrieben : | P.S.: Ich bin ein Anfänger |
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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; procedure TForm1.FormCreate(Sender: TObject); begin Bild := TBitmap.Create;; Bild.width := 100; Bild.heigth := 100; 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.
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
MrZBot 
      
Beiträge: 20
|
Verfasst: 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 ^^
|
|