Как можно изменить цвет шрифта поддерживающего тему управления?

Да, это - снова этот вопрос:

Как я могу изменить цвет шрифта TCheckBox (или какое-либо обработанное управление) с Delphi7-> Delphi2007 на, темы включили приложение?

После чтения много в Интернете и на этом сайте, я нашел 4 вида ответа:

  1. и Большая часть populare (даже от королевского адвоката): Вы не можете, это быть разработанными как этот Microsoft.
  2. Создайте компонент, которые позволяют, Вы потянуть его как Вы хотите.
  3. Купите дорогой набор компонента, который тянет как Вы, хотят.
  4. Не используйте темы.

Хорошо, но я все еще недоволен этим.

Предоставление пользователя окрасило обратную связь для состояния свойства/данных, которое он имеет на форме, кажется законным мне.

Тогда я просто установил выпуск Экспресса 2008 года MSVC#, и что удивление, они могут изменить цвет шрифта (свойство ForeColor флажка) Тогда что?

Это, кажется, не, "это разработано как этот Microsoft". тогда теперь вопрос снова:

Как я могу изменить цвет шрифта TCheckBox (или какое-либо обработанное управление) с Delphi 7 через Delphi 2007 на поддерживающем тему приложении?

9
задан Rob Kennedy 1 March 2010 в 15:05
поделиться

2 ответа

Вариант 5. Используйте понравившийся вам элемент управления в качестве базового варианта и переопределите все сообщения о рисовании в элементе управления (да, вы можете назвать его компонентом, но control - это название для видимых компонентов, поэтому лучше использовать именно его). Просто перехватывая WM_PAINT и, возможно, WM_NCPAINT, вы можете рисовать элемент управления в своем собственном стиле. По крайней мере, вы можете повторно использовать всю функциональность элемента управления. До тех пор, пока вы не измените компоновку, только цвета, вам не нужно будет менять хиттесты mousedowns. up moves и т.д. и т.п.

Примечание: У меня есть опыт переопределения TCustomEdit, чтобы позволить всевозможные цвета, фоновый текст, дополнительные кнопки и т.д. Потребовалось довольно много времени, чтобы сделать это правильно и прочитать все документы из MSDn и KB, чтобы убедиться, что элемент управления делает то, что я хотел.

0
ответ дан 4 December 2019 в 22:28
поделиться

О, но вы можете!

Просто поместите этот перед объявлением вашей формы :

TCheckBox = class(StdCtrls.TCheckBox)
public
  procedure CNCtlColorStatic(var Message: TWMCtlColorStatic); message CN_CTLCOLORSTATIC;
end;

Это повторное объявление TCheckBox теперь используется во время выполнения в качестве типа, транслируемого из DFM вашей формы. Теперь реализуйте сообщение следующим образом:

procedure TCheckBox.CNCtlColorStatic(var Message: TWMCtlColorStatic);
begin
  SetTextColor(Message.ChildDC, ColorToRGB(clRed)); // or RGB(255,0,0));
  SetBkMode(Message.ChildDC, TRANSPARENT);
  Message.Result := GetStockObject(NULL_BRUSH);
end;

Это перехватывает WM_CTLCOLORSTATIC сообщение и изменяет цвет текста на красный. Это работает в нетемматическом режиме для меня (используя WinXP classic), но не в тематическом режиме.

Следует знать, что для того, чтобы тематические элементы управления отправляли вам это сообщение, элемент управления должен предоставить флаг DTPB_USECTLCOLORSTATIC API для рисования тем. К сожалению, это не поведение по умолчанию, и я тоже не знаю, как это сделать. Посмотрите на этот вопрос тоже.

2
ответ дан 4 December 2019 в 22:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: