#styles #themes #c builder #vcl
Вопрос:
У меня проблема со стилями vcl, перезаписывающими пользовательские цвета. Есть ли способ отключить стили при использовании OnDrawItem или определить, когда включен стиль и каким будет целевой цвет?
В частности, в данном конкретном случае, если стиль находится в темном режиме, текст становится белым, и в моем случае мне нужно, чтобы фон был белым. Таким образом, белый текст на белом фоне невидим.
Похоже, что цвет пера игнорируется и заменяется цветом стиля, в то время как цвета фона являются правильными.
В идеале, я бы хотел игнорировать элементы стиля во время этой конкретной процедуры рисования и просто использовать свои собственные цвета. (С использованием C Builder 11)
ТИА
Код, о котором идет речь:
//TCheckListBox *clbxCategory;
void __fastcall TFormATB::clbxCategoryDrawItem(TWinControl* Control,
int Index, TRect amp;Rect, TOwnerDrawState State)
{
if(State.Contains(odSelected)) {
clbxCategory->Canvas->Pen->Color = clBlack;
clbxCategory->Canvas->Brush->Color = clActiveCaption;
clbxCategory->Canvas->RoundRect(Rect.Left, Rect.Top , Rect.Right, Rect.Bottom, 0, 50);
}
else {
clbxCategory->Canvas->Pen->Color = Colours[Index];
clbxCategory->Canvas->Brush->Color = Colours[Index];
}
clbxCategory->Canvas->Rectangle(Rect.Left, Rect.Top - 1, Rect.Right, Rect.Bottom 1);
clbxCategory->Canvas->TextOut(Rect.Left, Rect.Top,clbxCategory->Items->Strings[Index]);
}
Комментарии:
1. Несвязанный: вы могли бы сделать
auto ctl = static_cast<TCustomListBox*>(Control);
и использоватьctl
в функции вместоclbxCategory
того, чтобы дать понять, чтоTCustomListBox
вы рисуете потомка. По крайней мере, я так предполагаю. Вы также можете упростить его и использоватьRect
как есть в некоторых случаях:clbxCategory->Canvas->RoundRect(Rect, 0, 50);
а такжеclbxCategory->Canvas->Rectangle(Rect);
2. О, я не видел ни малейшей разницы между вашим оригиналом и моими упрощениями. По крайней мере, не для того
RoundRect
единственного. Другой, где ты-1
и1
, не уверен.3. Я добавил комментарий, чтобы показать, что clbxCategory-это поле для проверки. (Удалил мой предыдущий комментарий, так как это был мусор 🙂 )