如何在 Delphi 2007 中使用 Winapi.Dwmapi.DwmSetWindowAttribute API 实现圆角窗口角

问题描述 投票:0回答:1

我发现了这个优秀的 Delphi XE 源代码,可以使窗体窗口变圆。 如何转换此代码以与 Delphi 2007 及更早版本一起使用?它无法正确编译。

我的可执行文件还需要与 Windows 7 和 8 保持兼容,我是否需要动态调用此 DLL 以避免 Win7 出现问题?

unit delphi_rounded_corners;

interface
uses
  Winapi.Windows;

type TRoundedWindowCornerType = (RoundedCornerDefault, RoundedCornerOff, RoundedCornerOn, RoundedCornerSmall);

////////////////////////////////////////////////////////////////////////////
//
// Originally written by Ian Barker
//            https://github.com/checkdigits
//            https://about.me/IanBarker
//            [email protected]
//
// Based on an example in an answer during the RAD Studio 11 Launch Q & A
//
//
// Free software - use for any purpose including commercial use.
//
////////////////////////////////////////////////////////////////////////////
//
// Set or prevent Windows 11 from rounding the corners or your application
//
// Usage:
//         SetRoundedCorners(Self.Handle, RoundedCornerSmall);
//
////////////////////////////////////////////////////////////////////////////
///
procedure SetRoundedCorners(const TheHandle: HWND; const CornerType: TRoundedWindowCornerType);


implementation
uses
  Winapi.Dwmapi;

const

  //
  // More information:
  //      https://docs.microsoft.com/en-us/windows/apps/desktop/modernize/apply-rounded-corners
  //      https://docs.microsoft.com/en-us/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute
  //      https://docs.microsoft.com/en-us/windows/win32/api/dwmapi/nf-dwmapi-dwmsetwindowattribute
  //

  DWMWCP_DEFAULT    = 0; // Let the system decide whether or not to round window corners
  DWMWCP_DONOTROUND = 1; // Never round window corners
  DWMWCP_ROUND      = 2; // Round the corners if appropriate
  DWMWCP_ROUNDSMALL = 3; // Round the corners if appropriate, with a small radius

  DWMWA_WINDOW_CORNER_PREFERENCE = 33; // [set] WINDOW_CORNER_PREFERENCE, Controls the policy that rounds top-level window corners

procedure SetRoundedCorners(const TheHandle: HWND; const CornerType: TRoundedWindowCornerType);
var
  DWM_WINDOW_CORNER_PREFERENCE: Cardinal;
begin
  case CornerType of
    RoundedCornerOff:     DWM_WINDOW_CORNER_PREFERENCE := DWMWCP_DONOTROUND;
    RoundedCornerOn:      DWM_WINDOW_CORNER_PREFERENCE := DWMWCP_ROUND;
    RoundedCornerSmall:   DWM_WINDOW_CORNER_PREFERENCE := DWMWCP_ROUNDSMALL;
  else
    DWM_WINDOW_CORNER_PREFERENCE := DWMWCP_DEFAULT;
  end;
  Winapi.Dwmapi.DwmSetWindowAttribute(TheHandle, DWMWA_WINDOW_CORNER_PREFERENCE, @DWM_WINDOW_CORNER_PREFERENCE, sizeof(DWM_WINDOW_CORNER_PREFERENCE));
 end;
end.
delphi delphi-2007
1个回答
0
投票

如何转换此代码以适用于 Delphi 2007 及更早版本?它无法正确编译。

XE2 中引入了

单元范围名称。只需删除

Winapi.
前缀即可。 Delphi 2007 中确实存在
DwmApi
单元。

我的可执行文件还需要与 Windows 7 和 8 保持兼容,我是否需要动态调用此 DLL 以避免 Win7 出现问题?

是的。 幸运的是,

DwmApi
单元已经在内部为您处理了这个问题。
DwmApi.DwmSetWindowAttribute()
函数在运行时动态加载API
DwmSetWindowAttribute
函数,如果不可用,将返回
E_NOTIMPL

© www.soinside.com 2019 - 2024. All rights reserved.