Autor Beitrag
Tony-S
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 184
Erhaltene Danke: 6

Windows 7, XP, Ubtuntu
Delphi 7, Visual Basic.net
BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
// Global
  frmMask: TfrmMask;
  x1,x2,y1,y2:integer;
  InMove: Boolean;
  MausPos: TPoint;



ausblenden 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

  // Anpassen des Hauptfensters und des Images an die Höhe und Breite des Screens
  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;


ausblenden 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        //Zeichnen mit linker Maustaste
  begin
  InMove := True;
  if InMove then
  begin
  GetCursorPos(MausPos);
  x1:=MausPos.X;
  x2:=Mauspos.y;
  end;
  end;
end;


ausblenden 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    ;

        // Immer wieder ein neues Viereck zeichnen
        FillRect(Rect(00, imgCopy.Width, imgCopy.Height));

        // Viereck zeichnen
        Rectangle(x1, x2, y1,y2);
        end;

  end;
end;


ausblenden 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 user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 13.04.2010 um 09:56
Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: Di 13.04.10 09:10 
user profile iconTony-S hat folgendes geschrieben Zum zitierten Posting springen:

setze ich Transparent Color auf schwarz und fülle mein gezeichnetes Viereck nun eben auch schwarz


user profile iconTony-S hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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?


user profile iconTony-S hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
        pen.color:=clgreen;
        Brush.color := clred ;

Ich denke schwarz?

_________________
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Di 13.04.10 11:10 
ich empfehle hier mal brush.style := bsClear;
Tony-S Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 184
Erhaltene Danke: 6

Windows 7, XP, Ubtuntu
Delphi 7, Visual Basic.net
BeitragVerfasst: Di 13.04.10 15:38 
user profile iconXion hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconTony-S hat folgendes geschrieben Zum zitierten Posting springen:

setze ich Transparent Color auf schwarz und fülle mein gezeichnetes Viereck nun eben auch schwarz


user profile iconTony-S hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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:

Picture

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:

Picture_Fail


Anstelle des Quadrates wird die ganze Form komplett durchsichtig, wieso ist das denn so, was kann ich da ändern?

Moderiert von user profile iconNarses: Zitat repariert.
Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
Moderiert von user profile iconNarses: Bilder als Anhänge hochgeladen.
Einloggen, um Attachments anzusehen!
Tony-S Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 184
Erhaltene Danke: 6

Windows 7, XP, Ubtuntu
Delphi 7, Visual Basic.net
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
      FillRect(Rect(00, imgCopy.Width, imgCopy.Height));

      // Viereck zeichnen
      Rectangle(x1, x2, y1,y2);

hab ich einfach in
ausblenden 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:

Picture_Redraw

das wäre im Moment nur noch mein Problem, wäre toll wenn wir das lösen könnten :)

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
Moderiert von user profile iconNarses: Bild als Anhang hochgeladen.
Einloggen, um Attachments anzusehen!
Tony-S Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 184
Erhaltene Danke: 6

Windows 7, XP, Ubtuntu
Delphi 7, Visual Basic.net
BeitragVerfasst: Mi 14.04.10 21:09 
~push~ nach fast 24 h ist das hoffentlich ok - weiß denn niemand rat?
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
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)
BeitragVerfasst: Mi 14.04.10 21:22 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
 pen.color:=clgreen;
 Brush.style := bssolid ;

 // Immer wieder ein neues Viereck zeichnen
 Brush.color := clWhite;
 FillRect(Rect(00, frmMask.Width, frmMask.Height));

 // Viereck zeichnen
 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 184
Erhaltene Danke: 6

Windows 7, XP, Ubtuntu
Delphi 7, Visual Basic.net
BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
3:
temp := tbitmap.create;
temp.width := width;
temp.height := height;


und im MouseMove des Images:

ausblenden 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    ;


        // Immer wieder ein neues Viereck zeichnen


        // Viereck zeichnen
        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:

ausblenden 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