使用标准VCL。如果TMainMenu
中的菜单项具有RadioItem
并分配了GroupItem
,通常,它使用点来指示Checked
属性-其中之一选中放射性项目,并用点表示。 RadioItem
属性从选中标记切换为点。这就是我希望它表现出来的方式。
但是,如果我将TImageList
分配给TMainMenu
,即使RadioItem
属性是,点就会变成复选标记。设置为true
。
这似乎是Delphi / C ++ Builder中的错误,但是也许我错过了一些东西。只要未将图像列表分配给菜单,复选标记就会显示为点。
是否可以将图像列表分配给主菜单,但单选项目仍然具有单选项目的功能(用点而不是选中标记)?
如果是错误,还可以在随后的Delphi / C ++ Builder版本(我正在使用RAD Studio 2010)中修复吗?
我没有在寻找诸如“分配自己的点图像”或“使用第三方主菜单组件”之类的解决方法。仅标准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
}
答案 0 :(得分:1)
由于没有人在回答,所以我在回答自己的问题。如果有人有更好的答复,请随时添加,我很乐意将其标记为答复。
基本上,我通过不将TImageList
分配给主菜单解决了该问题,这避免了该问题,并用圆圈绘制了单选项目。如果以后需要添加图像,我将不得不寻找其他解决方案,但目前可以使用。