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 Transparentes Bild nicht überall Transparent... (https://www.delphipraxis.net/106506-transparentes-bild-nicht-ueberall-transparent.html)

Green 11. Jan 2008 20:52


Transparentes Bild nicht überall Transparent...
 
Ich habe ein TImage auf dem man per drag and drop einen Rahmen ziehen können soll.
Da das darunterliegende Image nicht übermalt werden soll habe ich bei dem oberen transparent auf true gesetzt,
vor dem zeichnen des Rahmens (also in MouseDown) den brushstyle auf clear gesetzt.
Gezeichnet wird so:
Delphi-Quellcode:
procedure TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Image2.canvas.brush.style :=bsClear;
  if shift = [ssleft] then
    begin
      x1 := x; y1 := y;
      x2 := x; y2 := y;
      Image2.canvas.rectangle (x1,y1,x2,y2);
    end;
end;

procedure TForm1.Image2MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if shift = [ssleft] then begin
    Image2.canvas.rectangle (x1,y1,x2,y2);
    y2 := round(y1 + (AufloesungY/AufloesungX) * (x-x1));
    x2 := x;
    Image2.canvas.rectangle (x1,y1,x2,y2);
  end
end;
Bei manchen PCs funktioniert das, man sieht also das darunterliegende bild und auf dem Neuen nur das Grause, bei manchen allerdings sieht man auf dem oberen NUR weiss?
kann mir jemand sagen warum?

lG Green

_frank_ 12. Jan 2008 07:14

Re: Transparentes Bild nicht überall Transparent...
 
warum ein zweites TImage? male doch einfach mit pen.Mode:=pmXOR ;) das gleiche rechteck nochmal malen und es ist wieder weg.
beispiel: http://www.fw-web.de/download.php?ac...pSelection.zip

bei komplizierteren formen auf ein Hintergrundbitmap malen und dieses per bitblt auf die Sichtbare fläche kopieren.
z.b. wie da: http://www.delphi-forum.de/viewtopic...=383875#383875

HTH Frank

Green 12. Jan 2008 11:05

Re: Transparentes Bild nicht überall Transparent...
 
Zitat:

Zitat von _frank_
warum ein zweites TImage? male doch einfach mit pen.Mode:=pmXOR ;) das gleiche rechteck nochmal malen und es ist wieder weg.
beispiel: http://www.fw-web.de/download.php?ac...pSelection.zip

ist denn dann das was davor gemalt wurde wieder sichtbar??

Egal jedenfalls denn mit 2 bildern gehts auch wunderbar, und macht die speichereigenschaft (ich will den rahmen ja nicht mitspeichern) einfacher.
Das Problem war einfach das ich vergessen hatte mittels
Delphi-Quellcode:
  Image2.canvas.brush.style := bsSolid;
  Image2.Canvas.FillRect(Image2.Canvas.ClipRect);
unsichtbar zu machen.

Was mich jetzt nur wundert ist das es auf manchen PCs überhaupt geklappt hat... :gruebel: :gruebel:

_frank_ 12. Jan 2008 18:05

Re: Transparentes Bild nicht überall Transparent...
 
Zitat:

Zitat von Green
Zitat:

Zitat von _frank_
...das gleiche rechteck nochmal malen und es ist wieder weg.

ist denn dann das was davor gemalt wurde wieder sichtbar??

du willst doch nur ein rechteck malen, oder nicht? Was wurde denn zuvor gemalt? die koordinaten von dem rechteck kannst du dir doch merken und ggf. neu malen ohne drag&drop...versteh nicht ganz, was du machen willst...

Zitat:

Zitat von Green
Egal jedenfalls denn mit 2 bildern gehts auch wunderbar, und macht die speichereigenschaft (ich will den rahmen ja nicht mitspeichern) einfacher.
Das Problem war einfach das ich vergessen hatte mittels
Delphi-Quellcode:
  Image2.canvas.brush.style := bsSolid;
  Image2.Canvas.FillRect(Image2.Canvas.ClipRect);
unsichtbar zu machen.

Was mich jetzt nur wundert ist das es auf manchen PCs überhaupt geklappt hat... :gruebel: :gruebel:

vielleicht solltest du mal einen Screenshot anhängen, damit wir wissen, wie es ist und wie es sein sollte.
wenn du nicht nur den rahmen malen willst oder dich das Aussehen des Xor-Rahmens stören sollte, wäre ein hintergrundbitmap wie in dem 2. link von mir imho sinnvoller als ein transparentes TImage obendrüberzulegen...

Frank

Green 14. Jan 2008 17:35

Re: Transparentes Bild nicht überall Transparent...
 
Was ist denn das Problem mit dem Transparenten Image obendrüber?

Ich habe 2 TImages.

Auf dem unteren wird gemalt, auf dem oberen der Rahmen gezeichnet.
So jetzt soll man wie in IrfanView einen Rahmen auf das Bild ziehen können und der muss ja bei jeder mausbewegung gelöscht und neu gezeichnet werden.
Da liegt doch das Problem: denn wenn ich auf dem schön gezeichneten Bild nen Rahmen zeichne und ihn wieder "lösche" dann hab ich doch das alte bild zerstört.
Und das will ich nicht unbedingt.
=> Ein zweites Bild nehmen, die Farbe auf Transparent setzen und Auf diesem Bild Rahmen zeichnen und löschen.

Jetzt nur warum sollte ich es denn ändern? Es klappt doch jetzt ^^
ich hatte nur vergessen es von wornehrein zu 'löschen'...

lG Green

_frank_ 14. Jan 2008 18:42

Re: Transparentes Bild nicht überall Transparent...
 
das Problem ist, das es kein guter Stil ist und (wie du oben schon geschrieben hast) zu unerwarteten Phänomenen auf manchen Rechnern führen kann.
ich glaube nicht, dass du dir das Beispielprogramm angeschaut hast...mit dem Xor-Penmode kannst du das Rechteck ohne probleme wieder löschen. Bei jeder Mausbewegung wird der alte Rahmen gelöscht (durch nochmaliges Malen), die Koordinaten des Rechtecks neu berechnet (anhand der Mausposition) und ein neuer Rahmen gemalt.
ist nicht wirklich viel mehr Arbeit als mit dem zweiten Image.
Irfanview macht das sicher auch so ähnlich, ggf. wie in meinem zweitem Beispiel mit dem temporär-bitmap. Dieses Temporärbitmap ist zwar bisschen mehr Arbeit, gibt einem aber auch viele Möglichkeiten, wie dort zu sehen.

Gruß Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz