Использование стандартного 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
}