创建看起来像 TMainMenu 的 TPanel?
Create TPanel which looks like TMainMenu?
我想创建一个看起来类似于 TMainMenu 但基于 TPanel 的组件。
Windows 7 下的 TMainMenu 有颜色渐变。
TPanel如何实现类似的效果?不是任何渐变,而是 Windows 渐变,因此它看起来像原生组件。
我也试过TMainMenu.PaintTo但是这个方法不可用
这要归功于 UxTheme API (uses UxTheme
)。
使用 OpenThemeData
and DrawThemeBackground
,
procedure TForm1.FormPaint(Sender: TObject);
begin
var R := Rect(0, 0, ClientWidth, 32);
var h := OpenThemeData(Handle, 'MENU');
if h <> 0 then
try
DrawThemeBackground(h, Canvas.Handle, MENU_BARBACKGROUND, MB_ACTIVE, R, nil);
finally
CloseThemeData(h);
end;
end;
生产
当然,在实际应用中,你会重构它。例如,您不会硬编码 32
常量;相反,您将根据当前的 DPI 缩放比例确定合适的菜单栏高度,
我想创建一个看起来类似于 TMainMenu 但基于 TPanel 的组件。 Windows 7 下的 TMainMenu 有颜色渐变。
TPanel如何实现类似的效果?不是任何渐变,而是 Windows 渐变,因此它看起来像原生组件。
我也试过TMainMenu.PaintTo但是这个方法不可用
这要归功于 UxTheme API (uses UxTheme
)。
使用 OpenThemeData
and DrawThemeBackground
,
procedure TForm1.FormPaint(Sender: TObject);
begin
var R := Rect(0, 0, ClientWidth, 32);
var h := OpenThemeData(Handle, 'MENU');
if h <> 0 then
try
DrawThemeBackground(h, Canvas.Handle, MENU_BARBACKGROUND, MB_ACTIVE, R, nil);
finally
CloseThemeData(h);
end;
end;
生产
当然,在实际应用中,你会重构它。例如,您不会硬编码 32
常量;相反,您将根据当前的 DPI 缩放比例确定合适的菜单栏高度,