ToolStripMenuItem не может отображать галочку и изображение (значок), когда RenderMode имеет значение «Система»? - PullRequest
1 голос
/ 01 апреля 2009

В приложении Windows Forms есть MenuStrip, а некоторые пункты меню (ToolStripMenuItem) имеют значок (настройка свойства ToolStripMenuItem.Image).

Если для свойства RenderMode MenuStrip установлено значение ToolStripRenderMode.System, флажок не отображается, если для свойства Checked или CheckOnClick установлено значение true, а элемент меню имеет значок.

Отображается при переключении свойства MenuStrip.RenderMode на ToolStripRenderMode.Professional или ToolStripRenderMode.RenderManagerMode.

К сожалению, это проблема, потому что мое приложение требует:

  1. A ProgressBar в режиме выделения, поэтому для его работы требуется Application.EnableVisualStyles().
  2. Приложению требуется «плоский» визуальный стиль, который я выполнил, оставив вызов на Application.EnableVisualStyles() и оставив значение по умолчанию ToolStripRenderMode.RenderManagerMode на MenuStrip. Но тогда я не могу получить свой шатер ProgressBar!
  3. Установка RenderMode на ToolStripRenderMode.System решает требования к внешнему виду, но лишает возможности проверять пункты меню с иконками.

Есть ли способ удовлетворить все мои требования? Я что-то пропустил? Спасибо за поиск.

Ответы [ 2 ]

3 голосов
/ 02 апреля 2009

Ух ты, я в тупик ТАК! Теперь я знаю, что должен работать над серьезным кодом.

В любом случае, ответ таков: реализуйте свой собственный ToolStripRenderer, создав класс, унаследованный от ToolStripSystemRenderer.

Переопределите методы, которые рисуют элементы, с помощью собственного кода. Вот то, что я искал специально, чтобы нарисовать проверенный элемент. Он проверяет, нет ли изображения для ToolStripMenuItem.

protected override void OnRenderItemCheck(ToolStripItemImageRenderEventArgs e)
{
    base.OnRenderItemCheck(e);
    if (e.Item.Selected)
    {
        Rectangle rect = new Rectangle(3, 1, 20, 20);
        Rectangle rect2 = new Rectangle(4, 2, 18, 18);
        SolidBrush b = new SolidBrush(Color.FromArgb(49, 106, 197));
        SolidBrush b2 = new SolidBrush(Color.Orange);

        e.Graphics.FillRectangle(b, rect);
        e.Graphics.FillRectangle(b2, rect2);
        e.Graphics.DrawImage(e.Image, new Point(5, 3));
    }
    else
    {
        Rectangle rect = new Rectangle(3, 1, 20, 20);
        Rectangle rect2 = new Rectangle(4, 2, 18, 18);
        SolidBrush b = new SolidBrush(Color.FromArgb(49, 106, 197));
        SolidBrush b2 = new SolidBrush(Color.Orange);

        e.Graphics.FillRectangle(b, rect);
        e.Graphics.FillRectangle(b2, rect2);
        e.Graphics.DrawImage(e.Image, new Point(5, 3));
    }
}
0 голосов
/ 21 июня 2010

Я также наткнулся на более простую альтернативу:

Вы можете просто поместить свои пункты меню в ContextMenuStrip, а затем назначить его свойству DropDown свойства DropDownButton.

Надеюсь, это поможет всем, кому не нравится переопределять метод Paint.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...