AW: Bildschirmfoto knipst nicht alles
Zitat:
Bei Invalidate wird Windows mitgeteilt, dass das Fenster neu gezeichnet werden soll. In dem Fall das Image. Blick in die Source von refresh: das ruft Repaint auf Repaint:
Delphi-Quellcode:
Im Normalfall ist es so das ein Invalidate ausreichen sollte. Windows kümmert sich dann darum, wann das Zeichnen passieren soll. WM_PAINT wird mit einer geringeren Priorität ausgelöst.
Invalidate
Update; https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx kommt also immer darauf an was Du erwartest. Bei Refresh und co ist die Systemlast höher, da immer sofort gezeichnet wird. Aber mit Multimonitor hat das rein gar nichts zu tun |
AW: Bildschirmfoto knipst nicht alles
Zitat:
Sondern darüber welche Funktion er verwenden soll. Die erste oder die zweite Methode. Methode A:
Delphi-Quellcode:
Methode B:
Function CaptureScreen(var hbmp: HBITMAP): Boolean;
var hDCScreen, hDCMem : HDC; cx, cy: Integer; hBmpOld: HBITMAP; dwRop: DWORD; begin hDCScreen := CreateDC('DISPLAY', 0, 0, 0); cx := GetDeviceCaps(hDCScreen, HORZRES); cy := GetDeviceCaps(hDCScreen, VERTRES); hDCMem := CreateCompatibleDC(hDCScreen); hbmp := CreateCompatibleBitmap(hDCScreen, cx, cy); hBmpOld := SelectObject(hDCMem, hbmp); dwRop := SRCCOPY or CAPTUREBLT; Result := BitBlt(hDCMem, 0, 0, cx, cy, hDCScreen, 0, 0, dwRop); SelectObject(hDCMem, hBmpOld); DeleteDC(hDCMem); DeleteDC(hDCScreen); end; 1. GetDesktopWindow 2. GetDC\CreateDC 3. GetWindowRect 4. StretchBlt via BitBlt. 5. ReleaseDC Was hat das jetzt mit Invalidate zu tun? Das! Zitat:
Du musst das schon auseinander halten. gruss |
AW: Bildschirmfoto knipst nicht alles
Zitat:
Sorry, nix für Ungut, dann kennt er jetzt zumindest den Unterschied zwischen I und R::) |
AW: Bildschirmfoto knipst nicht alles
Zitat:
gruss |
AW: Bildschirmfoto knipst nicht alles
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Ihr Lieben,
um die Frage "wie wirds bei mir momentan Angezeigt" zu beantworten, so: Anhang 49187 mit invalidate zum aktualisieren. Die Anzeige hat aber nichts mit dem Bild gemeinsam was gespeichert wird, das liegt noch im Rohformat rum so wie ichs ausgelesen habe und kann an mehreren Stellen freigegeben werden. Alles noch totale Early Alpha Phase. Vielen Dank für Erklärungen für beide Fragezeichen die ich so hatte, es hat beides gefruchtet :thumb: Jetzt mach ich erstmal das was Emil sagte, ich besuche erstmal das MSDN und speicher mir alle Infos zu allen Befehlen damit ich von vorne beginnen kann aber diesmal Richtig, den Methode b) Weg. Danke auch für Vorwarnung mit MultiMonitor, das es da Unterschiede gibt werde wusste ich nicht einmal, gut mitgedacht danke, da werde ich viel zu tun haben, auch Danke für diese Erklärungen und auch das ich ein 32bit Bild erzeugen sollte, darauf wäre ich alleine nie gekommen, ich werde all diese Hinweise aufsaugen inhalieren und langsam verdauen :twisted: |
AW: Bildschirmfoto knipst nicht alles
Wird schon :)
Wenn man die einzelnen schritte einmal verewigt hat ist das die Basis welche man für alle Bildmanipulationen verwenden kann. Zitat:
Also quasi ein MyBitmap.canvas auf 32Bit Bilddaten ausgerichtet. Aber das später ist jetzt für den Anfang nicht so wichtig. PS: Mit der VCL ist das einfach siehe
Delphi-Quellcode:
Das war's dann schon.
Image.PixelFormat := pf32bit;
gruss |
AW: Bildschirmfoto knipst nicht alles
Genau:thumb:
Am Rande..... Und was man im Bild nicht sieht, ich habs so gemacht: App startet und holt sich alle Window Handles die es für mich verarbeiten könnte, selektiert man einen Eintrag erscheint die Vorschau und Kamera wird aktiviert, drückt man Kamera wird der Eigentliche Screenshot erstellt und Speichern ermöglicht. Ist das Ok oder sollte ich da nochmal was überdenken? Nachtrag Danke für Nachtrag:stupid: |
AW: Bildschirmfoto knipst nicht alles
Zitat:
Nachher kannst immer noch etwas feilschen. gruss |
AW: Bildschirmfoto knipst nicht alles
Zwischenstand:
Ich habe nun wieder probiert es hinzubekommen, komplett von vorne bis zum Ende ohne bei Methode b) abzugucken aber mit den Infos von Post 1 angefangen, so das ich theoretisch weiß was ich da mache. Hier stoße ich wieder auf das Layered Problem aber der Rest macht alles Prima. Ist sozusagen ein BestOf ohne Layered support. Das ist sozusagen Methode c).... da diese Methode nicht klappt fange ich nun an Methode b) umzusetzen, ich sagte ja, alleine bin ich noch nicht im Stande und ich habe mir wirklich Mühe gegeben MSDN da zu Verstehen und Richtig einzusetzen aber eure Infos zu Layered für Methode b) vorbehalten/reserviert. OTTB = Geht damit nicht von daher muss ich an dieser Stelle aufgeben mit Methode c)
Delphi-Quellcode:
Und nicht das ihr denkt ich lese nicht alles, ich arbeite alles halt nur langsamer ab da es Neuland ist,
Function Knipse(const Win: HWND; var tbmp: TBitmap; const FullWindow: Boolean): Boolean;
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; tbmp.Canvas.Lock; StretchBlt(tbmp.Canvas.Handle, 0, 0, tbmp.Width, tbmp.Height, hDCScreen, 0, 0, tbmp.Width, tbmp.Height, SRCCOPY or CAPTUREBLT); tbmp.Canvas.Unlock; end; finally ReleaseDC(0, hDCScreen); Result := True; end; end; hier ist meine Interpretation einer WM_PRINT -> ClipBoard -> HBITMAP Variante, irgendwie alles falsch da ich kein Bild erhalte. Also Versucht habe ich es. Das hier steht allerdings nicht zur Debatte, nur zur Illustration wie man es nicht machen sollte:lol:
Delphi-Quellcode:
function MyWM_PRINT(const Win: HWND): HBITMAP;
var rect: TRECT; hBmp: HBITMAP; hOld: HGDIOBJ; hDCMem, hDCScreen: HDC; begin hDCMem := CreateCompatibleDC(0); GetWindowRect(Win, rect); hBmp := 0; hDCScreen := GetDC(Win); hBmp := CreateCompatibleBitmap(hDCScreen, rect.right - rect.left, rect.bottom - rect.top); ReleaseDC(Win, hDCScreen); hOld := SelectObject(hDCMem, hBmp); SendMessage(Win, WM_PRINT, WPARAM(hDCMem), PRF_CHILDREN or PRF_CLIENT or PRF_ERASEBKGND or PRF_NONCLIENT or PRF_OWNED); SelectObject(hDCMem, hOld); DeleteObject(hDCMem); // ich glaub das wär falsch oder? DeleteDC(hDCMem); // oder doch so? me stupid OpenClipboard(Win); EmptyClipboard(); SetClipboardData(CF_BITMAP, hBmp); Result := hBmp; CloseClipboard(); end; |
AW: Bildschirmfoto knipst nicht alles
Delphi-Quellcode:
Lock, Unlock ist nicht von nöten.
tbmp.Canvas.Lock;
StretchBlt(tbmp.Canvas.Handle, 0, 0, tbmp.Width, tbmp.Height, hDCScreen, 0, 0, tbmp.Width, tbmp.Height, SRCCOPY or CAPTUREBLT); tbmp.Canvas.Unlock; StretchBlt auf der Basis auch nicht. StretchBlt ist nur sinnvoll wenn der Source und Destination sich in der weite, Höhe unterscheiden. So macht ein Stretch keinen sinn bei gleichen ausmaßen. Du kannst hier also getrost BitBlt verwenden. Zitat:
Denn ein HDC ist kein Object.
Delphi-Quellcode:
DeleteObject(hBmp);
wäre korrekt wenn du es nicht noch brauchen würdest.
Delphi-Quellcode:
Result := True;
Warum? Du weist doch gar nicht ob StretchBlt erfolgreich war. Wenn schon dann so.
Delphi-Quellcode:
Result := StretchBlt(bla, bla,
gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:08 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