Масштабирование значка, используемого развернутым дочерним элементом MDI в MenuStrip родительской формы - PullRequest
0 голосов
/ 25 мая 2011

В приложении MDI, когда дочерняя форма MDI развернута, значок формы используется в качестве значка контекстного меню, отображаемого слева от MenuStrip родительской формы. Когда я устанавливаю значок формы, используемой в приложении MDI, размером более 16x16 (я использую 32x32), значок рисуется немасштабированным, и меню изменяется в соответствии с размером. Обратите внимание, что если файл ICO также содержит версию значка 16x16, он работает нормально.

Следующее создает базовое приложение, которое показывает поведение:

  • создать новое решение и проект WinForms
  • изменить IsMdiContainer Form1 на true
  • добавить MenuStrip к Form1
  • создайте новую форму, назовите ее MdiChildForm
  • установить значок MdiChildForm в файл ICO 32x32, вот тот, который я подготовил ранее
  • в Form1 добавьте элемент меню, дважды щелкните его, чтобы создать обработчик событий Click, и добавьте следующее:

    var child = new MdiChildForm();
    child.MdiParent = this;
    child.Show();
    child.WindowState = FormWindowState.Maximized;
    
  • построить и запустить, нажать пункт меню

Обратите внимание, что при повторном нажатии на пункт меню значок меняется на значок по умолчанию, это описано в этом вопросе и здесь не проблема.

Я почти уверен, что это можно описать как «намеренно», но, тем не менее, это раздражает. Есть ли способ заставить значок контекстного меню уменьшаться, что-то вроде изменения размера исходного значка? Я, наверное, тоже так сделаю, но мне нужен какой-то общий код.

Ответы [ 3 ]

3 голосов
/ 25 мая 2011

Вдохновленный ответом Джереми Томпсона, я нашел возможный обходной путь.Я беру негабаритный значок, рисую его в новом растровом изображении 16x16, создаю из него новый значок и присваиваю его обратно дочерней форме.Новый значок должен быть назначен до отображения формы.

Этот код едва протестирован, и, вероятно, содержит ошибки и утечки, и я не эксперт по GDI, так что будьте осторожны, он может сломаться:

var bmp = new Bitmap(16, 16);
using (var g = Graphics.FromImage(bmp))
{
    g.DrawImage(child.Icon.ToBitmap(), new Rectangle(0, 0, 16, 16));
}
var newIcon = Icon.FromHandle(bmp.GetHicon());
child.Icon = newIcon;
// ...
child.Show();
1 голос
/ 25 мая 2011

Я пробовал разные вещи, и единственный способ заставить его работать - это использовать значок размером 16x16, в дополнение к стандартному значку 32x32 для форм:

var child = new MdiChildForm();
child.MdiParent = this;
child.Icon = new System.Drawing.Icon("scanner_magnifier_16x16.ico", new Size(16, 16));    
child.Show();
child.WindowState = FormWindowState.Maximized;
0 голосов
/ 25 марта 2016

Я столкнулся с той же проблемой. Но, похоже, это было успешно решено простым добавлением дополнительного изображения значка 16x16 в файл * .ICO.

Использовал Axialis AX-Icons. Я сделал следующее: 1) Откройте файл * .ICO, нажмите Ctrl + A, чтобы выбрать полное изображение значка, нажмите Ctrl + C (чтобы скопировать в буфер обмена) 2) Нажмите «Новый формат изображения», выберите 16x16, выберите подходящие цвета для этого * .ICO файла 3) Нажмите Ctrl + V (вставить), выберите «Изменить размер изображения, чтобы оно соответствовало области редактора» 4) Нажмите «Сохранить» 5) Повторите то же самое для каждого файла * .ICO, используемого формами MDI в моем приложении. 6) Затем открыл все формы MDI в моем приложении, щелкнул свойство «Значок» для формы и решил использовать новую версию того же файла * .ICO

Как теперь видно, все работает нормально. В меню меню используется маленькая иконка, поэтому размер главного меню больше не меняется, когда форма MDI развернута.

...