Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi自定义弹出/下拉菜单,如何?_Delphi_User Interface_Menu_Drop Down Menu_Components - Fatal编程技术网

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

Delphi自定义弹出/下拉菜单,如何?,delphi,user-interface,menu,drop-down-menu,components,Delphi,User Interface,Menu,Drop Down Menu,Components,我想制作一个自定义的下拉/弹出菜单,下面有一个阴影。问题是它不是一个标准菜单,我需要在弹出/下拉菜单中添加一些组件。所以基本上我想要一个下拉列表,我可以用它做任何我想做的事情,而不仅仅是简单的菜单项。我想让它表现得像一个普通的弹出菜单问题是我从哪里开始。有什么解决办法吗?参考?您可以使用tpopumenu并提供自定义图形。 这是通过设置 PopupMenu1.OwnerDraw := True; 然后对OnMeasureItem()或OnAdvancedDrawItem()事件进行编码,以确定

我想制作一个自定义的下拉/弹出菜单,下面有一个阴影。问题是它不是一个标准菜单,我需要在弹出/下拉菜单中添加一些组件。所以基本上我想要一个下拉列表,我可以用它做任何我想做的事情,而不仅仅是简单的菜单项。我想让它表现得像一个普通的弹出菜单问题是我从哪里开始。有什么解决办法吗?参考?

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

PopupMenu1.OwnerDraw := True;
然后对
OnMeasureItem()
OnAdvancedDrawItem()
事件进行编码,以确定自定义绘制所需的大小。
然后对
OnDrawItem()
事件进行编码,以便根据需要绘制画布。

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

如果您有一个具有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;

值得一提的是,弹出窗口的阴影部分现在已经解决。

你好,罗伯特,谢谢你的链接,但我认为我不能在tpopmpmenu上放置滚动条,但这是一篇不错的文章。我试图模仿Vista中面包屑栏的下拉菜单,因此我必须能够在下拉面板上添加滚动条或列表视图。然后TPopupMenu无法使用。我所看到的最接近于此的可能是TMS软件的商业产品,名为Advanced Poly List。虽然我有许可证,但我还没有机会使用它,因为它刚刚发布。谢谢你,罗伯特,我想这是一个相当困难的任务,但我已经成功地尝试让一个面板像一个带阴影的弹出/下拉菜单。很高兴看到我有一些选择,如果这不是我想要的。@Jerrydoge我从答案中删除了链接。谢谢,是的,这可能是一个解决方案,但不完全是我需要的,因为我希望它像一个带阴影的弹出菜单。我现在确实有一个解决方案,它将显示一个带有dropshadow的面板,其行为或多或少像一个弹出菜单。我不知道我是否可以在这里发布完整的解决方案,但我迟早会在我的博客上发布。你可以在这里发布代码大小的限制吗?对我来说,阴影可能只是另一个窗口,你以50%的alpha混合显示。遗憾的是,我使用的是imageshack,而不是imgur,该图像已经消失。不,它还没有被“固定和解决”,这个问题的解决方案并不适用于所有人。这就是我来这里的原因:-)