我发现了这个优秀的 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.
XE2 中引入了如何转换此代码以适用于 Delphi 2007 及更早版本?它无法正确编译。
单元范围名称。只需删除
Winapi.
前缀即可。 Delphi 2007 中确实存在 DwmApi
单元。
我的可执行文件还需要与 Windows 7 和 8 保持兼容,我是否需要动态调用此 DLL 以避免 Win7 出现问题?
是的。 幸运的是,
DwmApi
单元已经在内部为您处理了这个问题。 DwmApi.DwmSetWindowAttribute()
函数在运行时动态加载APIDwmSetWindowAttribute
函数,如果不可用,将返回E_NOTIMPL
。