TMenuItem и большие иконки
Модератор: Модераторы
TMenuItem и большие иконки
Здравствуйте! Проекту более 3-х лет, и все время наблюдаю такой глюк: для меню формы и PopupMenu установлен ImageList с изображениями 32*32.
Так вот, эти иконки обрезаются слева на несколько пикселей, и налазят на предыдущие пункты меню. В общем, некрасиво! Сейчас Lazarus i386 1.4.0 + FPC 2.6.4 + Win7x64(тема винды классическая, без изменений).
Подскажите, как решить, если кто знает.
На скриншоте, кнопка с выпадающим меню. Иконка на кнопке отображается нормально, в меню обрезана (как и все остальные). Специально подсветил третий пункт меню, чтоб было видно, что изображение иконки выходит за пределы пункта меню. То же самое и в главном меню. Тоже получается и для 64-битной сборки. Что делать?
P.S. Под Linux-ами нормально.
Так вот, эти иконки обрезаются слева на несколько пикселей, и налазят на предыдущие пункты меню. В общем, некрасиво! Сейчас Lazarus i386 1.4.0 + FPC 2.6.4 + Win7x64(тема винды классическая, без изменений).
Подскажите, как решить, если кто знает.
На скриншоте, кнопка с выпадающим меню. Иконка на кнопке отображается нормально, в меню обрезана (как и все остальные). Специально подсветил третий пункт меню, чтоб было видно, что изображение иконки выходит за пределы пункта меню. То же самое и в главном меню. Тоже получается и для 64-битной сборки. Что делать?
P.S. Под Linux-ами нормально.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Написать своё меню.
Спасибо, но если так решать проблемы, то жизни не хватит, все переписывая самому.
Начинаю склоняться к мысли, что проще дизайн переделать. Хотя думал, что, через WinAPI, должно легко решаться.
Начинаю склоняться к мысли, что проще дизайн переделать. Хотя думал, что, через WinAPI, должно легко решаться.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
lordgray писал(а): Хотя думал, что, через WinAPI, должно легко решаться.
Ошибочное мнение. Именно для этого и нужны RAD.
lordgray писал(а):Спасибо, но если так решать проблемы, то жизни не хватит, все переписывая самому.
Зачем переписывать?
Есть два решения:
1. Подготовить соответствующего размера иконки и ничего не переделывать.
2. Посмотреть исходники и внести корректировки для исправления проблемы, написать репорт, предложенить своё решение.
Все пользуются первым, поэтому проблема еще не решена.
Эх, надеялся, кто-то сталкивался, подскажут. Или есть знатоки WinAPI, и тоже подскажут, что бы не искать часами...
Ладно, если совсем будет делать нечего, или капну исходники (а там тоже самое WinAPI), или сразу в доку по WinAPI погружусь. Но решу быстрее всего через первый вариант - в MainMenu стандартные иконки, а PopupMenu заменю на диалоговое окно.
Ладно, если совсем будет делать нечего, или капну исходники (а там тоже самое WinAPI), или сразу в доку по WinAPI погружусь. Но решу быстрее всего через первый вариант - в MainMenu стандартные иконки, а PopupMenu заменю на диалоговое окно.
lordgray
Проблема решается в несколько строчек.
1. В файле /lazarus/lcl/interfaces/win32/Win32WSMenus.pp находишь функцию GetVistaPopupMenuMetrics
2. Объявляешь в ней локальную переменную ImageList : TCustomImageList;
3. Первой строкой инициализируешь переменную:
4. Находишь строчку:
и заменяешь её на:
5. Profit
6. Делаешь патчик и постишь в трекер
Проблема решается в несколько строчек.
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 писал(а):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 писал(а):В результате - где есть иконка, высокая строка, где нет, обычная.
А отмеченные (Checked := True) элементы без картинок в таком варианте нормально отрисовываются?
kazalex писал(а):lordgray писал(а):В результате - где есть иконка, высокая строка, где нет, обычная.
А отмеченные (Checked := True) элементы без картинок в таком варианте нормально отрисовываются?
Да
У вас нет необходимых прав для просмотра вложений в этом сообщении.
lordgray писал(а):Да
ОК. Тогда можно ещё небольшую доработку сделать. Сначала пытаться получить размер пиктограммы непосредственно от элемента (AMenuItem.GetIconSize) чтобы учитывалось наличие свойства Bitmap. И если размер картинки нулевой, тогда уже пытаться получить размер от ImageList.
Добавлено спустя 3 минуты 9 секунд:
lordgray писал(а):Как делать патч и где его постить - понятия не имею. Где почитать?
Почитать можно тут.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
А может, попробовать использовать пустую иконку?
.
DPI - нужно установить в настройках проекта. Только вчера на форуме ссылку видел.
Добавлено спустя 1 минуту 3 секунды:
вот адрес обсуждения.
http://freepascal.ru/forum/viewtopic.php?f=5&t=10432&p=87355#p87355
DPI - нужно установить в настройках проекта. Только вчера на форуме ссылку видел.
Добавлено спустя 1 минуту 3 секунды:
вот адрес обсуждения.
http://freepascal.ru/forum/viewtopic.php?f=5&t=10432&p=87355#p87355
Лекс Айрин, vitaly_l
Господа, вы о чём вообще?
Господа, вы о чём вообще?
kazalex писал(а):Лекс Айрин, vitaly_l
Господа, вы о чём вообще?
Вы очевидно не знаете что такое DPI и как это влияет на отображаемое на экране?
Размер иконок - тоже зависит от установок DPI, соответственно установив DPI - проблема размера иконок может решиться без патчей и т.п.
У меня например решилась проблема с размерами (правда там иконок не было).
DPI - устанавливается в настройках проекта.
