Entwickler-Ecke
Multimedia / Grafik - Problem beim zeichnen eines transparenten Vierecks
Tony-S - Mo 12.04.10 22:47
Titel: Problem beim zeichnen eines transparenten Vierecks
Hallo Forum, nach langer Zeit habe ich mal wieder ein Problem:
Ich wollte mir das Snipping-Tool aus Vista nachbauen und war nun soweit, dass ich eine transparente Maske (mein Hauptfenster), ein Image auf dem ich ein Viereck zeichne erstellt habe.
Nun hab ich mir gedacht, damit das gezeichnete Vierecht komplett durchsichtig habe, setze ich Transparent Color auf schwarz und fülle mein gezeichnetes Viereck nun eben auch schwarz, und genau DAS will mir nicht gelingen:
Hier mein Quellcode:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| var frmMask: TfrmMask; x1,x2,y1,y2:integer; InMove: Boolean; MausPos: TPoint; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TfrmMask.FormCreate(Sender: TObject); begin
with frmMask do begin Width := Screen.Width; Height := Screen.Height; Left := 0; Top := 0; AlphaBlendValue := 180;
imgCopy.Width := Width; imgCopy.Height := Height; end; canvas.Pen.mode :=pmNotXor; canvas.pen.style:= psSolid;
end; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TfrmMask.imgCopyMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin
if shift = [ssleft] then begin InMove := True; if InMove then begin GetCursorPos(MausPos); x1:=MausPos.X; x2:=Mauspos.y; end; end; end; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure TfrmMask.imgCopyMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin GetCursorPos(MausPos); y1:=mauspos.x; y2:=mauspos.Y;
if inmove then begin with imgCopy.Canvas do begin
pen.color:=clgreen; Brush.color := clred ; Brush.style := bssolid ;
FillRect(Rect(0, 0, imgCopy.Width, imgCopy.Height));
Rectangle(x1, x2, y1,y2); end;
end; end; |
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TfrmMask.imgCopyMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin InMove := False; end; |
Ich hoffe man kann verstehen was ich versucht habe - wäre klasse wenn mir jemand sagen kann was ich falsch mache, ich habe zwar schon einige kleine Dinge in Delphi geschrieben, aber manchmal weiß ich doch nich weiter. Danke schonmal für eure Hilfe =) .
Moderiert von
Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 13.04.2010 um 09:56
Moderiert von
Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
Xion - Di 13.04.10 09:10
Tony-S hat folgendes geschrieben : |
setze ich Transparent Color auf schwarz und fülle mein gezeichnetes Viereck nun eben auch schwarz |
Tony-S hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| with frmMask do begin Width := Screen.Width; Height := Screen.Height; Left := 0; Top := 0; AlphaBlendValue := 180; end; | |
Wo setzt du hier die Werte TransparentColor und Transparent der Form?
Tony-S hat folgendes geschrieben : |
Delphi-Quelltext 1: 2:
| pen.color:=clgreen; Brush.color := clred ; | |
Ich denke schwarz?
BenBE - Di 13.04.10 10:42
Meta-Frage: Was muss man an einem transparenten Viereck zeichnen?
FinnO - Di 13.04.10 11:10
ich empfehle hier mal brush.style := bsClear;
Tony-S - Di 13.04.10 15:38
Die habe ich bereits im Designer gesetzt, also AlphablenValue auf 0 (und durch das FormCreate eben auf 180) und TransparentColor eben auf rot (nicht schwarz), beides True, damit das auch funzt.
brushstyle := bsclear; funktioniert glaube nicht, weil so das viereck nicht neu gezeichnet wird. Zur Metafrage, stimmt, an sich garnicht aber um das so zu haben wie ich es hier auf dem Bild habe, schon:
Das Quadrat was dort komplett durchsichtig ist, ist ein Panel, welches rot ist - zum Test. Und genauso komplett durchsichtig möchte ich das gezeichnete Quadrat, deswegen dachte ich mir, "fülle" ich das eben rot.
Wenn ich allerdings selbiges dann aufziehe schaut das so aus:
Anstelle des Quadrates wird die ganze Form komplett durchsichtig, wieso ist das denn so, was kann ich da ändern?
Moderiert von
Narses: Zitat repariert.
Moderiert von
Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
Moderiert von
Narses: Bilder als Anhänge hochgeladen.
Tony-S - Di 13.04.10 20:19
OK, das die ganze Form bzw das Image sich rot färbt hab ich nun lösen können, mein Fehler war wohl folgendes:
Diesen Abschnitt hier:
Delphi-Quelltext
1: 2: 3: 4:
| FillRect(Rect(0, 0, imgCopy.Width, imgCopy.Height));
Rectangle(x1, x2, y1,y2); |
hab ich einfach in
Delphi-Quelltext
1: 2:
| fillrect (rect(x1,x2,y1,y2)); Rectangle(x1, x2, y1,y2) |
abgeändert.
Nur hab ich leider gerade das Problem das, dass Viereck nicht neugezeichnet wird:
das wäre im Moment nur noch mein Problem, wäre toll wenn wir das lösen könnten :)
Moderiert von
Narses: Delphi-Tags hinzugefügt
Moderiert von
Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
Moderiert von
Narses: Bild als Anhang hochgeladen.
Tony-S - Mi 14.04.10 21:09
~push~ nach fast 24 h ist das hoffentlich ok - weiß denn niemand rat?
Xion - Mi 14.04.10 21:22
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| pen.color:=clgreen; Brush.style := bssolid ;
Brush.color := clWhite; FillRect(Rect(0, 0, frmMask.Width, frmMask.Height));
Brush.color := clred ; FillRect(x1, x2, y1,y2); |
Tony-S - Mi 14.04.10 22:07
Danke Xion ich habe allerdings ein andere aber im Prinzip sehr ähnliche Lösung gefunden,
ich bin davon ausgegangen, das man ein Canvas löschen kann, aber das geht wohl nicht,
also muss man es neu zeichnen.
im FormCreate also:
Delphi-Quelltext
1: 2: 3:
| temp := tbitmap.create; temp.width := width; temp.height := height; |
und im MouseMove des Images:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| if inmove then begin
with imgCopy.Canvas do begin draw(0,0,temp); pen.color:=clgreen; Brush.color := clred ; Brush.style := bssolid ;
fillrect (rect(x1,x2,y1,y2)); Rectangle(rect(x1, x2, y1,y2)) ; end; end; |
Danke, das du mir noch eine andere Möglichkeit gezeigt hast,
aber müsste es nicht auch:
Delphi-Quelltext
1: 2:
| Brush.color := clred ; FillRect(Rect(x1, x2, y1,y2)); |
(das rect) heißen?
Vielen Dank und noch nen schönen Abend
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!