Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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 如何将表单作为图像复制到剪贴板_Delphi_Delphi 2007 - Fatal编程技术网

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

Delphi 如何将表单作为图像复制到剪贴板,delphi,delphi-2007,Delphi,Delphi 2007,我需要将表单(Delphi2007)作为图像复制到剪贴板,以便将用户可以看到的内容粘贴到word文档中。剪贴板部分不是一个真正的问题。问题是如何获取表单的位图 搜索出现了多个选项 召唤 使用GDI+的一部分 发送 使用复制当前窗体的画布 我还发现了一个名为的组件,它有一个声称比这些选项都好的解决方案,但我不知道它使用的是什么方法 所有这些选择似乎都有不同的问题。我发现的大部分信息似乎都过时了。我似乎找不到任何好的资料来比较不同的选择,有足够的细节让我做出选择。关于哪种选择的任何建议 我在我的

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

搜索出现了多个选项

  • 召唤
  • 使用GDI+的一部分
  • 发送
  • 使用复制当前窗体的画布
  • 我还发现了一个名为的组件,它有一个声称比这些选项都好的解决方案,但我不知道它使用的是什么方法
所有这些选择似乎都有不同的问题。我发现的大部分信息似乎都过时了。我似乎找不到任何好的资料来比较不同的选择,有足够的细节让我做出选择。关于哪种选择的任何建议

我在我的表格上试过这些,它们看起来都很好,我只是想避免以后的问题。关于如何解决问题有什么建议吗

更新:GetFormImage有哪些潜在问题?
Andreas问GetFormImage有什么问题。希望什么都没有了,这是我试图得到答案的一部分。让我担心的是,我的许多搜索结果似乎都在建议使用GetFormImage的创造性替代方案。我希望答案能让事情变得明朗一点

我真的很高兴有一个得到很多赞成票的答案,它说-GetFormImage过去有一些问题,但现在没有理由不使用它。:-)

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

1) 更大的问题涉及表单控件所需的特定支持。列表中有这个条目(注意,它被列为“推迟到下一个”)。我找不到显示此问题已解决的QC条目:

区域:vcl \核心vcl类

参考号:1088(发布日期:1998年12月16日)
状态:推迟到下一个
报告日期:1998年8月6日严重程度: 常见类型:基本
功能故障问题:

问题在于GetFormImage的大多数嵌套窗口控件(如组合框等)都是空白的

2) 我也在使用DevExpress控件。曾经有一段时间,他们的控件(在2006年底修复)显示GetFormImage正在使用的消息。这在我使用的DevExpress版本中已修复,但它会引发其他问题,我使用的其他控件可能无法正常工作的可能性有多大

3) 这是一个最近的(2010年)。用户在使用GetFormImage时遇到问题,他们在屏幕上显示的部分图形没有出现在最终图像中。他们还需要包含表单标题(我没有),并采用Canvas.CopyRect方法

4) 这是来自TExcellentImagePrinter页面的引用。如果需要的话,我会毫不犹豫地购买他们的产品。该组件看起来像是在2002年更新的(不过有一个Delphi2007试用版)。我不知道我是否真的需要去那个方向

您可以尝试使用GetFormImage或 表格。打印。试着放下一个组合框 下载表单,然后调用GetFormImage 或Form.Print。如果你得到一个 打印输出,你看到文本了吗 组合框?不任何人也没有 其他的这只是一个小例子 您在使用时将遇到的问题 打印VCL表格

你也可以尝试使用Borland的 TI-3155“一种更好的打印图像的方法 形式”。我在一家公司工作时写了TI 博尔兰作为权宜之计。虽然 它将打印组合框文本 在许多打印机上都会失败,这是不可能的 如果您的用户已完成,请打印整个表单 已调整窗体大小,但无法打印 隐藏在视图中或不可见的窗体 部分位于屏幕外。这个 代码基本上生成一个屏幕截图, 要可靠地打印图像,您需要 可能想看看 我们的TExcellentImagePrinter产品! 为什么?简单地说,它可能需要一个 几千行低电平 获取要打印的位图的图形代码 在窗户下面


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

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

bm := GetFormImage;
try
  Clipboard.Assign(bm);
finally
  bm.Free;
end;
不过。(另外,
Canvas.CopyRect
过程使用
StretchBlt
,当不应用拉伸时,我希望它产生与
BitBlt
相同的结果。)

方法2 您可以始终使用打印屏幕:

procedure TForm1.FormClick(Sender: TObject);
begin
  keybd_event(VK_SNAPSHOT, 1, 0, 0);
end;
这还将捕获边框和标题栏。如果您只希望获得客户区,可以裁剪图像:

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;

GetFormImage到底有什么问题?我更新了问题,以包含更多关于我对GetFormImage关注的细节。我目前正在解决GetFormImage、Canvas.CopyRect(以及任何BitBlt/StretchBlt变体)和PrintWindow的问题:它们都没有在表单上绘制实际内容。我的表单是在某些区域自定义绘制的,很多时候会有另一个窗口悬停在它上面,所以我的捕获中也包含了这个窗口。如果我能找到解决办法,我会发布一个答案。但请注意,在某些情况下,当您的目标窗体被另一个窗口隐藏、脱离屏幕或遮挡时,上述解决方案都无法正常工作。请更新我的评论:WM_PRINT/WM_PRINTCLIENT/WM_PAINT以hdc作为wparam,在XE5中根本不起作用。他们都给了我一个白色的屏幕。我试图在丰源上实现这些东西,除非我在某个地方犯了错误,否则这也不起作用(给我一个空表单。我用一个空表单进行了测试,只是在上面画图。我确实在表单上掉了一个按钮,结果是d
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;