TMainMenu 中的单选项目不使用点而是复选标记

Radio item in TMainMenu not using dots but checkmarks

使用标准 VCL。如果 TMainMenu 中的菜单项有 RadioItem 并且分配了 GroupItem,通常,它使用 来指示 Checked 属性 - 检查了其中一个单选项目,并用 表示。 RadioItem 属性 从复选标记切换到点。这就是我希望它的行为方式。

但是,如果我将 TImageList 分配给 TMainMenu 变成了 复选标记 而不是虽然 RadioItem 属性 设置为 true.

这似乎是 Delphi/C++ Builder 中的一个错误,但也许我遗漏了什么。只要图像列表未分配给菜单,复选标记就会显示为点。

有没有一种方法可以将图像列表分配给主菜单,但仍然让单选项目表现得像单选项目(有点,而不是复选标记)?

此外,如果它是一个错误,它是否在后续的 Delphi/C++ Builder 版本中修复(我使用的是 RAD Studio 2010)?

我不是在寻找 "assign your own dot image" 或 "use third party main menu component" 之类的解决方法。只有标准的 VCL 组件。原因是因为第三方组件通常不关心可访问性(支持屏幕阅读器),我需要支持。

与问题无关,当使用 HighDPI 时,复选标记是从带有锯齿线的较小图像拉伸绘制的,表明它是放大的位图。但是,该点仍然很光滑。很明显那里画的有些不同。

示例代码:

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TMainMenu *mm;
TImageList *il;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
struct
    {
    TComponent* operator()(TComponent* fOwner, const UnicodeString &fCaption, const UnicodeString &fName, bool fDefault, bool fRadioItem, int fImgIndex, int fGroupIndex, bool fChecked)
        {
        TMenuItem* mi  = new TMenuItem(fOwner);
        mi->Name       = fName;
        mi->Caption    = fCaption;
        mi->Default    = fDefault;
        mi->RadioItem  = fRadioItem;
        mi->ImageIndex = fImgIndex;
        mi->GroupIndex = fGroupIndex;
        mi->Checked    = fChecked;

        if (fOwner->InheritsFrom(__classid(TMainMenu)))
            {
            static_cast<TMainMenu*>(fOwner)->Items->Add(mi);
            }
        else if (fOwner->InheritsFrom(__classid(TMenuItem)))
            {
            static_cast<TMenuItem*>(fOwner)->Add(mi);
            }

        return mi;
        }
    } AddMenuItem;

TComponent* own;
mm = new TMainMenu(this);
il = new TImageList(this);

own = AddMenuItem(mm, "File", "mmFile", 0, 0, -1, 0, 0);
      AddMenuItem(own, "Radio 1",  "mmFileRadio1", 0, 1, -1, 1, 1);
      AddMenuItem(own, "Radio 2",  "mmFileRadio2", 0, 1, -1, 1, 0);

//mm->Images = il;      // Comment this line = dot, uncomment this line = checkmark
}

既然没人回答,那我就自己回答吧。如果谁有更好的回复,欢迎补充,我会很乐意标记为回复。

基本上我通过不将 TImageList 分配给主菜单来解决问题,这避免了问题并用圆圈绘制了单选项目。如果以后需要添加图像,我将不得不寻找其他解决方案,但目前可以。