【发布时间】:2019-09-25 08:40:32
【问题描述】:
使用 Delphi 10.3:
在所有者绘制的TComboBox 和Style=csOwnerDrawFixed 中,我希望下拉列表中的所有者绘制的项目与组合的静态部分不同。为了区分这两种情况,我在State 参数中检查odComboBoxEdit,如下所述:
How to draw the static part of the combobox
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,但这不一样:即使下拉,我希望静态部分的绘制方式与列表中的项目不同。
所以问题是,我如何(在自定义绘制处理程序或样式挂钩中)检测到自定义绘制项是静态区域而不是列表中的项?
【问题讨论】:
标签: delphi vcl-styles tcombobox