Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Durchsichtiges Fenster (nicht Alpha Blend) (https://www.delphipraxis.net/11446-durchsichtiges-fenster-nicht-alpha-blend.html)

F.W. 6. Nov 2003 19:21


Durchsichtiges Fenster (nicht Alpha Blend)
 
Ich arbeite an einem Grafikprogramm, und möchte gern eine Form als Rahmen für einen Screenshot benutzen.

Dafür sollte allerdings die Form, also die Oberfläche durchsichtig sein. Die Titelleiste und die Umrandung allerdings nicht! Das soll ja als Rahmen dienen.

Und da ich mir da noch keine Gedanken drüber gemacht habe:
Gibt es einen Befehl, zum Screenshot machen?

Danke schonmal!

Illuminator-23-5 6. Nov 2003 19:25

Re: Durchsichtiges Fenster (nicht Alpha Blend)
 
ich weiß nicht, wies mit vorherigen versionen is, aber bei delphi6 gibts die eigenschaften TransparentColor und TransparentColorValue! die könnteste dir mal anschaun!

screenshot dürfteste hier in der forumsuche leicht finden!

himitsu 6. Nov 2003 20:34

Re: Durchsichtiges Fenster (nicht Alpha Blend)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das Beispiel zum ausschneiden:
Code-Library -> Windows-API -> Wie mache ich ein elliptisches Formular?

Und ein altes Demo von mir um eine andere Form zu erstellen
Ein Vorschlag: ein Rechteck erstellen und aus diesem ein kleineres Rechteck ausschneiden (rdn_diff).

Da das in dem Beispiel auf Images angewendet wird, musst du nur
Delphi-Quellcode:
SelectObject(XXX.Canvas.Handle, RHandle);
durch
Delphi-Quellcode:
SetWindowRgn(Form1.Handle, RHandle, True);
ersetzen.

F.W. 6. Nov 2003 21:32

Re: Durchsichtiges Fenster (nicht Alpha Blend)
 
Danke, ich habe schon eine gute Methode gefunden:
Ich benutze "TransparentColor".

Jetzt ist nurnoch das Problem mit dem Screenshot.

Ich habe mir die anderen Beiträge schon angesehen, aber bei keinem war das richtige dabei...
Ich habe also bsw. auf einer anderen minimierten Form ein TImage. Die Größe davon wird gleichgesetzt mit der Formgröße.
Jetzt soll genau der Bereich der Form(die mit TransparentColor) in des TImage kopiert werden.

Danke!

[Edit:]PS: Ich habe mir die beiden Programme mal angesehen.
Das eine war toll, das andere erstaunlich. Aber ich bin sozusagen Anfänger bzw. ich bringe mir alles selbst bei und lerne durch Versuchen... Handles und Messages sind immernoch ein Rätsel für mich. :wall:

Zum Glück gibts dieses super Forum! :thuimb:

himitsu 6. Nov 2003 21:57

Re: Durchsichtiges Fenster (nicht Alpha Blend)
 
Da fällt mir auf Anhieb diese kleine Taste ein - DRUCK, PRINT oder wie die noch so heißt.
Dadurch wird eine Kopie des Bildschirms in die Zwischenablage gelegt.

Diese kann man mit LoadFromClipboardFormat ins Image holen.
Dann muss das Bild nur noch an Hand der Fensterposition und -grösse beschitten werden.
Delphi-Quellcode:
Uses ClipBrd;

Procedure TForm1.Button1Click(Sender: TObject);
  Var BitMap : TBitMap;
    RahmenbreiteX, RahmenbreiteY: Integer;

  Begin
    BitMap := TBitMap.Create;
    Try
      BitMap.LoadFromClipBoardFormat(cf_BitMap,
        ClipBoard.GetAsHandle(cf_Bitmap), 0);
      Image1.Picture.BitMap.Width := Breite des Ausschnitts;
      Image1.Picture.BitMap.Height := Höhe des Ausschnitts;
      Image1.Picture.BitMap.Canvas.Draw(Form1.Left + RahmenbreiteLinks,
        Form1.Top + RahmenbreiteOben, BitMap);
    Finally
      BitMap.Free;
    End;
  End;
Es gibt dann noch die Möglichkeit die Windowsbotschaften abzuhören oder mit einem Timer zu prüfen, ob sich die Zwischenablage geändert hat. Wenn ein BitMap mit der Grösse und Farbauflösung des Monitors im Zwischenspeicher ist, ist die Chance groß, das es ein Screenshot ist.

scp 7. Nov 2003 02:26

Re: Durchsichtiges Fenster (nicht Alpha Blend)
 
Z.B. das wäre bestimmt hilfreich:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
    procedure WMHOTKEY(var Message: TWMHOTKEY); message WM_HOTKEY;
  public
    { Public-Deklarationen }
  end;
Delphi-Quellcode:
procedure TForm1.WMHOTKEY(var Message: TWMHOTKEY);
begin
  If (Message.HotKey = IDHOT_SNAPDESKTOP) then
    TuWasMitDesktopScreenshot;
  else
  If (Message.HotKey = IDHOT_SNAPWINDOW) then
    TuWasMitFensterScreenshot;
end;
Delphi-Quellcode:
  RegisterHotKey(Handle, IDHOT_SNAPDESKTOP, 0, VK_SNAPSHOT);
  RegisterHotKey(Handle, IDHOT_SNAPWINDOW, MOD_CONTROL, VK_SNAPSHOT);
Genauere Infos gibts in der Windows SDK

PS: Für diese beiden speziellen Hotkeys sind IDHOT_SNAPDESKTOP und IDHOT_SNAPWINDOW bereits vordefinierte Konstanten, es können dafür meines wissens keine anderen IDs verwendet werden.

F.W. 7. Nov 2003 19:14

Re: Durchsichtiges Fenster (nicht Alpha Blend)
 
Ich habe mich nochmal im Forum umgesehen und habe eins gefunden, was garnicht so schwer scheint:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
 X, Y: Integer;
begin
    Canvas.Handle := GetWindowDC(0);
      try
        X := Trunc((Form1.Width-Form1.ClientWidth) div 2);
        Y := Trunc((Form1.Height-Form1.ClientWidth) -X);
        Image1.Picture.Bitmap.Width := Form1.ClientWidth;
        Image1.Picture.Bitmap.Height:= Form1.ClientHeight;
        Image1.Picture.Bitmap.PixelFormat := pfDevice;
        BitBlt(Image1.Picture.Bitmap.Canvas.Handle, -Form1.Left+X, -Form1.Top+Y, Pred(Form1.ClientWidth), Pred(
            Form1.ClientHeight), Canvas.Handle, Form1.Left,
            Form1.Top, Image1.Picture.Bitmap.Canvas.CopyMode);
      finally
        ReleaseDC(0, Canvas.Handle);
      end;
end;
Das Problem ist, das ich in "BitBlt" nicht die richtigen Zahlen eingesetzt habe...
Ich möchte nur den in mein TImage "übernehmen", den die Form bedeckt.

Könnt ihr mir helfen? :lol:

Nelphin 2. Feb 2009 16:42

Re: Durchsichtiges Fenster (nicht Alpha Blend)
 
Zitat:

Zitat von himitsu
Da fällt mir auf Anhieb diese kleine Taste ein - DRUCK, PRINT oder wie die noch so heißt.
Dadurch wird eine Kopie des Bildschirms in die Zwischenablage gelegt.

Diese kann man mit LoadFromClipboardFormat ins Image holen.
Dann muss das Bild nur noch an Hand der Fensterposition und -grösse beschitten werden.
Delphi-Quellcode:
Uses ClipBrd;

Procedure TForm1.Button1Click(Sender: TObject);
  Var BitMap : TBitMap;
    RahmenbreiteX, RahmenbreiteY: Integer;

  Begin
    BitMap := TBitMap.Create;
    Try
      BitMap.LoadFromClipBoardFormat(cf_BitMap,
        ClipBoard.GetAsHandle(cf_Bitmap), 0);
      Image1.Picture.BitMap.Width := Breite des Ausschnitts;
      Image1.Picture.BitMap.Height := Höhe des Ausschnitts;
      Image1.Picture.BitMap.Canvas.Draw(Form1.Left + RahmenbreiteLinks,
        Form1.Top + RahmenbreiteOben, BitMap);
    Finally
      BitMap.Free;
    End;
  End;
Es gibt dann noch die Möglichkeit die Windowsbotschaften abzuhören oder mit einem Timer zu prüfen, ob sich die Zwischenablage geändert hat. Wenn ein BitMap mit der Grösse und Farbauflösung des Monitors im Zwischenspeicher ist, ist die Chance groß, das es ein Screenshot ist.


Hallo,

ich habe diesen etwas angestaubten Beitrag ausgegraben, weil er dem was ich brauche bisher am nächsten kommt. Ich habe versucht ein kleines screengrabbertool zu schreiben mit dem man ein transparentes Wasserzeichen auf einen beliebigen Hintergrund blenden und davon dann einen screenshot machen kann.

Soweit habe ich das auch hinbekommen - nur beim besagten screenshot wurde das alpha verblendete Wasserzeichen nicht angezeigt, diese Möglichkeit hier ist die erste die funktioniert.

Mir gefällt es aber nicht, über die Zwischenablage gehen zu müssen die ja dadurch gelöscht wird - deswegen nun meine Frage, gibt es noch eine andere - einfache - Möglichkeit einen Screenshot zu erzeugen der auch transparente Forms mitnimmt?

Da ich erst seit 2 Wochen delphi mache und sonst wenig Vorkenntnisse habe, wäre ich für anfängefreundliche Antworten (eventuell mit Links zu Beispielen) dankbar. :duck:

Gruß

_frank_ 24. Mär 2009 17:42

Re: Durchsichtiges Fenster (nicht Alpha Blend)
 
willst du einen Screenshot machen und diesen anzeigen in einem Form, welches wie ein Bilderrahmen aussieht, oder willst du nur dass ein Rahmen draufgemalt wird, um es bisschen aufgepepter zu speichern.

ersteres geht mit Regions, siehe Himitsu's post
letzteres kannst per Canvas des Bitmap-Objektes machen.

den screenshot selbst kann man z.b. so:

Delphi-Quellcode:
procedure TAlarmDataList.GetScreenBitmap(r:TRect;bmp:TBitmap);
var FHdc:HDC;
begin
  FHdc:=GetDC(0);
  bmp.width:=r.right-r.left;
  bmp.height:=r.Bottom-r.top;
  bmp.pixelformat:=pf24Bit;
  bitblt(bmp.canvas.handle,0,0,bmp.width,bmp.height,FHdc,r.left,r.top,srcCopy);
end;
HTH Frank

Nelphin 25. Mär 2009 12:21

Re: Durchsichtiges Fenster (nicht Alpha Blend)
 
Liste der Anhänge anzeigen (Anzahl: 1)
d
Zitat:

Zitat von _frank_
willst du einen Screenshot machen und diesen anzeigen in einem Form, welches wie ein Bilderrahmen aussieht, oder willst du nur dass ein Rahmen draufgemalt wird, um es bisschen aufgepepter zu speichern.

ersteres geht mit Regions, siehe Himitsu's post
letzteres kannst per Canvas des Bitmap-Objektes machen.

den screenshot selbst kann man z.b. so:

Delphi-Quellcode:
procedure TAlarmDataList.GetScreenBitmap(r:TRect;bmp:TBitmap);
var FHdc:HDC;
begin
  FHdc:=GetDC(0);
  bmp.width:=r.right-r.left;
  bmp.height:=r.Bottom-r.top;
  bmp.pixelformat:=pf24Bit;
  bitblt(bmp.canvas.handle,0,0,bmp.width,bmp.height,FHdc,r.left,r.top,srcCopy);
end;
HTH Frank

Hi, nein, ich will keine rahmen ich will ein wasserzeichen drüberblenden aber mit der screenshotmethode die du vorschlägst ignoeriert er beim srccopy einfach die alpha blending fenster komplett und tut so als seien die nicht auf dem bildschirm.

ich habe mal ein beispielprogramm geschrieben damit man sieht was ich meine. den ersten button drücken um ein alpha blend form aufzurufen, den zweiten um einen screenshot zu machen (mit deinem code). du wirst sehen, das alpha fenster taucht im screenshot nicht auf.

zur zeit löse ich das problem in meinem projekt indem ich den druck auf die drucken taste simuliere, das entstehende bitmap aus der zwischenablage lade und nachträglich beschneide. Das funktioniert für einzelne screenshots wunderbar, leider ist es aber zu langsam um damit an motion capture zu denken.

ich wüsste gern einen weg wie man entweder gleich alphablendiert kopiert oder nachträglich alphablendingmässig in ein canvas malt.

lieben Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:48 Uhr.
Seite 1 von 3  1 23      

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