Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi [TPaintBox] - "Hintergrundfarbe" für Pen.Style := psDot (https://www.delphipraxis.net/83818-%5Btpaintbox%5D-hintergrundfarbe-fuer-pen-style-%3D-psdot.html)

xZise 6. Jan 2007 22:26


[TPaintBox] - "Hintergrundfarbe" für Pen.Style :=
 
Ich erzeuge eine Linie (also eigentlich 4 ;)) auf einer TPaintBox, worauf ich zuvor ein BitMap kopiert hab. So sieht die "Paint"-Routine aus:
Delphi-Quellcode:
procedure TfrmMain.pbMapPaint(Sender: TObject);
begin
  BitBlt(pbMap.Canvas.Handle, xDis, yDis, bMap.Width, bMap.Height, bMap.Canvas.Handle, 0, 0, SrcCopy);
  if (selectRect.X >= 0) and (selectRect.Y >= 0) then begin
     pbMap.Canvas.MoveTo((selectRect.X * 32) + xDis, (selectRect.Y * 32) + yDis);
    pbMap.Canvas.LineTo(((selectRect.X + 1) * 32) + xDis, (selectRect.Y * 32) + yDis);
    pbMap.Canvas.LineTo(((selectRect.X + 1) * 32) + xDis, ((selectRect.Y + 1) * 32) + yDis);
    pbMap.Canvas.LineTo((selectRect.X * 32) + xDis, ((selectRect.Y + 1) * 32) + yDis);
    pbMap.Canvas.LineTo((selectRect.X * 32) + xDis, (selectRect.Y * 32) + yDis);
  end;
end;
Zuvor ist natürlich der Style des Pens auf "psDot" gesetzt. Dummerweise zeichnet er aber die Zwischenräume mit der .Color-Eigenschaft der TpaintBox. Kann ich irgendwie sagen, dass das Durchsichtig sein soll?

Muetze1 6. Jan 2007 23:54

Re: [TPaintBox] - "Hintergrundfarbe" für Pen.Style
 
er zeichnet die Zwischenräume mit deiner Brush.Color. Wenn du das nicht willst, dann setze den Stil vom Brush auf bsClear.
Delphi-Quellcode:
Canvas.Brush.Style := bsClear;

lbccaleb 7. Jan 2007 00:11

Re: [TPaintBox] - "Hintergrundfarbe" für Pen.Style
 
könnte ich auch irgendwie die paintbox mit ner bestimmten farbe durchsichtig machen???

Muetze1 7. Jan 2007 02:31

Re: [TPaintBox] - "Hintergrundfarbe" für Pen.Style
 
Zitat:

Zitat von lbccaleb
könnte ich auch irgendwie die paintbox mit ner bestimmten farbe durchsichtig machen???

Grundsätzlich: Male an den Stellen einfach nichts, wo es durchsichtig sein sollte.

Bei deinem Bitmap was du als erstes malst kannst du eine entsprechende TransparentColor einstellen. Dann musst du aber auf die Methode Draw() zurück greifen, da BitBlt() diese Eigenschaft nicht beachtet.

lbccaleb 7. Jan 2007 02:47

Re: [TPaintBox] - "Hintergrundfarbe" für Pen.Style
 
ich habe mir mit tpaintbox eine animierte komponente gebastelt, die quasi ein bmp frame für frame per timer durchläuft, dort kann ich das ja nicht anwenden, wie mach ich das in solch einem fall??

Muetze1 7. Jan 2007 02:52

Re: [TPaintBox] - "Hintergrundfarbe" für Pen.Style
 
Da würde ich eine eigene Komponente bauen - direkt abgeleitet von TGraphicControl. Da du bei den unsichtbaren Bereichn wahrscheinlich unterschiedliche Flächen haben wirst während der Animation, musst du vor dem Zeichnen eines neuen Frames den Hintergrund neu zeichnen. Das bedeutet dann, die darunter liegende Komponente muss neu gezeichnet werden - zumindest in dem Bereich wo deine Komponente liegt. Da du kein Fensterhandle hast bei einem TGraphicControl und dir der Parent einfach nur einen Teil seines Canvas dir zum zeichnen überlässt, kann dieses neuzeichnen vor der neuen Frame recht langwierig sein. Daher wäre es wohl einfacher von TCustomControl abzuleiten. Dort hast du dein eigenes Fenster und kannst dann mit Invalidate und Update schneller zu einem solchen Verhalten kommen. Das müßtest du aber wohl mal im Detail ausprobieren.

lbccaleb 7. Jan 2007 02:58

