【发布时间】:2011-02-28 21:26:06
【问题描述】:
我想制作一个自定义下拉/弹出菜单,其下方有一个很好的阴影。问题是它不是标准菜单,我需要在弹出/下拉菜单中放置一些组件。所以基本上我想要一个下拉菜单,我可以做任何我想做的事情,而不仅限于简单的菜单项。我希望它表现得像一个正常的弹出菜单问题是我从哪里开始。有什么解决办法吗?参考文献?
【问题讨论】:
标签: delphi user-interface menu drop-down-menu components
我想制作一个自定义下拉/弹出菜单,其下方有一个很好的阴影。问题是它不是标准菜单,我需要在弹出/下拉菜单中放置一些组件。所以基本上我想要一个下拉菜单,我可以做任何我想做的事情,而不仅限于简单的菜单项。我希望它表现得像一个正常的弹出菜单问题是我从哪里开始。有什么解决办法吗?参考文献?
【问题讨论】:
标签: delphi user-interface menu drop-down-menu components
您可以使用 TPopupMenu 并提供自定义绘图。 这是通过设置
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;
【讨论】:
值得一提的是,弹出窗口的阴影方面现已得到处理和解决in this question。
【讨论】: