如何将表单作为图像复制到剪贴板

Mar*_*der 10 delphi delphi-2007

我需要将一个表单(Delphi 2007)作为图像复制到剪贴板,以将用户可以看到的内容粘贴到word文档中.剪贴板部分确实不是问题.问题是如何获取表单的位图.

搜索已经出现了多种选择.

所有这些选项似乎都有不同的问题.我发现的大部分信息似乎都已过时.我似乎没有任何好的资源来比较不同的选项和足够的细节供我做出选择.关于选择哪种选择的任何建议.

我已经在我的表格上尝试了这些并且它们似乎都运行正常,我只是想避免出现问题.有关解决方案的建议吗?

更新:GetFormImage有哪些潜在问题?
Andreas问GetFormImage的问题是什么.希望什么都没有,这是我想要得到答案的一部分.让我担心的是,我的许多搜索结果似乎都在暗示使用GetFormImage的创造性替代方案.我希望答案可以清除水域.

我会很高兴得到很多投票的回答说 - GetFormImage曾经有过一些问题,但现在没有理由不使用它.:-)

至于GetFormImage的实际问题.对于某些用户来说,一个问题是只有表单的可见部分才会出现在图像中(即,您无法捕获隐藏或重叠的窗口).这对我来说不是一个问题,因为我的整个表格都是可见的.

1)更大的问题涉及表单控件所需的特定支持.在德尔福4修正和已知问题页面列表中有该条目(注意它被列为"递延到下").我找不到显示已解决的QC条目:

区域:vcl\core vcl类

参考编号:1088(已发布:12/16/98)
状态:延迟到下一个
Rel日期报告:8/6/98严重性:常见类型:基本
功能故障问题:

问题是GetFormImage大多数嵌套窗口控件如组合框等都被绘制为空白.

2)我也在使用DevExpress控件.他们的控件(在2006年底修复)曾一度不支持 GetFormImage正在使用的PaintTo消息.这在我正在使用的DevExpress版本中修复,但它引发了我的其他问题,我使用的其他控件可能无法正常工作的可能性是多少?

3)这是Embarcadero集团最近的一篇(2010年)帖子.用户在使用GetFormImage时遇到问题,他们在屏幕上显示的部分图表没有出现在最终图像中.他们还需要包含表单标题(我没有),他们采用了本文中概述的Canvas.CopyRect方法.

4)这是TExcellentImagePrinter页面的引用.如果需要,我可以毫无问题地购买他们的产品.该组件看起来像它最近在2002年更新(虽然有一个Delphi 2007试用版).我不知道我是否真的需要走这个方向.

您可以尝试使用GetFormImage或Form.Print.尝试在表单上放下ComboBox,然后调用GetFormImage或Form.Print.如果你打印出来,你会看到ComboBox中的文字吗?没有?别人也没有!这只是打印VCL表单时遇到的问题的一个小例子.

您也可以尝试使用Borland的TI-3155"打印表格的更好方法".当我在Borland工作时,我写了TI作为一个停止间隙测量.虽然它会打印组合框文本,但它会在许多打印机上失败,如果用户调整了表单大小,则无法打印整个表单,并且无法打印隐藏在视图中或部分位于屏幕外的表单.代码基本上生成了一个截图,为了可靠地打印图像,您可能需要查看我们的TExcellentImagePrinter产品!为什么?简而言之,它可能需要几千行低级图形代码才能获得在Windows下打印好的位图.

And*_*and 10

我不知道问题是什么GetFormImage,但你没有尝试过的选项(至少没有明确)是

procedure TForm1.FormClick(Sender: TObject);
var
  bm: TBitmap;
begin

  bm := TBitmap.Create;
  try
    bm.SetSize(ClientWidth, ClientHeight);
    BitBlt(bm.Canvas.Handle, 0, 0, ClientWidth, ClientHeight, Canvas.Handle, 0, 0, SRCCOPY);
    Clipboard.Assign(bm);
  finally
    bm.Free;
  end;

end;
Run Code Online (Sandbox Code Playgroud)

在几乎所有情况下,我都希望这会产生与之相同的结果

bm := GetFormImage;
try
  Clipboard.Assign(bm);
finally
  bm.Free;
end;
Run Code Online (Sandbox Code Playgroud)

虽然.(此外,该Canvas.CopyRect程序使用的StretchBlt是我期望产生与BitBlt未应用拉伸时相同的结果.)

方法2

您始终可以使用"打印屏幕":

procedure TForm1.FormClick(Sender: TObject);
begin
  keybd_event(VK_SNAPSHOT, 1, 0, 0);
end;
Run Code Online (Sandbox Code Playgroud)

这也将捕获边框和标题栏.如果您只想获取客户区,可以裁剪图像:

procedure TForm1.FormClick(Sender: TObject);
var
  bm, bm2: TBitmap;
  DX, DY: integer;
begin
  Clipboard.Clear;
  keybd_event(VK_SNAPSHOT, 1, 0, 0);
  repeat
    Application.ProcessMessages;
  until Clipboard.HasFormat(CF_BITMAP);
  bm := TBitmap.Create;
  try
    bm.Assign(Clipboard);
    bm2 := TBitmap.Create;
    try
      bm2.SetSize(ClientWidth, ClientHeight);
      DX := (Width - ClientWidth) div 2;
      DY := GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYSIZEFRAME );
      BitBlt(bm2.Canvas.Handle, 0, 0, ClientWidth, ClientHeight, bm.Canvas.Handle, DX, DY, SRCCOPY);
      Clipboard.Assign(bm2);
    finally
      bm2.Free;
    end;
  finally
    bm.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

  • 你应该选择最适合你的方法*.如果*你*在项目中没有遇到任何"GetFormImage"问题,那么一定要使用它! (2认同)