Re: [TPaintBox] - "Hintergrundfarbe" für Pen.Style
 
mir würde es reichen wenn ich eine farbe (die egal ist, kann bmp noch ändern) transparent darstellen kann, bevor neu in die paintbox gezeichnet wird..

xZise 7. Jan 2007 09:26

Re: [TPaintBox] - "Hintergrundfarbe" für Pen.Style
 
Naja ;) Ich will dich nicht ärgern, aber ich habe die Brush-Farbe und den Brush-Style "abnormalisiert" ohne Änderung...

Liegt es ggf. an "BitBlt"?

Muetze1 7. Jan 2007 15:31

Re: [TPaintBox] - "Hintergrundfarbe" für Pen.Style
 
1. wenn du das einmal in die Paintbox gezeichnet hast, dann müsstest du bei Änderung der Position der transparenten Bereiche die alten gemalten Pixel weg bekommen. Transparent heisst aber nun mal nicht, dass er dort was "transparentes" hinmalt an der Stelle sondern er das malen dort auslässt.
2. Wenn du nur eine Farbe in dem Bitmap Transparent haben willst, dann setz die entsprechende Eigenschaft des Bitmaps (wie ich oben schon geschrieben hatte). Delphi-Referenz durchsuchenTBitmap.TransparentMode, Delphi-Referenz durchsuchenTBitmap.TransparentColor, Delphi-Referenz durchsuchenTBitmap.Transparent.
3. Wenn du die Transparent-Eigenschaft des TBitmaps verwendest, dann musst du das BitBlt() durch Draw() ersetzen, weil BitBlt() von WinAPI nichts von TBitmap der VCL weiss und sich somit auch nicht darum kümmert. Auch dieses hatte ich oben schon geschrieben.
4. @xZise: Die Farbe des Brushes ist egal, wenn du Brush.Style auf bsClear stellst. Du kannst auch beim Canvas folgendes machen, aber eigentlich ist dies nicht nötigt:
Delphi-Quellcode:
SetMode(Canvas.Handle, TRANSPARENT);

xZise 7. Jan 2007 16:46

Re: [TPaintBox] - "Hintergrundfarbe" für Pen.Style
 
Zitat:

Zitat von Muetze1
1. wenn du das einmal in die Paintbox gezeichnet hast, dann müsstest du bei Änderung der Position der transparenten Bereiche die alten gemalten Pixel weg bekommen. Transparent heisst aber nun mal nicht, dass er dort was "transparentes" hinmalt an der Stelle sondern er das malen dort auslässt.

Und was heißt das?

Zitat:

Zitat von Muetze1
2. Wenn du nur eine Farbe in dem Bitmap Transparent haben willst, dann setz die entsprechende Eigenschaft des Bitmaps (wie ich oben schon geschrieben hatte). Delphi-Referenz durchsuchenTBitmap.TransparentMode, Delphi-Referenz durchsuchenTBitmap.TransparentColor, Delphi-Referenz durchsuchenTBitmap.Transparent.

Und wie komme ich an das Bitmap eines PaintBox?
Achtung: Ich rede nicht vom Quellbitmap! Ich rede vom "eingefügten" Bitmap!
(Aber selbst wenn, würde es nicht viel bringen, siehe unten)

Zitat:

Zitat von Muetze1
3. Wenn du die Transparent-Eigenschaft des TBitmaps verwendest, dann musst du das BitBlt() durch Draw() ersetzen, weil BitBlt() von WinAPI nichts von TBitmap der VCL weiss und sich somit auch nicht darum kümmert. Auch dieses hatte ich oben schon geschrieben.

Aber das ergibt keinen sinn (aus zwei Gründen):
1. Würde ich es vor
oder 2. würde ich es
nach dem kopieren selber einzeichenen. Und ich möchte es ja nicht transparent haben, dass man die unterliegende Form sieht.
Sondern ich würde gerne ein BitMap haben, mit einen Quadrat, welcher durch eine gestrichelte Line dargestellt wird.

Zitat:

Zitat von Muetze1
4. @xZise: Die Farbe des Brushes ist egal, wenn du Brush.Style auf bsClear stellst. Du kannst auch beim Canvas folgendes machen, aber eigentlich ist dies nicht nötigt:
Delphi-Quellcode:
SetMode(Canvas.Handle, TRANSPARENT);

Das mag sein, aber wenn er das nicht "cleared", dann müsste wenigstens die Farbe zu sehen sein.
Außer irgendwo ist "clBtnFace" als Standard definiert.

