4

我的应用程序会自动截取几个动态创建的表单。这在 Windows XP 下运行良好,但在 Vista Aero 下运行不佳。大多数表单在屏幕截图中显示为半透明。问题出在 Aero 的窗口动画上。

如何从 Delphi (2007+) 程序中检查/禁用/启用此动画?

或者作为替代方案:如何在制作屏幕截图之前确保表单正确显示?

4

4 回答 4

2

Shoban 评论中的链接将我引向了正确的方向。快速检查显示了 VCL 中 DwmApi 的包装器,然后它就直接前进了。这是我现在成功使用的代码:

uses DwmApi;
...
  SaveDwmCompositionEnabled := DwmCompositionEnabled;
  if SaveDwmCompositionEnabled then
    DwmEnableComposition(DWM_EC_DISABLECOMPOSITION);
...
  if SaveDwmCompositionEnabled then
    DwmEnableComposition(DWM_EC_ENABLECOMPOSITION);
于 2009-07-18T10:51:25.803 回答
1

禁用 Aero 将是一个遗憾 - 通常,更改用户对 UI 样式的选择不是一个好主意。

您也许可以用另一种方式绘制表格。想到的一件事是使用PaintTo方法将其绘制到画布上。(事实上​​,如果您将表单的屏幕截图作为获得外观的一种方式,您可能根本不需要显示表单 - 创建它们时将 Visible 设置为 false 并将它们绘制为位图。仅如果用户需要与他们交互,请向他们展示。)

于 2009-07-17T00:16:27.067 回答
1

我试图解决同样的问题并找到了这个问题,但想出了一个完全不同的解决方案。它不会禁用动画,但它允许您使窗口消失而没有动画效果。

var oldWidth := Self.Width;
var oldHeight := Self.Height;
try
    if Visible and (Self.WindowState <> wsMinimized) then
    begin
        Self.BorderStyle := bsNone; // do this first
        Self.Width := 0;
        Self.Height := 0;
    end;

    //.. Do your screen capture here

finally
    if Visible and (Self.WindowState <> wsMinimized) then
    begin
        Self.BorderStyle := bsSizeable; // or whatever it was
        Width := oldWidth;
        Height := oldHeight;
    end;
end;

您也可以将窗口移动到-maxintX 和 Y,但我更喜欢这个。

于 2020-11-13T05:04:58.660 回答
0

您可以向 exe 文件添加清单资源,以通知 Vista 您希望应用程序在没有 Aero 的情况下运行 http://www.google.be/search?q=vista+manifest+resource+delphi

于 2009-07-16T21:17:53.827 回答