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

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

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

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

Сообщение lordgray » 29.07.2015 18:46:08

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

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

P.S. Под Linux-ами нормально.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
lordgray
новенький
 
Сообщения: 66
Зарегистрирован: 10.10.2010 00:19:11

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

Сообщение sign » 30.07.2015 04:34:54

Написать своё меню.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

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

Сообщение lordgray » 30.07.2015 07:27:20

Спасибо, но если так решать проблемы, то жизни не хватит, все переписывая самому.
Начинаю склоняться к мысли, что проще дизайн переделать. Хотя думал, что, через WinAPI, должно легко решаться.
lordgray
новенький
 
Сообщения: 66
Зарегистрирован: 10.10.2010 00:19:11

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

Сообщение Лекс Айрин » 30.07.2015 09:29:20

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


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

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

Сообщение wavebvg » 30.07.2015 12:51:55

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

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

Все пользуются первым, поэтому проблема еще не решена.
wavebvg
постоялец
 
Сообщения: 355
Зарегистрирован: 28.02.2008 04:57:35

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

Сообщение lordgray » 30.07.2015 13:11:53

Эх, надеялся, кто-то сталкивался, подскажут. Или есть знатоки WinAPI, и тоже подскажут, что бы не искать часами...
Ладно, если совсем будет делать нечего, или капну исходники (а там тоже самое WinAPI), или сразу в доку по WinAPI погружусь. Но решу быстрее всего через первый вариант - в MainMenu стандартные иконки, а PopupMenu заменю на диалоговое окно.
lordgray
новенький
 
Сообщения: 66
Зарегистрирован: 10.10.2010 00:19:11

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

Сообщение kazalex » 30.07.2015 15:02:09

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. Делаешь патчик и постишь в трекер
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

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

Сообщение lordgray » 30.07.2015 20:08:04

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. Делаешь патчик и постишь в трекер


Как делать патч и где его постить - понятия не имею. Где почитать?
Или кто уже занимался таким, может поможет оформить?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
lordgray
новенький
 
Сообщения: 66
Зарегистрирован: 10.10.2010 00:19:11

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

Сообщение kazalex » 30.07.2015 20:23:11

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

А отмеченные (Checked := True) элементы без картинок в таком варианте нормально отрисовываются?
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

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

Сообщение lordgray » 30.07.2015 20:53:26

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

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


Да
У вас нет необходимых прав для просмотра вложений в этом сообщении.
lordgray
новенький
 
Сообщения: 66
Зарегистрирован: 10.10.2010 00:19:11

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

Сообщение kazalex » 30.07.2015 21:41:35

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

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

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

Почитать можно тут.
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

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

Сообщение Лекс Айрин » 31.07.2015 10:02:57

А может, попробовать использовать пустую иконку?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение vitaly_l » 31.07.2015 14:51:38

.

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

Добавлено спустя 1 минуту 3 секунды:
вот адрес обсуждения.
http://freepascal.ru/forum/viewtopic.php?f=5&t=10432&p=87355#p87355
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение kazalex » 31.07.2015 15:03:58

Лекс Айрин, vitaly_l
Господа, вы о чём вообще?
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

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

Сообщение vitaly_l » 31.07.2015 15:13:52

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

Вы очевидно не знаете что такое DPI и как это влияет на отображаемое на экране?
Размер иконок - тоже зависит от установок DPI, соответственно установив DPI - проблема размера иконок может решиться без патчей и т.п.
У меня например решилась проблема с размерами (правда там иконок не было).
DPI - устанавливается в настройках проекта.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 226

Рейтинг@Mail.ru