gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:39:55 25 4
gpt4 key购买 nike

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

Standard menu with dot as radio indicator

但是,如果我分配 TImageListTMainMenu , 变成 复选标记 相反,即使 RadioItem属性设置为 true .

Checkmark if TImageList is used

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

有没有办法将图像列表分配给主菜单,但仍然有单选项目的行为类似于单选项目(有点,而不是复选标记)?

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

我不是在寻找诸如“分配您自己的点图像”或“使用第三方主菜单组件”之类的解决方法。只有标准的 VCL 组件。原因是第三方组件通常不关心可访问性(对屏幕阅读器的支持),我需要对此提供支持。

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

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
}

最佳答案

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

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

关于delphi - TMainMenu 中的单选项目不使用点,而是使用复选标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56065112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com