Wie erfasse ich Seitenbereiche in TWebBrowser?
-
28-10-2019 - |
Frage
Ich versuche, ein Programm zu erstellen, das Screenshots von verschiedenen Bereichen auf der Site erstellt, die in die TWebBrowser
-Komponente geladen werden.
Bisher habe ich nur Lösungen gefunden, um einen Screenshot der gesamten Seite zu erstellen, aber ich konnte es einfach nicht zum Erfassen einer bestimmten Region bringen, sondern streckt die Seite nur in eine beliebige Richtung.
http://www.delphifaq.com/faq/f408.shtml
Ich habe den auf der obigen Site dargestellten Code verwendet.
Gibt es eine Möglichkeit, den Code so zu ändern, dass er das tut, was ich brauche?Ich habe es versucht, aber ich bin gescheitert.
Ich würde mich freuen, wenn mir jemand zumindest eine Anleitung geben könnte, wie ich das lösen kann.
Danke
Lösung
Ich empfehle stattdessen die IHTMLElementRender
-Schnittstelle des HTML Elemwnt zu verwenden.Sie können das Element leicht unter dem Cursor finden und in eine Bitmap rendern.
In meinem TWebBrowser-Nachkommen habe ich es folgendermaßen implementiert:
function TWebBrowserIBMA.ElementAsBitmap(pElement : IHTMLElement2) : TBitmap;
var
pRender : IHTMLElementRender;
oBmpPart : TBitmap;
nClientWidth : Integer;
nClientHeight : Integer;
nX : Integer;
nLastX : Integer;
bDoneX : Boolean;
nY : Integer;
nLastY : Integer;
bDoneY : Boolean;
begin
Result := TBitmap.Create;
try
Result.Height := pElement.scrollHeight;
Result.Width := pElement.scrollWidth;
except
exit;
end;
LockWindowUpdate(Handle);
if (pElement.QueryInterface(IID_IHTMLElementRender, pRender) = S_OK) then begin
try
oBmpPart := TBitmap.Create;
oBmpPart.Width := pElement.scrollWidth;
oBmpPart.Height := pElement.scrollHeight;
nClientWidth := pElement.clientWidth;
nClientHeight := pElement.clientHeight;
try
nX := pElement.scrollWidth;
nLastX := -1;
bDoneX := false;
while not bDoneX do begin
pElement.scrollLeft := nX;
nX := pElement.scrollLeft;
if nLastX = -1 then begin
nLastX := nX + nClientWidth;
end;
nY := pElement.scrollHeight;
nLastY := (-1);
bDoneY := false;
while not bDoneY do begin
pElement.scrollTop := nY;
nY := pElement.scrollTop;
if nLastY = -1 then begin
nLastY := nY + nClientHeight;
end;
if (pRender.DrawToDC(oBmpPart.Canvas.Handle) = S_OK) then begin
BitBlt(Result.Canvas.Handle, nX, nY, nLastX-nX, nLastY-nY, oBmpPart.Canvas.Handle, 2, 2,SRCCOPY);
end;
bDoneY := (nY = 0);
nLastY := nY;
Dec(nY, nClientHeight-4);
end;
bDoneX := (nX = 0);
nLastX := nX;
Dec(nX, (nClientWidth-4));
end;
finally
FreeAndNil(oBmpPart);
end;
finally
pRender := nil;
end;
end;
LockWindowUpdate(0);
end;
Andere Tipps
Sie können QuellbitMap.canvas.copyreect verwenden
Haben Sie versucht, sourceDrawRect
auf ein Rechteck mit negativem oberen und linken und einem rechten und unteren Rand nach der Breite und Höhe der Bitmap festzulegen, auf die das Ansichtsobjekt zeichnen soll, damit der gewünschte Bereich auf diese Bitmap fällt?