Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何生成TScrollBox全部内容的图像?_Delphi - Fatal编程技术网

Delphi 如何生成TScrollBox全部内容的图像?

Delphi 如何生成TScrollBox全部内容的图像?,delphi,Delphi,我想生成TScrollBox全部内容的图像。就像截图一样。即使所有内容不在可见屏幕区域内。每个TControl子体都有一个执行方法,您可以使用该方法使其执行时如同处理windows消息一样,因此这应该可以工作: var b:TBitmap; begin b:=Image1.Picture.Bitmap;//or b:=TBitmap.Create; b.Width:=ScrollBox1.HorzScrollBar.Range; b.Height:=ScrollBox1.Vert

我想生成TScrollBox全部内容的图像。就像截图一样。即使所有内容不在可见屏幕区域内。

每个TControl子体都有一个
执行方法,您可以使用该方法使其执行时如同处理windows消息一样,因此这应该可以工作:

var
  b:TBitmap;
begin
  b:=Image1.Picture.Bitmap;//or b:=TBitmap.Create;
  b.Width:=ScrollBox1.HorzScrollBar.Range;
  b.Height:=ScrollBox1.VertScrollBar.Range;
  SetWindowOrgEx(b.Canvas.Handle,-ScrollBox1.HorzScrollBar.Position,-ScrollBox1.VertScrollBar.Position,nil);
  ScrollBox1.Perform(WM_ERASEBKGND,b.Canvas.Handle,0);
  ScrollBox1.Perform(WM_PAINT,b.Canvas.Handle,0);

由于Windows剪辑,滚动框的不可见区域没有绘制,因此无法获得此屏幕截图。如果我快速查看
TWinControl.PaintTo
我会看到
WM_ERASEBKGND
,我将在此处添加它,但也会看到设置剪辑的代码,这将阻止绘制滚动到视图之外的子控件。您已经非常接近了,但是窗口控件没有绘制到目标。也许你需要迭代所有基于窗口控件的子控件,并根据它们的Z顺序执行这两条消息。这不正是
TWinControl.PaintControls
所做的吗?现在我尝试调用
PaintControls
,结果与你的代码相同,没有窗口控件。不仅是控件,当我尝试这段代码时,它甚至没有在客户端矩形外绘制背景。从红色位图f.i.开始进行验证。