In Punkt 3 siehts du was ich möchte, da deine Beispiele hier an sich nichts bringen.

Ich suche eigentlich nur eine Möglichkeit, dass er ein bisschen zeichnet, und dann wieder ein bisschen nicht.
Aber ich sehe schon dass ich es selber machen muss. Und solange es sich um Parallelen zu den Bildschirmrändern hält.

Muetze1 7. Jan 2007 20:51

Re: [TPaintBox] - "Hintergrundfarbe" für Pen.Style
 
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von xZise
Zitat:

Zitat von Muetze1
1. wenn du das einmal in die Paintbox gezeichnet hast, dann müsstest du bei Änderung der Position der transparenten Bereiche die alten gemalten Pixel weg bekommen. Transparent heisst aber nun mal nicht, dass er dort was "transparentes" hinmalt an der Stelle sondern er das malen dort auslässt.

Und was heißt das?

Das heisst, du musst den Canvas der leer bekommen. Bei transparenten Teilen bedeutet dies, dass der Parent neu gezeichnet werden muss an der Stelle, wo die PaintBox liegt. Dank der VCL würde somit ein TPaintBox.Update helfen.

Zitat:

Zitat von xZise
Zitat:

Zitat von Muetze1
2. Wenn du nur eine Farbe in dem Bitmap Transparent haben willst, dann setz die entsprechende Eigenschaft des Bitmaps (wie ich oben schon geschrieben hatte). Delphi-Referenz durchsuchenTBitmap.TransparentMode, Delphi-Referenz durchsuchenTBitmap.TransparentColor, Delphi-Referenz durchsuchenTBitmap.Transparent.

Und wie komme ich an das Bitmap eines PaintBox?
Achtung: Ich rede nicht vom Quellbitmap! Ich rede vom "eingefügten" Bitmap!
(Aber selbst wenn, würde es nicht viel bringen, siehe unten)

Ich rede von deinem "Quellbitmap". Ein TPaintBox hat nur einen Canvas, keine Bitmap oder sonstiges. Genau aus diesem Grund muss beim OnPaint immer der Inhalt der PaintBox neu gezeichnet werden. Wenn du dies nun nicht auf deinem QuellBitmap haben willst, dann füge ein temporäres TBitmap ein, male da dein QuellBitmap rauf, dann deine Linien, dann die Transparenz setzen und diese dann auf den Canvas der PaintBox bringen.

Und wegen dem restlichen Text von dir: Ich kapier nicht wirklich was du willst. So wie ich das verstanden habe, willst du einfach nur eine Strichellinie auf diesem vorher auf die Paintbox gemalte Bitmap hinterlassen, mit der Bedingung, dass die Zwischenräume bei psDashDot nicht mit der Brush.Color gefüllt wird, sondern dort soll das Bitmap durchscheinen.

Wenn dem wirklich so ist, dann weiss ich nicht, was dein Problem ist. Ich habe genau das mal schnell zusammengeklickt und es klappt einwandfrei wenn Brush.Style auf bsClear gesetzt wird. Schau dir den Anhang an, wenn das nicht das ist, was du suchst, dann beschreibe mir das Problem bitte nochmal genau.

xZise 8. Jan 2007 11:04

Re: [TPaintBox] - "Hintergrundfarbe" für Pen.Style
 
Nagut. Eigentlich wolllte ich mir weitere Bitmaps sparen, aber es lässt sich wohl nicht verhindern ;)

Und du hast alles richtig verstanden, und ich denke so wäre es auch umzusetzten.

Aber eine Frage: Ich kann dennoch BitBlt benutzen, oder? Er hat ja alles gezeichnet...

[edit]Okay!
Es funktioniert, wenn auch umständlich :D
Delphi-Quellcode:
bBuffer := TBitmap.Create;
try
  bBuffer.Width := pbMap.Width;
  bBuffer.Height := pbMap.Height;
  BitBlt(bBuffer.Canvas.Handle, xDis, yDis, bMap.Width, bMap.Width, bMap.Canvas.Handle, 0, 0, SRCCOPY);
  with bBuffer.Canvas do
  begin
    Brush.Style := bsClear;
    Pen.Style := psDot;
    Pen.Color := $000000FF;
    MoveTo((selectRect.X * 32) + xDis, (selectRect.Y * 32) + yDis);
    LineTo(((selectRect.X + 1) * 32) + xDis, (selectRect.Y * 32) + yDis);
    LineTo(((selectRect.X + 1) * 32) + xDis, ((selectRect.Y + 1) * 32) + yDis);
    LineTo((selectRect.X * 32) + xDis, ((selectRect.Y + 1) * 32) + yDis);
    LineTo((selectRect.X * 32) + xDis, (selectRect.Y * 32) + yDis);
  end;
  BitBlt(pbMap.Canvas.Handle, 0, 0, bBuffer.Width, bBuffer.Height, bBuffer.Canvas.Handle, 0, 0, SRCCOPY)
  finally
    FreeAndNil(bBuffer);
  end;
