http://www.delphipages.com/ 에서 봤던 ie의 스크롤 영영까지 포함해서 캡쳐하는 팁이 있더군요..
참고하세요..^^
참고하세요..^^
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, MSHTML, StdCtrls, ExtCtrls, OleCtrls, SHDocVw, gifimage;
const
IID_IHTMLElementRender: TGUID = '{3050F669-98B5-11CF-BB82-00AA00BDCE0B}';
type
IHTMLElementRender = interface(IUnknown)
['{3050F669-98B5-11CF-BB82-00AA00BDCE0B}']
function DrawToDC
(_hDC: HDC
): HResult; stdcall;
end;
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
sdSaveDialog: TSaveDialog;
Panel3: TPanel;
ScrollBox1: TScrollBox;
Image1: TImage;
btnSave: TButton;
Panel4: TPanel;
wb: TWebBrowser;
edtURL: TEdit;
btnGet: TButton;
procedure btnGetClick(Sender: TObject);
procedure wbDocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);
procedure FormCreate(Sender: TObject);
procedure btnSaveClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure color2gray(var image2: TBitmap; image1: TBitmap);
var
grayPal: TMaxLogPalette;
i: Integer;
begin
for i := 0 to 255 do
with grayPal.palPalEntry[i] do begin
peRed := i;
peGreen := i;
peBlue := i;
peFlags := 0;
end;
grayPal.palVersion := $0300;
grayPal.palNumEntries := 256;
Image2.PixelFormat := pf8bit;
Image2.Palette := CreatePalette(PLogPalette(@grayPal)^);
Image2.Width := Image1.Width;
Image2.Height := Image1.Height;
Image2.Canvas.Draw(0, 0, Image1);
end;
procedure bmp2gifsave(bmp: TBitmap; fName: string);
var
i: Integer;
gif: TGifimage;
begin
gif := TGifimage.Create;
try
gif.Assign(bmp);
if fileExists(fName) then
DeleteFile(fName);
gif.SaveToFile(fName);
finally
gif.Free;
end;
end;
function CreateWBSnapshot(Browser: TWebBrowser; OutputSize: TPoint): TBitmap;
var
pDoc: IHTMLDocument2;
pElement: IHTMLElement2;
pRender: IHTMLElementRender;
bmpRender: array[0..1] of TBitmap;
dwClientWidth: Integer;
dwClientHeight: Integer;
dwIndex: Integer;
dwX: Integer;
dwLastX: Integer;
bDoneX: Boolean;
dwY: Integer;
dwLastY: Integer;
bDoneY: Boolean;
const
OffsetWidth = 170;
OffsetHeight = 260;
begin
// Create resulting image
result := TBitmap.Create;
// Set size
result.Width := OutputSize.x - OffsetWidth - 70;
result.Height := OutputSize.y - OffsetHeight - 200;
// Check browser document
if Assigned(Browser.Document) and
(Browser.Document.QueryInterface(IHTMLDocument2, pDoc) = S_OK) then begin
// Lock update
LockWindowUpdate(Browser.Handle);
// Resource protection
try
// Check document body
if Assigned(pDoc.Body) and (pDoc.Body.QueryInterface(IHTMLElement2,
pElement) = S_OK) then begin
// Resource protection
try
// Get the renderer
if (pElement.QueryInterface(IID_IHTMLElementRender, pRender) =
S_OK) then begin
// Resource protection
try
// Create images to blit the parts to
for dwIndex := 0 to 1 do begin
bmpRender[dwIndex] := TBitmap.Create;
bmpRender[dwIndex].Width := pElement.scrollWidth;
bmpRender[dwIndex].Height := pElement.scrollHeight;
end;
// Get client width and height
dwClientWidth := pElement.clientWidth;
dwClientHeight := pElement.clientHeight;
// Resource protection
try
// Set starting X variables
dwX := pElement.scrollWidth;
dwLastX := (-1);
bDoneX := False;
// Loop while X not done
while not (bDoneX) do begin
// Scroll
pElement.scrollLeft := dwX;
// Get scroll
dwX := pElement.scrollLeft;
// Check for (-1)
if (dwLastX = (-1)) then
dwLastX := dwX + dwClientWidth;
// Set starting Y variables
dwY := pElement.scrollHeight;
dwLastY := (-1);
bDoneY := False;
// Loop while Y not done
while not (bDoneY) do begin
// Scroll
pElement.scrollTop := dwY;
// Get scroll
dwY := pElement.scrollTop;
// Check for (-1)
if (dwLastY = (-1)) then
dwLastY := dwY + dwClientHeight;
// Draw to bitmap handle
if (pRender.DrawToDC(bmpRender[0].Canvas.Handle) =
S_OK) then begin
// Blit the image
BitBlt(bmpRender[1].Canvas.Handle, dwX, dwY,
dwLastX - dwX, dwLastY - dwY,
bmpRender[0].Canvas.Handle, 2, 2, SRCCOPY);
end;
// Update the Y variables
bDoneY := (dwY = 0);
dwLastY := dwY;
Dec(dwY, (dwClientHeight - 4));
end;
// Update the X variables
bDoneX := (dwX = 0);
dwLastX := dwX;
Dec(dwX, (dwClientWidth - 4));
end;
// Stretch draw the image to the resulting bitmap
StretchBlt(Result.Canvas.Handle, 0 - OffsetWidth, 0 - OffsetHeight,
OutputSize.x,
OutputSize.y, bmpRender[1].Canvas.Handle, 0, 0,
bmpRender[1].Width, bmpRender[1].Height, SRCCOPY);
finally
// Free the bitmap
for dwIndex := 0 to 1 do
FreeAndNil(bmpRender[dwIndex]);
end;
finally
// Release interface
pRender := nil;
end;
end;
finally
// Release interface
pElement := nil;
end;
end;
finally
// Unlock update
LockWindowUpdate(0);
// Release interface
pDoc := nil;
end;
end;
color2gray(result, result);
bmp2gifsave(result, 'c:\test.gif');
end;
procedure TForm1.btnGetClick(Sender: TObject);
begin
Screen.Cursor := crHourGlass;
if Length(Trim(edtURL.Text)) > 0 then begin
wb.Navigate(edtURL.Text);
end
else
ShowMessage('URL can not be blank');
end;
procedure TForm1.wbDocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);
var
pDoc: IHTMLDocument2;
pElement: IHTMLElement2;
x, y: Integer;
begin
if URL <> 'about:blank' then begin
pDoc := wb.Document as IHTMLDocument2;
pElement := pDoc.body as IHTMLElement2;
y := pElement.scrollHeight;
x := pElement.scrollWidth;
Image1.Picture.Bitmap.Assign(CreateWBSnapshot(wb, Point(x, y)));
Screen.Cursor := crDefault;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
sdSaveDialog.DefaultExt := GraphicExtension(TBitmap);
sdSaveDialog.Filter := GraphicFilter(TBitmap);
wb.Navigate('about:blank');
end;
procedure TForm1.btnSaveClick(Sender: TObject);
begin
if sdSaveDialog.Execute then begin
Image1.Picture.Bitmap.SaveToFile(sdSaveDialog.FileName);
end;
end;
end.
'코드' 카테고리의 다른 글
| WebBrowser-Capture (0) | 2008.08.14 |
|---|---|
| IID_IViewObject::Draw (0) | 2008.07.21 |
| TShellWindows 인데 FindWindow로 변경했을 떄와 같이 HWND를 받을 수 있도록 찾아보자. (0) | 2008.07.18 |
| TShellWindows (0) | 2008.07.14 |
| [BCB] HtmlElements - TTreeView (0) | 2008.07.10 |