2010-06-07 116 views
2

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

回答

4

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

PopupMenu1.OwnerDraw := True; 

然后编码OnMeasureItem()OnAdvancedDrawItem()事件,以确定您需要的风俗画的大小来完成。 然后编码OnDrawItem()事件以根据需要绘制画布。

+0

嗨罗伯特, 谢谢你的链接,但我不认为我可以把滚动条放在tpopupmenu上,但这是一篇很好的文章。 我想模仿在Vista中的痕迹导航栏的下拉,所以我必须能够添加滚动条或列表视图到下拉面板。 – 2010-06-07 22:54:08

+0

然后TPopupMenu不能使用。我见过的最接近的东西可能是TMS Software提供的名为Advanced Poly Lists的商业产品。虽然我有一个许可证,但我还没有机会使用它,因为它刚刚发布。 http://www.tmssoftware.com/site/advpolylist.asp?s= – 2010-06-07 23:01:15

+0

谢谢罗伯特,我想这是一个相当困难的任务,但我已经取得了一些成功,试图让一个面板像一个弹出/下拉菜单与阴影。很高兴看到我有一些选择,如果这不能像我想要的那样。 – 2010-06-09 20:59:40

4

这听起来像你想要一个看起来像一个弹出菜单,但包含组件的窗体。

更容易,如果你有一个具有一个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; 

alt text http://img718.imageshack.us/img718/8171/formlookslikepopup.png

+0

谢谢,是的,这可能是一个解决方案,但不完全是我需要的,因为我希望它像一个带有阴影的popupmenu。我现在有一个解决方案,它会显示一个带有阴影的面板,并作为popup菜单或多或少地运行。我不知道我是否可以在这里发布完整的解决方案,但我会迟早将它发布在我的博客上。代码大小的任何限制,你可以在这里发布? – 2010-06-12 16:31:54

+0

对我来说,影子可能只是另一个窗口,你用50%的alpha混合显示。 – 2014-04-07 17:09:41

+0

图片不存在... – 2017-09-10 16:41:04

-1

对于什么是值得的,在弹出的下拉阴影方面现在已经解决,解决in this question

+0

不,它还没有被“固定和解决”,该问题的解决方案并不适用于所有人。这实际上是什么把我带到这里的:-) – 2014-12-20 20:01:00