Использование Delphi 10.3:
В нарисованном владельцем TComboBox
с Style=csOwnerDrawFixed
я хочу, чтобы нарисованные владельцем предметы в списке DropDown отличались от статической части комбо.Чтобы различать два случая, я проверяю odComboBoxEdit
в параметре State
, как описано здесь:
Как нарисовать статическую часть выпадающего списка
procedure TStylePanel.TargetArrowComboDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
if (odComboBoxEdit in State) then
begin
// Paint static control
end
else
begin
// Paint item in dropped down list
end;
end;
Это работает хорошо, если нет активного стиля VCL.Однако с пользовательским стилем это больше не работает надежно.Проверяя источник в Vcl.StdCtrls.pas
для TComboBoxStyleHook
, мне кажется, что причина в этой комбинации:
procedure TComboBoxStyleHook.WMPaint(...)
procedure TComboBoxStyleHook.DrawItem(...)
Когда нет дескриптора редактирования (как в случае csOwnerDrawFixed
), DrawItem()
собирает TDrawItemStruct
, который будет никогда содержать ODS_COMBOBOXEDIT
, в результате обработчик CN_DRAWITEM
никогда не будет иметь odComboBoxEdit
установленного.
Я могу переопределить TComboBoxStyleHook
,но мне нужен способ определить, является ли элемент статическим элементом или элементом в списке.
В качестве обходного пути я проверяю на Combo.DroppedDown
, но это не то же самое: даже когда выпадающий списокЯ хочу, чтобы статическая часть была нарисована не так, как элементы в списке.
Итак, вопрос в том, как определить (в обработчике нестандартного рисования или в хуке стиля), что нарисованный пользователем элементстатическая область, а не элемент в списке?