创建看起来像 TMainMenu 的 TPanel?

发布于 2025-01-14 18:05:17 字数 173 浏览 1 评论 0原文

我想创建一个看起来类似于 TMainMenu 但基于 TPanel 的组件。 Windows 7下的TMainMenu具有渐变颜色。

如何让 TPanel 达到类似的效果?不是任何渐变,而是 Windows 渐变,因此它看起来像本机组件。

我也尝试过 TMainMenu.PaintTo 但此方法不可用。

I want to create a component which looks similar to TMainMenu but is based on TPanel.
TMainMenu under Windows 7 has a gradient of colors.

How can I achieve similar effect for TPanel? Not any gradient but a Windows gradient so it looks like a native component.

I also tried TMainMenu.PaintTo but this method is not available.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

乞讨 2025-01-21 18:05:17

由于 UxTheme API(使用 UxTheme),这实际上很容易。

使用 OpenThemeData< /a> 和 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;

生成

新VCL表单中绘制元素的屏幕截图。

当然,在真实的应用程序中,你会重构 这。例如,您不会对 32 常量进行硬编码;相反,您可以根据当前 DPI 缩放确定适当的菜单栏高度,

This is actually easy thanks to the UxTheme API (uses UxTheme).

Using 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;

produces

Screenshot of the drawn element in a new VCL form.

Of course, in a real application, you would refactor this. For instance, you wouldn't hardcode the 32 constant; instead, you'd determine the appropriate menu bar height given current DPI scaling,

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文