Delphi Application.HintColor - PullRequest
       20

Delphi Application.HintColor

3 голосов
/ 18 февраля 2010

В Delphi 2010 (не знаю о других версиях) Application.HintColor, похоже, не работает при работе в Windows 7. В XP он дает желаемый цвет. Есть ли обходные пути для этого?

Ответы [ 4 ]

4 голосов
/ 19 февраля 2010

HintColor похож на некоторые другие * свойства цвета в VCL в том, что если вы запускаете тематическое приложение в тематической ОС, они могут игнорироваться при рисовании элемента управления. Советы немного отличаются, потому что для них это Vista или выше, а не XP или выше. Вы можете увидеть это, если посмотрите на THintWindow.Paint в Controls.pas - он специально раскрашивает градиентный фон Vista, если это Vista и если темы включены.

Обычно это хорошая вещь , потому что вы хотите, чтобы ваше приложение соответствовало внешнему виду операционной системы и предпочтениям пользователя.

Если вы действительно хотите переопределить это, вам необходимо:

  • Подкласс THintWindow
  • Заставьте ваше приложение использовать этот новый класс подсказок при отображении подсказок
  • В этом классе переопределите методы рисования так, как вы хотите

Создайте новый класс подсказок, нисходящий с THintWindow куда-то (подробнее о том, что реализовать ниже.) Чтобы приложение использовало ваш новый класс для подсказок, назначьте обработчик событий для TApplication.OnShowHint ( самым простым способом). сделать это с помощью компонента TApplicationEvents в главной форме ) и изменить поле параметра HintInfo на свой новый класс .

В вашем новом классе подсказок вам нужно переопределить Paint и NCPaint. NCPaint закрасит границу, и вы захотите закрасить не-тематическую границу (вероятно, используя DrawEdge.) Измените Paint, чтобы заполнить фон выбранным цветом, а затем Нарисуйте текст, используя DrawText в прямоугольнике подсказки с соответствующими флагами обтекания и выравнивания текста. Если вы внимательно посмотрите на код VCL, вы увидите несколько смещений прямоугольника, жестко запрограммированных, и вы, вероятно, захотите имитировать их, чтобы получить те же прямоугольники в вашем коде, что и VCL.

Используя эту технику, вы можете создавать всевозможные интересные варианты подсказок. Один из них, который я недавно сделал, изменил картину, так что он нарисовал жирный заголовок, а затем имел другую информацию, например.

Наконец: почему вы устанавливаете цвет? Это предупредить пользователя о чем-то или предоставить какой-то другой отзыв? Если это так, рассмотрите возможность использования большего, чем цвет - вы можете изменить все, что вы хотите о подсказке, используя эту технику. Попробуйте нарисовать значок предупреждения или использовать вместо этого форматированный текст. Я бы порекомендовал вам попытаться сохранить общий вид темы и настроить код на тематическую картину, не переопределяя ее полностью, потому что, если нет очень веских причин, вам следует стараться придерживаться ОС / внешнего вида, выбранных пользователем.

2 голосов
/ 18 февраля 2010

Нет, не напрямую. Если у вас включены темы времени выполнения, для подсказки будет выбран системный цвет. (IOW, подсказка будет «тематической»). Это похоже на настройку цвета для кнопки с включенными темами (если вы можете это сделать).

Однако вы можете использовать другие «подсказки». Например, вы можете использовать TjvBallonHint и / или TjvDesktopAlert (возможно, в сочетании с TjvDesktopAlertStack) из JEDI JVCL , что бесплатно. Есть и другие (бесплатные и платные) альтернативы. Кроме того, если вы хотите, вы можете реализовать свое собственное окно подсказки.

НТН

0 голосов
/ 19 февраля 2010

В Delphi 2010 у вас есть класс TCustomHint. Из него вы можете получить новый класс, который рисует подсказку нового типа.

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

Вы можете проверить исходный код класса TBalloonHint, который является образцом потомка TCustomHint в Controls.pas

0 голосов
/ 18 февраля 2010

Отключение «включить темы выполнения» заставляет его работать.

...