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