// Prüft, ob der Inhalt von _Parent komplett Schwarz ist
// Die Prozedur zeichnet, FALLS übergeben, auf _TargetBitmap, was sie "gesehen" hat
// Zum Vermeidung div. Probleme wird der untersuchte Bereich auf 640x480 px skaliert,
// das ist für diese Zwecke mehr als ausreichend genau
function EndOfPresentation_Neu(_Parent: TWinControl; _TargetBitmap: Graphics.TBitmap): Boolean;
var
myBitmap: graphics.TBitmap;
DetectHeight, DetectWidth: Integer;
SourceDC: HDC;
State:
String;
hwParentHandle: HWND;
const
CAPTUREBLT = $40000000;
SCAN_WIDTH = 640;
SCAN_HEIGHT = 480;
begin
Result := False;
// Variablen auf gültige Werte initialisieren, damit sie
// auf jeden Fall korrekt freigegeben werden können
hwParentHandle := 0;
myBitmap :=
NIL;
try
// Kein Parent, keine Analyse
if not assigned(_Parent)
then Exit;
if not _Parent.InheritsFrom(TWinControl)
then Exit;
DetectWidth := _Parent.Width;
DetectHeight := _Parent.Height;
if (DetectHeight < 1)
or (DetectWidth < 1)
then Exit;
// TBitmap initialisieren, und auf die erwartete Größe bringen
State := '
EndOfPresentationDetector.EndOfPresentation_Neu.InitializeValues.Exception: ';
hwParentHandle := _Parent.Handle;
myBitmap := Graphics.TBitmap.Create;
try
myBitmap.PixelFormat := pf32bit;
// Zu analysierender Bereich ist lediglich 640 x 480 px
myBitmap.Width := SCAN_WIDTH;
myBitmap.Height := SCAN_HEIGHT;
// Screenshot vom betroffenen Bereich erstellen
State := '
EndOfPresentationDetector.EndOfPresentation_Neu.DoBitBlt.Exception: ';
SourceDC := GetDC(hwParentHandle);
if SourceDC <> 0
then begin
try // Dieses try/finally ist eigentlch überflüssig, da es hier keine Exception geben sollte
// das "_Parent"-Objekt abfotografieren. Wir skalieren gleichzeitig auf 640 x 480. Hinreichend genau für unseren Zweck.
StretchBlt(myBitmap.Canvas.Handle, 0, 0, SCAN_WIDTH, SCAN_HEIGHT, SourceDC, 0, 0, DetectWidth, DetectHeight, SRCCOPY
or CAPTUREBLT);
finally
ReleaseDC(hwParentHandle, SourceDC);
end;
end;
State := '
EndOfPresentationDetector.EndOfPresentation_Neu.ObereKanteNurSchwarzInProzent.Exception: ';
// Prozedur, die nur auf die Scanlines von myBitmap zugreift, und zurückgibt, Keine Leak/Handle Bedenken!
// Gibt an wie viele Prozent des Bildes explizit schwarz sind,
// bzw. bei wieviel Prozent der Höhes des Bildes (von Oben gesehen)
// die letzte Zeile mit mind. einem nicht-schwarzen Pixel ist
Result := (ObereKanteNurSchwarzInProzent(myBitmap) < 25);
// Falls der Parameter übergeben wurde, wird auf _TargetBitmap das erfasste, nun skalierte und mit
// Hilfslininen versehene Bild ausgegeben, so dass es dem Benutzer angezeigt werden könnte
if assigned(_TargetBitmap)
then begin
_TargetBitmap.Assign(myBitmap);
end;
finally
FreeAndNil(myBitmap);
// wird so immer freigeben, auch im Fall einer Exception
end;
except
on E:
Exception do begin
log(State + E.
Message);
end;
end;
end;