Изменение высоты строки всплывающего окна после изменения размера шрифта

Мне нужно, чтобы мой слабовидящий пользователь мог выбрать размер шрифта, и в основном я обрабатываю его нормально, но всплывающее меню не работает должным образом, поскольку высота строки не изменяется с размером шрифта.

Используя это...

puMenuMain.OwnerDraw:=True;
Screen.MenuFont.Size:=18;  // Actually selected from list by User or Helper

Хорошо работает для размера шрифта, но высота строки не изменяется. В других компонентах, таких как TDBGrid, изменение Font.Size также изменяет высоту строки.

Как я могу заставить всплывающие меню настроить высоту строки для выбранного Font.Size?


person Community    schedule 08.07.2014    source источник


Ответы (2)


В документации для свойства OwnerDraw для TPopupMenu указано:

Когда OwnerDraw имеет значение true, элементы меню получают события OnMeasureItem и OnDrawItem, когда их необходимо отобразить на экране.

Поэтому назначьте обработчик для OnMeasureItem элементов всплывающего меню либо во время разработки, либо во время выполнения:

puMenuMain.OwnerDraw:=True;
Screen.MenuFont.Size:=18; 
for i := 0 to puMain.Items.Count - 1 do
  puMain.Items[i].OnMeasureItem := PopupMeasureItem;

где PopupMeasureItem может быть таким же простым, как

procedure TMyForm.PopupMeasureItem(Sender: TObject; ACanvas: TCanvas;
  var Width,   Height: Integer); 
begin
  Height := ACanvas.TextHeight('.') + 2;
end;

или вы можете определить необходимую высоту, когда пользователь выбирает из списка, чтобы сохранить вызов TextHeight каждый раз, когда элемент должен быть отрисован.

person Sertac Akyuz    schedule 08.07.2014

  1. Добавьте в форму пустой компонент ImageList.
  2. Установите для свойства Height нужное вам значение.
  3. Свяжите Images свойство вашего PopupMenu с этим ImageList.
  4. Выгода! :)
person kot-da-vinci    schedule 02.03.2015