Autor |
Beitrag |
Tony-S
      
Beiträge: 184
Erhaltene Danke: 6
Windows 7, XP, Ubtuntu
Delphi 7, Visual Basic.net
|
Verfasst: Mo 12.04.10 22:47
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
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Di 13.04.10 09:10
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 13.04.10 10:42
Meta-Frage: Was muss man an einem transparenten Viereck zeichnen?
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Di 13.04.10 11:10
ich empfehle hier mal brush.style := bsClear;
|
|
Tony-S 
      
Beiträge: 184
Erhaltene Danke: 6
Windows 7, XP, Ubtuntu
Delphi 7, Visual Basic.net
|
Verfasst: Di 13.04.10 15:38
Xion hat folgendes geschrieben : | 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? |
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.
Einloggen, um Attachments anzusehen!
|
|
Tony-S 
      
Beiträge: 184
Erhaltene Danke: 6
Windows 7, XP, Ubtuntu
Delphi 7, Visual Basic.net
|
Verfasst: 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.
Einloggen, um Attachments anzusehen!
|
|
Tony-S 
      
Beiträge: 184
Erhaltene Danke: 6
Windows 7, XP, Ubtuntu
Delphi 7, Visual Basic.net
|
Verfasst: Mi 14.04.10 21:09
~push~ nach fast 24 h ist das hoffentlich ok - weiß denn niemand rat?
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: 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); |
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Tony-S 
      
Beiträge: 184
Erhaltene Danke: 6
Windows 7, XP, Ubtuntu
Delphi 7, Visual Basic.net
|
Verfasst: 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
|
|
|