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
// Global
  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

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



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;



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;



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 - 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:

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:

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

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:

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.


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(00, imgCopy.Width, imgCopy.Height));

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

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.


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 ;

 // 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);


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    ;


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


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