Да, это - снова этот вопрос:
Как я могу изменить цвет шрифта TCheckBox (или какое-либо обработанное управление) с Delphi7-> Delphi2007 на, темы включили приложение?
После чтения много в Интернете и на этом сайте, я нашел 4 вида ответа:
Хорошо, но я все еще недоволен этим.
Предоставление пользователя окрасило обратную связь для состояния свойства/данных, которое он имеет на форме, кажется законным мне.
Тогда я просто установил выпуск Экспресса 2008 года MSVC#, и что удивление, они могут изменить цвет шрифта (свойство ForeColor флажка) Тогда что?
Это, кажется, не, "это разработано как этот Microsoft". тогда теперь вопрос снова:
Как я могу изменить цвет шрифта TCheckBox (или какое-либо обработанное управление) с Delphi 7 через Delphi 2007 на поддерживающем тему приложении?
Вариант 5. Используйте понравившийся вам элемент управления в качестве базового варианта и переопределите все сообщения о рисовании в элементе управления (да, вы можете назвать его компонентом, но control - это название для видимых компонентов, поэтому лучше использовать именно его). Просто перехватывая WM_PAINT и, возможно, WM_NCPAINT, вы можете рисовать элемент управления в своем собственном стиле. По крайней мере, вы можете повторно использовать всю функциональность элемента управления. До тех пор, пока вы не измените компоновку, только цвета, вам не нужно будет менять хиттесты mousedowns. up moves и т.д. и т.п.
Примечание: У меня есть опыт переопределения TCustomEdit, чтобы позволить всевозможные цвета, фоновый текст, дополнительные кнопки и т.д. Потребовалось довольно много времени, чтобы сделать это правильно и прочитать все документы из MSDn и KB, чтобы убедиться, что элемент управления делает то, что я хотел.
О, но вы можете!
Просто поместите этот перед объявлением вашей формы :
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 для рисования тем. К сожалению, это не поведение по умолчанию, и я тоже не знаю, как это сделать. Посмотрите на этот вопрос тоже.