我对TPopoupMenu和OwnerDraw有疑问。我正在尝试做一些自定义绘图,我将OwnerDraw设置为true并分配事件处理程序OnDrawItem。我以编程方式调用MyPopup.Popup(X,Y),但OnDrawItem永远不会被调用。我在这做错了什么?
感谢您的帮助。
编辑:
我的进一步发现表明使用VCL样式时存在一些问题。我分配了OnDrawItem和OnMeasureItem。现在这些处理程序被调用。实现OnDrawItem的常规方法不起作用所以我尝试使用VCL样式,但我的弹出菜单没有显示任何文本。
我的事件处理程序代码(OnDrawItem):
procedure TMyDisplay.EngineMenuDraw(Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
var LStyles: TCustomStyleServices;
Text: string;
const
ColorStates: array[Boolean] of TStyleColor = (scComboBoxDisabled, scComboBox);
FontColorStates: array[Boolean] of TStyleFont = (sfPopupMenuItemTextDisabled, sfPopupMenuItemTextNormal);
begin
LStyles := StyleServices;
Text := (Sender as TMenuItem).Caption;
ACanvas.Brush.Color := LStyles.GetStyleColor(ColorStates[(Sender as TMenuItem).Enabled]);
ACanvas.Font.Color := LStyles.GetStyleFontColor(FontColorStates[(Sender as TMenuItem).Enabled]);
if Selected then
begin
ACanvas.Brush.Color := LStyles.GetSystemColor(clHighlight);
ACanvas.Font.Color := LStyles.GetSystemColor(clHighlightText);
end;
ACanvas.FillRect(ARect);
ACanvas.TextOut(ARect.Left + 2, ARect.Top, Text);
end;
答案 0 :(得分:1)
OnDrawItem 分配给您希望绘制的 PopupMenu 中的每个项。
每个项目将通过调用 OnDrawItem 事件处理程序单独绘制 - 每个项目一个。 OnDrawItem 事件的发件人参数是对该调用的特定项目的引用。您可以拥有一个知道如何绘制每个项目的处理程序,或者如果项目具有不同的绘图需求,则使用单独的处理程序。
如果这不起作用,那么我怀疑您已为弹出菜单中的项目创建了 OnDrawItem 事件处理程序,但尚未将其分配给所有其他项目,并且已删除原始项目或以某种方式取消了处理程序。