AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Durchsichtiges Fenster (nicht Alpha Blend)

Durchsichtiges Fenster (nicht Alpha Blend)

Ein Thema von F.W. · begonnen am 6. Nov 2003 · letzter Beitrag vom 28. Mär 2009
Antwort Antwort
Seite 1 von 3  1 23   
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#1

Durchsichtiges Fenster (nicht Alpha Blend)

  Alt 6. Nov 2003, 20:21
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!
  Mit Zitat antworten Zitat
Illuminator-23-5
(Gast)

n/a Beiträge
 
#2

Re: Durchsichtiges Fenster (nicht Alpha Blend)

  Alt 6. Nov 2003, 20:25
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!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
42.824 Beiträge
 
Delphi 12 Athens
 
#3

Re: Durchsichtiges Fenster (nicht Alpha Blend)

  Alt 6. Nov 2003, 21:34
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 nurSelectObject(XXX.Canvas.Handle, RHandle); durchSetWindowRgn(Form1.Handle, RHandle, True); ersetzen.
Angehängte Dateien
Dateityp: exe clipping.exe (67,1 KB, 54x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#4

Re: Durchsichtiges Fenster (nicht Alpha Blend)

  Alt 6. Nov 2003, 22:32
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.

Zum Glück gibts dieses super Forum!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
42.824 Beiträge
 
Delphi 12 Athens
 
#5

Re: Durchsichtiges Fenster (nicht Alpha Blend)

  Alt 6. Nov 2003, 22:57
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#6

Re: Durchsichtiges Fenster (nicht Alpha Blend)

  Alt 7. Nov 2003, 03:26
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.
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#7

Re: Durchsichtiges Fenster (nicht Alpha Blend)

  Alt 7. Nov 2003, 20:14
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?
  Mit Zitat antworten Zitat
Nelphin

Registriert seit: 2. Feb 2009
Ort: Kaiserslautern
71 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Durchsichtiges Fenster (nicht Alpha Blend)

  Alt 2. Feb 2009, 17:42
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.

Gruß
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#9

Re: Durchsichtiges Fenster (nicht Alpha Blend)

  Alt 24. Mär 2009, 18:42
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
  Mit Zitat antworten Zitat
Nelphin

Registriert seit: 2. Feb 2009
Ort: Kaiserslautern
71 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Durchsichtiges Fenster (nicht Alpha Blend)

  Alt 25. Mär 2009, 13:21
d
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ß
Angehängte Dateien
Dateityp: exe project1_439.exe (401,5 KB, 15x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:46 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