![]() |
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! |
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! |
Re: Durchsichtiges Fenster (nicht Alpha Blend)
Liste der Anhänge anzeigen (Anzahl: 1)
Das Beispiel zum ausschneiden:
![]() 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:
durch
SelectObject(XXX.Canvas.Handle, RHandle);
Delphi-Quellcode:
ersetzen.
SetWindowRgn(Form1.Handle, RHandle, True);
|
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: |
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:
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.
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; |
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:
Genauere Infos gibts in der Windows SDK
RegisterHotKey(Handle, IDHOT_SNAPDESKTOP, 0, VK_SNAPSHOT);
RegisterHotKey(Handle, IDHOT_SNAPWINDOW, MOD_CONTROL, VK_SNAPSHOT); 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. |
Re: Durchsichtiges Fenster (nicht Alpha Blend)
Ich habe mich nochmal im Forum umgesehen und habe eins gefunden, was garnicht so schwer scheint:
Delphi-Quellcode:
Das Problem ist, das ich in "BitBlt" nicht die richtigen Zahlen eingesetzt habe...
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; Ich möchte nur den in mein TImage "übernehmen", den die Form bedeckt. Könnt ihr mir helfen? :lol: |
Re: Durchsichtiges Fenster (nicht Alpha Blend)
Zitat:
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ß |
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:
HTH Frank
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; |
Re: Durchsichtiges Fenster (nicht Alpha Blend)
Liste der Anhänge anzeigen (Anzahl: 1)
d
Zitat:
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 20:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz