调用PopUp时TMenuItem ownerdrawing

时间:2014-10-27 15:29:38

标签: delphi

我对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;

1 个答案:

答案 0 :(得分:1)

必须将

OnDrawItem 分配给您希望绘制的 PopupMenu 中的每个项

每个项目将通过调用 OnDrawItem 事件处理程序单独绘制 - 每个项目一个。 OnDrawItem 事件的发件人参数是对该调用的特定项目的引用。您可以拥有一个知道如何绘制每个项目的处理程序,或者如果项目具有不同的绘图需求,则使用单独的处理程序。

如果这不起作用,那么我怀疑您已为弹出菜单中的项目创建了 OnDrawItem 事件处理程序,但尚未将其分配给所有其他项目,并且已删除原始项目或以某种方式取消了处理程序。