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

War es hilfreich?

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?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top