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
分配给主菜单来解决问题,这避免了问题并用圆圈绘制了单选项目。如果以后需要添加图像,我将不得不寻找其他解决方案,但目前可以。
使用标准 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
分配给主菜单来解决问题,这避免了问题并用圆圈绘制了单选项目。如果以后需要添加图像,我将不得不寻找其他解决方案,但目前可以。