使用德尔福 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
,但这并不相同:即使下拉,我希望静态部分的绘制方式与列表中的项目不同。
所以问题是,我如何(在自定义绘制处理程序或样式挂钩中)检测到自定义绘制项是静态区域而不是列表中的项?