Delphi自定义弹出/下拉菜单,如何?

Posted

技术标签:

【中文标题】Delphi自定义弹出/下拉菜单,如何?【英文标题】:Delphi Custom popup/dropdown, how? 【发布时间】:2011-02-28 21:26:06 【问题描述】:

我想制作一个自定义下拉/弹出菜单,其下方有一个很好的阴影。问题是它不是标准菜单,我需要在弹出/下拉菜单中放置一些组件。所以基本上我想要一个下拉菜单,我可以做任何我想做的事情,而不仅限于简单的菜单项。我希望它表现得像一个正常的弹出菜单问题是我从哪里开始。有什么解决办法吗?参考文献?

【问题讨论】:

【参考方案1】:

您可以使用 TPopupMenu 并提供自定义绘图。 这是通过设置

PopupMenu1.OwnerDraw := True;

然后编码OnMeasureItem()OnAdvancedDrawItem() 事件以确定自定义绘画所需的尺寸。 然后编码OnDrawItem() 事件以根据需要绘制画布。

【讨论】:

嗨罗伯特,谢谢你的链接,但我不认为我可以在 tpopupmenu 上放置滚动条,但这是一篇不错的文章。我正在尝试模仿 Vista 中面包屑栏的下拉菜单,因此我必须能够在下拉面板中添加滚动条或列表视图。 那么TPopupMenu就不能用了。我见过的最接近的可能是 TMS Software 的一个商业产品,称为 Advanced Poly Lists。虽然我有它的许可证,但我还没有机会使用它,因为它刚刚发布。 tmssoftware.com/site/advpolylist.asp?s= 谢谢罗伯特,我想这是一项相当艰巨的任务,但我在尝试使面板像带有阴影的弹出/下拉菜单方面取得了一些成功。很高兴看到我有一些选择,如果这不能像我想要的那样工作。 @JerryDodge 我从答案中删除了链接。【参考方案2】:

听起来您想要一个看起来像弹出菜单但包含组件的表单。

如果您有一个具有 OnMouseDown 事件的组件(例如此示例中显示的 TPanel),并且您只需弹出第二个表单,其中包含您想要弹出的控件,则会更容易:

procedure TForm3.JvPanel1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button=mbRight then
        FDown := true
  else
        FDown := false;
end;

procedure TForm3.JvPanel1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  pt:TPoint;
begin
  if Button=mbRight then begin
        FDown := true;
        pt.X := jvPanel1.Left;
        pt.Y := jvPanel1.Top+jvPanel1.Height;


        pt := ClientToScreen(pt);
        Form4.Position := poDesigned;
        Form4.BorderStyle := bsNone;
        Form4.Left := pt.X;
        Form4.Top := pt.Y;
        Form4.Show;
  end;

end;

它处理显示自己的表单,并将自己定位为看起来像一个弹出窗口。 隐藏自己的第二种形式也很容易:

procedure TForm4.FormDeactivate(Sender: TObject);
begin
 Hide;
end;

【讨论】:

谢谢,是的,这可能是一个解决方案,但不完全是我需要的,因为我希望它类似于带有阴影的弹出菜单。我现在确实有一个解决方案,它将显示一个带有阴影的面板,并且或多或少地表现为一个弹出菜单。我不知道我是否可以在这里发布完整的解决方案,但我迟早会在我的博客上发布。您可以在此处发布的代码大小有任何限制吗? 对我来说,阴影可能只是您显示的另一个窗口,其中 Alpha 混合为 50%。 遗憾的是,我使用了 imageshack,而不是 imgur,并且该图像消失了。【参考方案3】:

值得一提的是,弹出窗口的阴影方面现已得到处理和解决in this question。

【讨论】:

不,它还没有被“解决和解决”,这个问题的解决方案并不适合所有人。这实际上就是把我带到这里的原因:-)

以上是关于Delphi自定义弹出/下拉菜单,如何?的主要内容,如果未能解决你的问题,请参考以下文章

Android自定义下拉菜单/弹出菜单

顶部栏的自定义下拉菜单[关闭]

delphi 如何让Combobox下拉菜单时,显示一个树形结构

如何将工具提示/下拉菜单/弹出窗口添加到 UDF/用户定义的 Excel 2010 函数?

C#下拉菜单最后一项自定义的实现

delphi的mainmenu,点击下拉菜单,会向右下角移动的问题