Радио элемент в TMainMenu использует не точки, а галочки - PullRequest
2 голосов
/ 09 мая 2019

Использование стандартного VCL. Если пункт меню в TMainMenu имеет RadioItem и назначен GroupItem, обычно для указания свойства Checked используется точка - один из радиоэлементов проверяется, и это обозначается как точка . RadioItem свойство переключается с галочки на точки. Вот как я хочу, чтобы он вел себя.

Standard menu with dot as radio indicator

Однако, если я назначу TImageList для TMainMenu, точка вместо этого станет галочкой , даже если свойство RadioItem установлено в true.

Checkmark if TImageList is used

Это похоже на ошибку в Delphi / C ++ Builder, но, возможно, я кое-что пропустил. До тех пор, пока список изображений не назначен меню, вместо этого галочки отображаются точками.

Есть ли способ назначить список изображений главному меню, но при этом радиоэлементы ведут себя как радиоэлементы (с точкой вместо галочки)?

Кроме того, если это ошибка, исправлена ​​ли она в последующих версиях Delphi / C ++ Builder (я использую RAD Studio 2010)?

Я не ищу обходных путей, таких как «назначить свое собственное точечное изображение» или «использовать сторонний компонент главного меню». Только стандартные компоненты VCL. Причина в том, что сторонние компоненты обычно не заботятся о доступности (поддержка программ чтения с экрана), и мне нужна поддержка для этого.

Не имеет отношения к вопросу, когда используется HighDPI, флажок растягивается из меньшего изображения с неровными линиями, указывая, что это увеличенное растровое изображение. Тем не менее, точка остается гладкой. Так что явно какая-то разница в рисовании там.

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
}

1 Ответ

1 голос
/ 16 мая 2019

Поскольку никто не отвечает, я отвечаю на свой вопрос.Если у кого-то есть лучший ответ, не стесняйтесь добавлять, и я с радостью отмечу его как ответ.

В основном я решил проблему, не назначая TImageList главному меню, что позволяет избежать проблемы и рисует радиопредметы с кружком.Если позже потребуется добавить изображения, мне придется искать другие решения, но пока это работает.

...