AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bildschirmfoto knipst nicht alles
Thema durchsuchen
Ansicht
Themen-Optionen

Bildschirmfoto knipst nicht alles

Ein Thema von KodeZwerg · begonnen am 29. Mai 2018 · letzter Beitrag vom 4. Jun 2018
Antwort Antwort
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Bildschirmfoto knipst nicht alles

  Alt 1. Jun 2018, 01:25
Lock, Unlock ist nicht von nöten. StretchBlt auf der Basis auch nicht.
Das ist eigentlich ne Doppelfunktion nur Aufruf hier entfernt deswegen Dir noch Unbekannt.
Hat 2 Modis, erstelle Preview (auf aktuelle Größe was meine App dem Image bietet und halt das ganze 1:1 wie man es hier sieht.
Nur damit ich das auch weiß, entsteht dadurch ein Nachteil bei 0 Änderungen der Größe, wenn ja dann mach ich "FinalBildModus" mit BitBlt. <- Das meine Frage aber nichts desto trotz mach ich BitBlt daraus fürs FinalBild da Vertrau ich dem Experten! Ok das Lock Unlock spare ich auch mir Danke!
DeleteObject(hBmp);
Ich hab da echt nen Denkfehler aber DeleteObject(hOld); muss es lauten dann sollte es theoretisch passen aber das lenkt mich zu sehr ab.
Du weist doch gar nicht ob StretchBlt erfolgreich war.
Aua, Du hast Da natürlich total Recht und das korrigiere ich bei mir für die Akten..... mist dabei hatte ich mir soviel Mühe gegeben aber so lerne ich ja aus meinen Fehlern, Danke!

Für die Akten, so isses nu
Delphi-Quellcode:
Function Knipse(const Win: HWND; var tbmp: TBitmap; const FullWindow: Boolean; const NewX, NewY: Integer): Boolean;
//Aufruf:
// Parameter 1 = Window Handle
// Parameter 2 = Ein Bitmap
// Parameter 3 = Mit oder ohne Rahmen (Titelleiste, Caption, SystemKnöpfe, Rand ums Fenster)
// Parameter 4 + 5 = 0 für Final 1:1 Bild, X + Y Pixel Angaben für Preview
// Danke Emil für korrekturen
const
  CAPTUREBLT = $40000000;
var
  hDCScreen: HDC;
  rec: TRect;
begin
  Result := False;
  if Win = 0 then Exit;
  try
    begin
      if FullWindow then
       begin
         hDCScreen := GetWindowDC(Win);
         Windows.GetWindowRect(Win, rec)
       end else
       begin
         hDCScreen := GetDC(Win);
         Windows.GetClientRect(Win, rec);
       end;
      tbmp.PixelFormat:=pf32bit;
      tbmp.Width := Rec.Right - Rec.Left;
      tbmp.Height := Rec.Bottom - Rec.Top;
      if ((NewX<>0)and(NewY<>0)) then
        Result := StretchBlt(tbmp.Canvas.Handle, 0, 0,
                   NewX, NewY,
                   hDCScreen, 0, 0,
                   tbmp.Width, tbmp.Height,
                   SRCCOPY or CAPTUREBLT)
      else
        Result := BitBlt(tbmp.Canvas.Handle, 0, 0,
                         tbmp.Width, tbmp.Height,
                         hDCScreen, 0, 0,
                         SRCCOPY or CAPTUREBLT);
    end;
  finally
    ReleaseDC(0, hDCScreen);
  end;
end;
Gruß vom KodeZwerg

Geändert von KodeZwerg ( 1. Jun 2018 um 02:10 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Bildschirmfoto knipst nicht alles

  Alt 1. Jun 2018, 09:10
Zitat:
Das ist eigentlich ne Doppelfunktion nur Aufruf hier entfernt deswegen Dir noch Unbekannt.
Was Lock, Unlock ?

Was soll mir da unbekannt sein?
Ist das selbe wie LockWindowUpdate.. und WM_SETREDRAW.
Und beide sind nicht nötig warum soll ich das Window vor neu zeichnen schützen?
Sehr suspekt das ganze.

Zitat:
X + Y Pixel Angaben für Preview
NewX, NewY hat nichts mit Pixeln zu tun bzw.. ist gleichzusetzen mit x, y wenn schon dann w, h die Parameter repräsentieren die Weite und die Höhe
des Container in dem das Bild gestreckt werden soll.

Ok denke es wurde alles gesagt.
Der Fertigstellung deines Projekts steht nun nichts mehr im Wege.

EDIT:
Warum einmal
hDCScreen := GetWindowDC(Win);
und dann
hDCScreen := GetDC(Win);

Wenn schon dann umgekehrt.

Bei FullScreen GetDC und beim Kopieren von Fenster Inhalten incl. Rahmen und was so dazugehört GetWindowDC.
Der Unterschied ist einfach erklärt.

GetDC gibt dir das DC (device context) eines Client Bereichs zurück bzw. das des gesamten Bildschirms.
GetWindowDC gibt dir das DC (device context) eines Fensters einschließlich der Titelleiste, und Bildlaufleisten zurück.

Noch was du holst dir das DC von "Win" welches das auch immer ist und gibst es frei mit einem "0" Handle?
ReleaseDC(0, hDCScreen);
Wie das?

Ich könnte das verstehe wenn du das verwendest.
GetDC(0) und anschließend ReleaseDC(0, hDCScreen);

Aber nicht wenn du GetDC(Win) verwendest und anschließend ReleaseDC(0, hDCScreen)
Was gibst du hier frei? Gar nichts. Jetzt ReleaseDC(Win, hDCScreen) schon..

gruss

Geändert von EWeiss ( 1. Jun 2018 um 11:42 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 15:49 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-2025 by Thomas Breitkreuz