Delphi 7应用程序中Aero Glass的问题

3

我正在尝试重制一些旧项目以支持Aero Glass。虽然启用玻璃边框有点容易,但我遇到了一些主要问题。我使用了这段代码:

var
  xVer: TOSVersionInfo;
  hDWM: THandle;
  DwmIsCompositionEnabled: function(pbEnabled: BOOL): HRESULT; stdcall;
  DwmExtendFrameIntoClientArea: function(hWnd: HWND; const pxMarInset: PRect): HRESULT; stdcall;
  bEnabled: BOOL;
  xFrame: TRect;

// ...

  xVer.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
  GetVersionEx(xVer);
  if xVer.dwMajorVersion >= 6 then
  begin
    hDWM := LoadLibrary('dwmapi.dll');
    @DwmIsCompositionEnabled := GetProcAddress(hDWM, 'DwmIsCompositionEnabled');
    @DwmExtendFrameIntoClientArea := GetProcAddress(hDWM, 'DwmExtendFrameIntoClientArea');
    if (@DwmIsCompositionEnabled <> nil) and
       (@DwmExtendFrameIntoClientArea <> nil) then
    begin
      DwmIsCompositionEnabled(@bEnabled);
      if bEnabled then
      begin
        xRect := Rect(-1, -1, -1, -1);
        DwmExtendFrameIntoClientArea(FrmMain.Handle, @xRect);
      end;
    end;
    FreeLibrary(hDWM);
  end;

现在我有一个漂亮的玻璃窗户。由于黑色现在是透明颜色(有点愚蠢的选择,为什么不能是粉色),任何clBlack的东西都变成了透明的。这意味着所有标签、编辑框、按钮文本……即使我在设计时将文本设置为其他颜色,DWM仍然会使它们成为透明的。

那么我的问题是 - 是否有可能解决这个问题?

1个回答

3
Delphi 7及其之前的版本在Windows Vista及更新版本中也存在其他问题。Delphi 2007是为Vista认证的第一个版本。我的建议是升级到Delphi 2010。我认为修补Delphi 7的工作量太大,收效甚微。好吧,也许您需要将应用程序转换为Unicode(这个过程比听起来要简单得多,特别是如果您使用Embarcadero的论坛和/或这个网站),但这值得努力。这不仅适用于Vista兼容性,还适用于所有内置于Delphi新版本中的好处,特别是Delphi 2010。希望对您有所帮助。

1
有时人们会说“如果它没有坏,就不要修理它”。 但也许是时候向前迈进了。我会检查一下2010的试用版。 谢谢 ;) - Cralias
然而,在Vista+上它有点出了问题。 - Gerry Coll
@Gerry:“它”有点儿坏了……是指Delphi 7还是Delphi 2007?我认为我的回答很清楚了…… - John Thomas
“ain't broke” 指的是我的应用程序在 Vista+ 上运行良好,除了它们没有那些实际上并不是必需品的华丽效果。无论如何,现在正在检查 2010。似乎直接将大多数控件放置在玻璃表面上并不是一个好主意。正在寻找解决方法... - Cralias
2
问题已解决。如果在玻璃表面上放置TLabel,我将设置它的GlowSize为非零值。对于窗体,我将设置DoubleBuffered = true。启用/禁用按钮时需要显式刷新。到目前为止都很好。现在2010年的成本相当高,但我认为这是值得的。谢谢,plainth ;) - Cralias
请参考此问题:https://dev59.com/k3A75IYBdhLWcg3wW3y8#3347626 - Warren P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接