[/edit]

Muetze1 8. Jan 2007 12:55

Re: [TPaintBox] - "Hintergrundfarbe" für Pen.Style
 
Und das läuft nicht?

Delphi-Quellcode:
  BitBlt(pbMap.Canvas.Handle, xDis, yDis, bMap.Width, bMap.Width, bMap.Canvas.Handle, 0, 0, SRCCOPY);
  with pbMap.Canvas do
  begin
    Brush.Style := bsClear;
    Pen.Style := psDot;
    Pen.Color := $000000FF;
    MoveTo((selectRect.X * 32) + xDis, (selectRect.Y * 32) + yDis);
    LineTo(((selectRect.X + 1) * 32) + xDis, (selectRect.Y * 32) + yDis);
    LineTo(((selectRect.X + 1) * 32) + xDis, ((selectRect.Y + 1) * 32) + yDis);
    LineTo((selectRect.X * 32) + xDis, ((selectRect.Y + 1) * 32) + yDis);
    LineTo((selectRect.X * 32) + xDis, (selectRect.Y * 32) + yDis);
  end;

xZise 8. Jan 2007 13:55

Re: [TPaintBox] - "Hintergrundfarbe" für Pen.Style
 
:wall: Ähm nein?
Siehe:

Zitat:

Zitat von xZise
Naja ;) Ich will dich nicht ärgern, aber ich habe die Brush-Farbe und den Brush-Style "abnormalisiert" ohne Änderung...

Ich bezog mich auf die Paintbox. Hatte vergessen zu sagen, dass ich das Quellbitmap nicht verändern will.

Muetze1 8. Jan 2007 15:08

Re: [TPaintBox] - "Hintergrundfarbe" für Pen.Style
 
Zitat:

Zitat von xZise
:wall: Ähm nein?
Siehe:

Zitat:

Zitat von xZise
Naja ;) Ich will dich nicht ärgern, aber ich habe die Brush-Farbe und den Brush-Style "abnormalisiert" ohne Änderung...

Ich bezog mich auf die Paintbox. Hatte vergessen zu sagen, dass ich das Quellbitmap nicht verändern will.

Was mich sehr wundert, denn der Code von mir von eben funktioniert bei mir genauso. Es muss daher noch an irgendwas anderes bei dir liegen.

Und die Quellbitmap verändere ich nicht. Ich zeichne deine Quellbitmap auf die PaintBox und dann male ich in der PaintBox die Linien und das wiederrum funktioniert mit dem von mir geposteten Code und es entspricht hierbei sogar dem Code aus meinem zuvor geposteten Beispielprogramm, wo dies auch funktioniert.

Somit: Machst du noch irgendwas anderes im OnPaint der PaintBox?

xZise 8. Jan 2007 15:13

Re: [TPaintBox] - "Hintergrundfarbe" für Pen.Style
 
Nein.
Das war der ganze Code...
Übrigens habe ich gesehen, dass du nichts auf den QuellBitMap änderst. Das wundert mich sehr, dass es funktioniert...

Ich werde mir dann wohl doch deinen Code runterladen (ich dachte eigentlich, dass du es so wie ich programmiert hast...)

[edit]Ha! Den Täter habe ich entlarvt ;)
Ich habe (der Unterschied!) den Style im Create der Form gesetzt ;)
Und so wie es aussieht scheint da BitBlt oder irgendetwas ähnliches dazwischen zufunken.

:D Ich hätte mir deinen Code vorher angucken sollen...[/edit]

xZise 8. Jan 2007 15:21

Re: [TPaintBox] - "Hintergrundfarbe" für Pen.Style
 
[edit]wow... Ein Doppelpost :P ... sry, hatte ich übersehen...
(Wir war eh so, als hätte ich schon was geschrieben....)[/edit]

Muetze1 8. Jan 2007 15:49

Re: [TPaintBox] - "Hintergrundfarbe" für Pen.Style
 
*puh* Ich dachte schon wir bekommen das gar nicht mehr und bestehen beide auf unseren Codes das sie gehen bzw. nicht.

Gut das das geklärt ist...


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:59 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