Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Tokyo 10.2.2 : способ поменять шрифты в MainMenu, Исправление бага со шрифтами MainMenu 
:(
    Опции темы
Prok12
  Дата 10.2.2018, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 8.11.2011

Репутация: 3
Всего: 3



Никогда не увлекался рюшечками и украшательствами в оформлении приложения, но... Перешёл с XE8 на Tokyo 10.2.2. И тут заметил, что пункты (Items) в MainMenu стали отображаться как-то не так, как было в XE8. Знаю, что в Tokyo что-то поломали в DPI. У меня, например, экран (там где разрабатывается приложение) с высоким разрешением, так что в самой среде Windows задан пользовательский масштаб 125% (120 DPI). Теперь (Tokyo 10.2.2) масштабирование форм даже на том же компе, где идёт разработка, выполняется неверно в режиме для форм Scaled=True. Потому ставлю для всех форм Scaled=False, а в конструкторе каждой формы (событие OnCreate) добавляю 
Код

ScaleBy(PixelsPerInch, 120);

То есть, при переходе на другой комп масштабирование выполняется "вручную". Но это пол-беды: проблема, решаемая сравнительно просто...  smile 
Самое неприятное, что в MainMenu (оно у меня рисовалось в дефолтном режиме OwnerDraw=False) те пункты, которые были с иконками, отображаются крупным шрифтом, а те что без иконок - мелким (обычным, как надо). Иконки задавались в свойствах Bitmap для Items в меню, 16х16
Проблема управления шрифтами Menu - известная, поднималась неоднократно, например для Delphi Seattle : https://stackoverflow.com/questions/3302009...-delphi-seattle
Далее по пунктам.
----------------------------
1) Первое что пришло в голову, перейти в режим отрисовки главного меню OwnerDraw=True. Всё Меню нарисовалось одинаковым шрифтом, но...очень крупным. Управлять шрифтом по-простому - нечем.  smile 
----------------------------
2) Полазив по просторам мировой паутины, пытаюсь задавать Screen.MenuFont.Size. Да, поначалу помогло. Но потом выяснилось, что по мере запуска других приложений на компе что-то сбивается, и снова MainMenu отрисовывается слишком крупным шрифтом. smile 
----------------------------
3)  По совету из того же Интернета скачал RyMenu.zip. Работает, но... Во первых, не отображает иконки именно из свойства Bitmap пп. меню, а только из ImageList (что, впрочем, удобнее). Во-вторых, иконки в самой верхней строке меню (их которой раскрываются под-меню - сразу под заголовком формы), у меня вообще не отображаются, а мне и они нужны (показано на правой части прилагаемого рисунка красной стрелкой вверх).  smile 
----------------------------
4) Выход нашёл такой.
4.1. Создаём всё MainMenu как обычно в Delphi - через Object Inspector.
4.2. Все иконки для меню 16х16 запихиваем в компонент TImageList : его надо добавить на форму и связать в Object Inspector с MainMenu; для каждого под-пункта Меню (Item) просто выбираем номер иконки из этого списка TImageList (ну это всем понятно - обычный способ).
4.3. Задаём режим отрисовки Меню OwnerDraw=True : это важно!
4.4. В разделе интерфейса основной формы (для которой Меню) сразу после uses прописываем 9 строк:
Код

//==== Добавлено для Delphi RAD Studio Tokyo 10.2.2 : шрифт меню ======
type TMyFontMenuItem = class(TMenuItem)
  protected  { Prorected declarations }
   procedure AdvancedDrawItem(ACanvas: TCanvas;  ARect: TRect;
    State: TOwnerDrawState; TopLevel: Boolean);  override;
end;

// Заменяем везде ниже тип TMenuItem на свой, который с выбором шрифта
type TMenuItem = class(TMyFontMenuItem);

{===== Строки ниже набирать не надо: это делает Object Inspector =======}
type TMainForm = class(TForm)
    MainMenu: TMainMenu;
    FileItem: TMenuItem;
    TimeFileOpenItem: TMenuItem;
    FileExitItem: TMenuItem;
    WindowItem: TMenuItem;
    WindowCascadeItem: TMenuItem;
    WindowTileHorItem: TMenuItem;
    WindowTileVerItem: TMenuItem;
........
........
........ и так далее....

4.5. В раздел Imlementation пишем реализацию переопределённого метода AdvancedDrawItem (который мы уже в пп.4.4 "вывели из тени"  на свет - Protected) :
Код

//==== Добавлено для Delphi RAD Studio Tokyo 10.2.2 : шрифт меню ======
procedure TMyFontMenuItem.AdvancedDrawItem(ACanvas: TCanvas;
  ARect: TRect;  State: TOwnerDrawState;  TopLevel: Boolean);
begin
    With ACanvas.Font do begin
    Size := 9;
      If (Self = MainForm.FileExitItem) or
       (Self = MainForm.RunItem) or (Self = MainForm.DataBaseItem)
       then Style := [fsBold] else Style := [fsItalic];
     end;
Inherited AdvancedDrawItem(ACanvas, ARect,  State, TopLevel);
end;

Названия (Name) пунктов меню, для которых требуется особый шрифт, будут у вас свои, конечно. У меня в примере это FileExitItem, RunItem, DataBaseItem.
Всё !!  Итак, буквально 20 коротких строк кода потребовалось добавить для управления шрифтами MainMenu.  smile  
Цветом шрифтов Меню, увы, так просто управлять не удастся.  smile 
Вид полученного Меню в двух режимах активности его под-пунктов - на прилагаемом рисунке.


Это сообщение отредактировал(а) Prok12 - 10.2.2018, 14:50

Присоединённый файл ( Кол-во скачиваний: 17 )
Присоединённый файл  MainMenu_FONT_Go_.jpg 161,86 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0961 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.