Delphi-доступ к холсту окна подсказки


Существует ли краткий способ доступа к холсту окна подсказки? Я не хочу ничего рисовать на холсте - я просто назначу свойству компонента Hint, но я хочу узнать ширину текста, который Windows будет отображать, используя любой шрифт, используемый для текста окна подсказки.

* Причина *

Я пытаюсь построить окна подсказок с вкладками столбцов в них, например

SomeControl.Hint := 
  'Item 1:       ' + #9 + 'Tom' + #13 +
  'Item 2:       ' + #9 + 'Dick' + #13 +
  'Another Item: ' + #9 + 'Harry' + #13 ;

И я хочу, чтобы имена все вкладывались друг под другом. Пример, показанный выше, будет корректным только в том случае, если шрифт подсказки будет моноразрядным. Я могу добиться этого с помощью данного пропорционального шрифта методом проб и ошибок, заполняя строки правильным количеством пробелов, но я хочу, чтобы это работало для любого шрифта. Большинство примеров, которые я видел, похоже, предназначены для изменения внешнего вида окна подсказки - все, что я хочу сделать, это вызвать Canvas.TextWidth, чтобы я мог вычислить, какое заполнение мне нужно добавить, чтобы "протолкнуть" строку над следующей остановкой вкладки.

* обновление *

Я работал в заблуждении - я предполагал, что контроль подсказок уважает символ табуляции, но на самом деле он, кажется, игнорирует его. Компонент TLabel, с другой стороны, уважает символ табуляции - он, кажется, перемещается в следующий кратный 10 или около того пробелов.

1 2

1 ответ:

Существует два способа добиться того, чего вы хотите.

  1. есть свойство Screen.HintFont, которое вы можете назначить любому холсту и получить размеры текста подсказки.
  2. существует глобальное HintWindowClass Приложение Delphi, используемое для создания окон подсказок, и вы можете создать свой собственный и использовать его холст для измерения текста.

Вы можете использовать его следующим образом:

var
  HintCtrl: THintWindow;

  HintCtrl := HintWindowClass.Create(nil);
  HintCtrl.Canvas.TextWidth('abc');
  ...