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

时间:2019-05-09 17:58:42

标签: delphi menu c++builder menuitem c++builder-2010

使用标准VCL。如果TMainMenu中的菜单项具有RadioItem并分配了GroupItem,通常,它使用来指示Checked属性-其中之一选中放射性项目,并用表示。 RadioItem属性从选中标记切换为点。这就是我希望它表现出来的方式。

Standard menu with dot as radio indicator

但是,如果我将TImageList分配给TMainMenu,即使RadioItem属性是,就会变成复选标记。设置为true

Checkmark if TImageList is used

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

是否可以将图像列表分配给主菜单,但单选项目仍然具有单选项目的功能(用点而不是选中标记)?

如果是错误,还可以在随后的Delphi / C ++ Builder版本(我正在使用RAD Studio 2010)中修复吗?

我没有在寻找诸如“分配自己的点图像”或“使用第三方主菜单组件”之类的解决方法。仅标准VCL组件。之所以这样,是因为第三方组件通常不关心辅助功能(对屏幕阅读器的支持),而我需要对此提供支持。

与该问题无关,当使用HighDPI时,复选标记是从带有锯齿线的较小图像中拉伸绘制的,表示它是放大的位图。但是,点仍保持平滑。因此,显然在那里绘制有一些区别。

Jagged edges of the checkmark

示例代码:

#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
}

1 个答案:

答案 0 :(得分:1)

由于没有人在回答,所以我在回答自己的问题。如果有人有更好的答复,请随时添加,我很乐意将其标记为答复。

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