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