TMenuItem и большие иконки

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

lordgray
новенький
Сообщения: 66
Зарегистрирован: 10.10.2010 00:19:11

TMenuItem и большие иконки

Сообщение lordgray »

Здравствуйте! Проекту более 3-х лет, и все время наблюдаю такой глюк: для меню формы и PopupMenu установлен ImageList с изображениями 32*32.
Так вот, эти иконки обрезаются слева на несколько пикселей, и налазят на предыдущие пункты меню. В общем, некрасиво! Сейчас Lazarus i386 1.4.0 + FPC 2.6.4 + Win7x64(тема винды классическая, без изменений).
Подскажите, как решить, если кто знает.

На скриншоте, кнопка с выпадающим меню. Иконка на кнопке отображается нормально, в меню обрезана (как и все остальные). Специально подсветил третий пункт меню, чтоб было видно, что изображение иконки выходит за пределы пункта меню. То же самое и в главном меню. Тоже получается и для 64-битной сборки. Что делать?

P.S. Под Linux-ами нормально.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

Написать своё меню.
lordgray
новенький
Сообщения: 66
Зарегистрирован: 10.10.2010 00:19:11

Сообщение lordgray »

Спасибо, но если так решать проблемы, то жизни не хватит, все переписывая самому.
Начинаю склоняться к мысли, что проще дизайн переделать. Хотя думал, что, через WinAPI, должно легко решаться.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

lordgray писал(а): Хотя думал, что, через WinAPI, должно легко решаться.


Ошибочное мнение. Именно для этого и нужны RAD.
wavebvg
постоялец
Сообщения: 355
Зарегистрирован: 28.02.2008 03:57:35

Сообщение wavebvg »

lordgray писал(а):Спасибо, но если так решать проблемы, то жизни не хватит, все переписывая самому.

Зачем переписывать?
Есть два решения:
1. Подготовить соответствующего размера иконки и ничего не переделывать.
2. Посмотреть исходники и внести корректировки для исправления проблемы, написать репорт, предложенить своё решение.

Все пользуются первым, поэтому проблема еще не решена.
lordgray
новенький
Сообщения: 66
Зарегистрирован: 10.10.2010 00:19:11

Сообщение lordgray »

Эх, надеялся, кто-то сталкивался, подскажут. Или есть знатоки WinAPI, и тоже подскажут, что бы не искать часами...
Ладно, если совсем будет делать нечего, или капну исходники (а там тоже самое WinAPI), или сразу в доку по WinAPI погружусь. Но решу быстрее всего через первый вариант - в MainMenu стандартные иконки, а PopupMenu заменю на диалоговое окно.
kazalex
постоялец
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Сообщение kazalex »

lordgray
Проблема решается в несколько строчек.
1. В файле /lazarus/lcl/interfaces/win32/Win32WSMenus.pp находишь функцию GetVistaPopupMenuMetrics
2. Объявляешь в ней локальную переменную ImageList : TCustomImageList;
3. Первой строкой инициализируешь переменную:

Код: Выделить всё

ImageList := AMenuItem.GetImageList;

4. Находишь строчку:

Код: Выделить всё

GetThemePartSize(Theme, DC, MENU_POPUPCHECK, 0, nil, TS_TRUE, Result.CheckSize);

и заменяешь её на:

Код: Выделить всё

  If Assigned(ImageList) Then
   begin

    Result.CheckSize.cx := ImageList.Width;
    Result.CheckSize.cy := ImageList.Height;

   end
  Else
   GetThemePartSize(Theme, DC, MENU_POPUPCHECK, 0, nil, TS_TRUE, Result.CheckSize);

5. Profit
6. Делаешь патчик и постишь в трекер
lordgray
новенький
Сообщения: 66
Зарегистрирован: 10.10.2010 00:19:11

Сообщение lordgray »

kazalex писал(а):lordgray
Проблема решается в несколько строчек.


Огромное спасибо! Порылся я в связях на этот файл ..., в общем, я бы точно не нашел, где и что менять.

Реализовал так:

Код: Выделить всё

  GetThemePartSize(Theme, DC, MENU_POPUPCHECK, 0, nil, TS_TRUE, Result.CheckSize);
  ImgList := AMenuItem.GetImageList;
  if Assigned(ImgList) and (ImgList.Height > Result.CheckSize.cy) then
  begin
    if (AMenuItem.ImageIndex >= 0) then Result.CheckSize.cy := ImgList.Height;
    Result.CheckSize.cx := ImgList.Width;
  end;


В результате - где есть иконка, высокая строка, где нет, обычная.

kazalex писал(а):5. Profit
6. Делаешь патчик и постишь в трекер


Как делать патч и где его постить - понятия не имею. Где почитать?
Или кто уже занимался таким, может поможет оформить?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
kazalex
постоялец
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Сообщение kazalex »

lordgray писал(а):В результате - где есть иконка, высокая строка, где нет, обычная.

А отмеченные (Checked := True) элементы без картинок в таком варианте нормально отрисовываются?
lordgray
новенький
Сообщения: 66
Зарегистрирован: 10.10.2010 00:19:11

Сообщение lordgray »

kazalex писал(а):
lordgray писал(а):В результате - где есть иконка, высокая строка, где нет, обычная.

А отмеченные (Checked := True) элементы без картинок в таком варианте нормально отрисовываются?


Да
У вас нет необходимых прав для просмотра вложений в этом сообщении.
kazalex
постоялец
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Сообщение kazalex »

lordgray писал(а):Да

ОК. Тогда можно ещё небольшую доработку сделать. Сначала пытаться получить размер пиктограммы непосредственно от элемента (AMenuItem.GetIconSize) чтобы учитывалось наличие свойства Bitmap. И если размер картинки нулевой, тогда уже пытаться получить размер от ImageList.

Добавлено спустя 3 минуты 9 секунд:
lordgray писал(а):Как делать патч и где его постить - понятия не имею. Где почитать?

Почитать можно тут.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

А может, попробовать использовать пустую иконку?
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

.

DPI - нужно установить в настройках проекта. Только вчера на форуме ссылку видел.

Добавлено спустя 1 минуту 3 секунды:
вот адрес обсуждения.
http://freepascal.ru/forum/viewtopic.php?f=5&t=10432&p=87355#p87355
kazalex
постоялец
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Сообщение kazalex »

Лекс Айрин, vitaly_l
Господа, вы о чём вообще?
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

kazalex писал(а):Лекс Айрин, vitaly_l
Господа, вы о чём вообще?

Вы очевидно не знаете что такое DPI и как это влияет на отображаемое на экране?
Размер иконок - тоже зависит от установок DPI, соответственно установив DPI - проблема размера иконок может решиться без патчей и т.п.
У меня например решилась проблема с размерами (правда там иконок не было).
DPI - устанавливается в настройках проекта.
Ответить