Как обнаружить ODS_COMBOBOXEDIT в пользовательском стиле владельца рисования TComboBox - PullRequest
0 голосов
/ 25 сентября 2019

Использование 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, но это не то же самое: даже когда выпадающий списокЯ хочу, чтобы статическая часть была нарисована не так, как элементы в списке.

Итак, вопрос в том, как определить (в обработчике нестандартного рисования или в хуке стиля), что нарисованный пользователем элементстатическая область, а не элемент в списке?

...