请教:如何实现这种截图? 比如有个控件WebBrowser(此控件可以打开网页),如何对截取此控件里面的图片,或者是另存某图片(不要用下载功能,因为下载后就不是之前那张图片,每次图片都不一样,就想要显示的那一张)。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 procedure ScreenShot(hWindow: HWND; bm: TBitmap);var Left, Top, Width, Height: Word; R: TRect; dc: HDC; lpPal: PLOGPALETTE;begin if not IsWindow(hWindow) then Exit; GetWindowRect(hWindow, R); Left := R.Left; Top := R.Top; Width := R.Right - R.Left; Height := R.Bottom - R.Top; bm.Width := Width; bm.Height := Height; dc := GetDc(0); if (dc = 0) then begin Exit; end; if (GetDeviceCaps(dc, RASTERCAPS) and RC_PALETTE = RC_PALETTE) then begin GetMem(lpPal, SizeOf(TLOGPALETTE) +(255 * SizeOf(TPALETTEENTRY))); FillChar(lpPal^,SizeOf(TLOGPALETTE) +(255 * SizeOf(TPALETTEENTRY)),#0); lpPal^.palVersion := $300; lpPal^.palNumEntries := GetSystemPaletteEntries(dc,0,256,lpPal^.palPalEntry); if (lpPal^.PalNumEntries <> 0) then begin bm.Palette := CreatePalette(lpPal^); end; FreeMem(lpPal, SizeOf(TLOGPALETTE) + (255 * SizeOf(TPALETTEENTRY))); end; BitBlt(bm.Canvas.Handle,0,0,Width,Height,Dc,Left,Top,SRCCOPY); ReleaseDc(0, dc);end;procedure TForm1.Button1Click(Sender: TObject);var b: TBitMap;begin b := TBitmap.Create; // 创建一个 BITMAP 来存放图象 ScreenShot(WebBrowser1.Handle, b); Image1.Picture.Bitmap := b; b.Free;end; 用procedure ScreenShot(hWindow: HWND; bm: TBitmap);可以截取指定Handle的屏只不过只能截取一屏,可能可以改进 谢谢楼上,正如楼上所说,只能一屏,这种方法不能截取有滚动条的屏幕所包含的所有范围(拖动滚动条后面的不能保存)不知道楼上大侠了解WebBrowser吗?他的滚动条能不能自动滚动到指定地方? 把网页抓图保存成JPG文件(针对单框架网页)。procedure TForm1.Button1Click(Sender: TObject);var Doc: IHTMLDocument2; ViewObject: IViewObject; sourceDrawRect: TRect; a, getjpg: TBitMap; i, m: integer; pdest, psour: hbitmap; jpg: tjpegimage;begin Doc := WebBrowser.Document as IHTMLDocument2; if Webbrowser.Document <> nil then try webbrowser.Document.QueryInterface(IViewObject, ViewObject); if ViewObject <> nil then try Doc.Get_ParentWindow.Scroll(0, 0); //跳到网页头 getjpg := TBitMap.Create(); getjpg.PixelFormat := pf24bit; getjpg.Height := doc.Body.getAttribute('scrollHeight', 0); getjpg.Width := doc.Body.getAttribute('scrollwidth', 0); pdest := getjpg.Canvas.Handle; m := Trunc(doc.Body.getAttribute('ScrollHeight', 0) / (doc.Body.getAttribute('offsetHeight', 0) - 20)); i := Trunc(doc.Body.getAttribute('Scrollwidth', 0) / (doc.Body.getAttribute('offsetwidth', 0) - 20)); for i := 0 to i do begin for m := 0 to m + 1 do begin a := TBitMap.Create(); a.Height := doc.Body.getAttribute('offsetHeight', 0); a.Width := doc.Body.getAttribute('offsetwidth', 0); psour := a.Canvas.handle; sourceDrawRect := Rect(0, 0, a.Width, a.Height); ViewObject.Draw(DVASPECT_CONTENT, 1, nil, nil, Self.Handle, a.Canvas.Handle, @sourceDrawRect, nil, nil, 0); bitblt(pdest, doc.Body.getAttribute('scrollLeft', 0), doc.Body.getAttribute('Scrolltop', 0), a.Width, a.Height, psour, 2, 2, srccopy); Doc.Get_ParentWindow.Scroll(doc.Body.getAttribute('scrollLeft', 0), doc.Body.getAttribute('offsetHeight', 0) + doc.Body.getAttribute('Scrolltop', 0) - GetSystemMetrics(SM_CXVSCROLL) - 24); a.Free; end; Doc.Get_ParentWindow.Scroll(doc.Body.getAttribute('offsetwidth', 0) + doc.Body.getAttribute('scrollLeft', 0) - GetSystemMetrics(SM_CXVSCROLL) - 24, 0); end; jpg := tjpegimage.Create; jpg.Assign(getjpg); getjpg.Free; jpg.SaveToFile('c:\test.jpg'); jpg.Free; finally ViewObject._Release; end; except end;end;http://2ccc.com/article.asp?articleid=1423看看就知道了,要不就不理什么控件直接控制滚动条的滚动截图就行了,不过某些控件比较难 嗯,http://2ccc.com/article.asp?articleid=1423这个demo很好用,呵呵 对于高人小菜一碟~~请教高人救命!!!!! 在代码中如何捕捉存储过程中定义的错误? 第三帖 把树型结构存储到文件 怎样设置Image的Canvas的大小? 如何在mousedown里面记录起始点 数据库应用怎么样才能用OOP思想? 如何利用Delphi存取任何格式的图片文件 到SQLSERVER数据库中 端口连接? 在做WORD处理时,如何才能用".EDITGOTO"语句?请给出详细的代码。 如何改变程序的图标? DBImage的动态显示问题
var
Left, Top, Width, Height: Word;
R: TRect;
dc: HDC;
lpPal: PLOGPALETTE;
begin
if not IsWindow(hWindow) then Exit;
GetWindowRect(hWindow, R);
Left := R.Left;
Top := R.Top;
Width := R.Right - R.Left;
Height := R.Bottom - R.Top;
bm.Width := Width;
bm.Height := Height;
dc := GetDc(0);
if (dc = 0) then begin
Exit;
end;
if (GetDeviceCaps(dc, RASTERCAPS) and
RC_PALETTE = RC_PALETTE) then begin
GetMem(lpPal, SizeOf(TLOGPALETTE) +(255 * SizeOf(TPALETTEENTRY)));
FillChar(lpPal^,SizeOf(TLOGPALETTE) +(255 * SizeOf(TPALETTEENTRY)),#0);
lpPal^.palVersion := $300;
lpPal^.palNumEntries := GetSystemPaletteEntries(dc,0,256,lpPal^.palPalEntry);
if (lpPal^.PalNumEntries <> 0) then begin
bm.Palette := CreatePalette(lpPal^);
end;
FreeMem(lpPal, SizeOf(TLOGPALETTE) + (255 * SizeOf(TPALETTEENTRY)));
end;
BitBlt(bm.Canvas.Handle,0,0,Width,Height,Dc,Left,Top,SRCCOPY);
ReleaseDc(0, dc);
end;procedure TForm1.Button1Click(Sender: TObject);
var
b: TBitMap;
begin
b := TBitmap.Create; // 创建一个 BITMAP 来存放图象
ScreenShot(WebBrowser1.Handle, b);
Image1.Picture.Bitmap := b;
b.Free;
end;
不知道楼上大侠了解WebBrowser吗?他的滚动条能不能自动滚动到指定地方?
var
Doc: IHTMLDocument2;
ViewObject: IViewObject;
sourceDrawRect: TRect;
a, getjpg: TBitMap;
i, m: integer;
pdest, psour: hbitmap;
jpg: tjpegimage;
begin
Doc := WebBrowser.Document as IHTMLDocument2;
if Webbrowser.Document <> nil then
try
webbrowser.Document.QueryInterface(IViewObject, ViewObject);
if ViewObject <> nil then
try
Doc.Get_ParentWindow.Scroll(0, 0); //跳到网页头
getjpg := TBitMap.Create();
getjpg.PixelFormat := pf24bit;
getjpg.Height := doc.Body.getAttribute('scrollHeight', 0);
getjpg.Width := doc.Body.getAttribute('scrollwidth', 0);
pdest := getjpg.Canvas.Handle;
m := Trunc(doc.Body.getAttribute('ScrollHeight', 0) / (doc.Body.getAttribute('offsetHeight', 0) - 20));
i := Trunc(doc.Body.getAttribute('Scrollwidth', 0) / (doc.Body.getAttribute('offsetwidth', 0) - 20));
for i := 0 to i do
begin
for m := 0 to m + 1 do
begin
a := TBitMap.Create();
a.Height := doc.Body.getAttribute('offsetHeight', 0);
a.Width := doc.Body.getAttribute('offsetwidth', 0);
psour := a.Canvas.handle;
sourceDrawRect := Rect(0, 0, a.Width, a.Height);
ViewObject.Draw(DVASPECT_CONTENT, 1, nil, nil, Self.Handle, a.Canvas.Handle, @sourceDrawRect, nil, nil, 0);
bitblt(pdest, doc.Body.getAttribute('scrollLeft', 0), doc.Body.getAttribute('Scrolltop', 0), a.Width, a.Height, psour, 2, 2, srccopy);
Doc.Get_ParentWindow.Scroll(doc.Body.getAttribute('scrollLeft', 0), doc.Body.getAttribute('offsetHeight', 0) + doc.Body.getAttribute('Scrolltop', 0) - GetSystemMetrics(SM_CXVSCROLL) - 24);
a.Free;
end;
Doc.Get_ParentWindow.Scroll(doc.Body.getAttribute('offsetwidth', 0) + doc.Body.getAttribute('scrollLeft', 0) - GetSystemMetrics(SM_CXVSCROLL) - 24, 0);
end;
jpg := tjpegimage.Create;
jpg.Assign(getjpg);
getjpg.Free;
jpg.SaveToFile('c:\test.jpg');
jpg.Free;
finally
ViewObject._Release;
end;
except
end;
end;http://2ccc.com/article.asp?articleid=1423
看看就知道了,要不就不理什么控件直接控制滚动条的滚动截图就行了,不过某些控件比较难