如何在Delphi中向菜单栏添加TLabel?

5

我使用Beyond Compare(一个很棒的程序),当它在菜单栏上显示“新版本可用”的标签时,我非常印象深刻。我点击了它,出现了一个安装新版本的框,它安装了,程序重新启动了,新版本就出现了,也没有标签了。

我认为这是一个很棒的功能。标签明显地显示在菜单栏上,用户不会错过它。我已经有了更新程序,所以我只需要添加标签。那应该很容易。

这是我想要的标签位置: 我想要的标签位置
(来源:beholdgenealogy.com)

... 错误。我无法弄清楚如何在那里添加标签。菜单栏和它上面的控制区域似乎是视觉组件的禁区。我无法在那里放置一个。

但我知道它是可以做到的,因为Beyond Compare是一个Delphi程序。
有人能告诉我如何将TLabel放在我的菜单栏中,或者至少让它看起来像是在正确的位置覆盖在菜单栏上吗?
供参考,我使用的是Delphi 2009。
结论:Christopher 似乎正确地找出了 Beyond Compare 的人所做的事情。我决定实现菜单项,但不使用他的“所有者绘制”解决方案进行自定义。因此,我没有获得蓝色粗体下划线超链接外观,但也不会失去所有自动化的东西(如 Vista 样式),这是所有者绘制跳过的。

为了将菜单项向右间隔,我在“帮助”之后添加了一个标题为“ ”且已禁用的项目。

谢谢,Christopher。我一直以为它必须是标签,但你看到了更多。


1
你确定Beyond Compare使用原生菜单(TMainMenu)吗?也许它是一些第三方菜单(Toolbar2000, DevEx, ...)。 - Uli Gerhardt
Ulrich:我不知道Beyond Compare使用了什么。我只知道它是用Delphi开发的。 - lkessler
1
如果是用Delphi制作的,通过检查资源,应该很容易找到使用的组件。 - Vegar
好思考。我应该查看一些我尊重使用的Delphi程序的组件。我可能会从中获得一些想法。 - lkessler
1
如果我好奇的话,我会使用EDA/EN_DIS_ABLE(可在http://www.heise.de/software/download/enable_disable_en_dis_able/7279或http://www.delphipraxis.net/topic166020、0、asc、0.html上获得)。 :-) - Uli Gerhardt
2个回答

13

你确定它是一个标签吗?

我没有使用过这个程序,但它可能只是一个菜单项,设置为“owner draw”并绘制成类似链接的外观?

http://sirmonkeys.com/images/updatelink.png
(使用Delphi 7完成)

procedure TForm1.MYITem1DrawItem(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; Selected: Boolean);
begin
  acanvas.Font.Style := [fsUnderline,fsbold];
  acanvas.Font.color := clblue;
  acanvas.Brush.Style := bsClear;
  acanvas.TextOut(arect.left+1,arect.top+1,'Link to Update...');
end;

procedure TForm1.MYITem1MeasureItem(Sender: TObject; ACanvas: TCanvas;
  var Width, Height: Integer);
begin
  width := 100;
end;

然后要么将ImageList分配给MainMenu1.Images,要么将MainMenu1.OwnerDraw设置为true


可能是可以的。我会尝试一下。 - lkessler
现在我确定你是对的。谢谢。附言,我的加速键(字母下面的下划线)消失了。但您的示例中有它们。我该如何恢复它们。我已经将“&”作为其标题的一部分。 - lkessler
1
当您像使用键盘激活菜单一样操作时,加速器会自动出现,这意味着按下Alt键。Christopher可能按下了Alt+PrntScr来制作图像,因此加速器指示器出现了。这已经是默认的Windows行为约10年了。如果您想始终看到它们,请在操作系统控制面板中调整显示设置。 - Rob Kennedy
@lkessler:除非修复了杀死加速器的VCL错误(请参见您自己的问题https://dev59.com/Y0XRa4cB1Zd3GeqPuL63),否则无法恢复加速器。 - mghie
实际上,对于我的问题图片,我是将“新版本可用”剪切并粘贴到了我的程序图像上,这就是为什么文字背后的背景是白色的原因。 - lkessler
显示剩余3条评论

2
Beyond Compare的实现实际上是TLabel。我们使用Toolbar 2000来制作菜单和工具栏,因此直接在菜单上嵌入控件是受支持的(带有正确的背景),并且它的优点是支持右对齐的菜单项。

谢谢,Craig。所以它实际上是一个标签。你技术上给出了正确的答案(使用Toolbar 2000),但我已经将其实现为未着色的菜单项,所以我会将被接受的答案留给Christopher。不知道你在StackOverflow上也有账号。我喜欢你的Beyond Compare。我用它来比较我的版本,更新我的网站和备份。 - lkessler

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