如何创建一个hover的C#Winforms控件

如何创建一个超出其区域范围的C#Winforms控件? 比如一个下拉框。 有点像你在小尺寸面板中有一个DropDownBox。

Windows Forms不支持这样的窗口,它与设计师根本不兼容。 这里有一些代码可以帮助您入门。 您不能在设计器中使用此控件,它必须在运行时创建。 您还必须自己调用其Dispose()方法。

using System; using System.Drawing; using System.ComponentModel; using System.Windows.Forms; public class MyListBox : ListBox { private Control mParent; private Point mPos; private bool mInitialized; public MyListBox(Control parent) { mParent = parent; mInitialized = true; this.SetTopLevel(true); parent.LocationChanged += new EventHandler(parent_LocationChanged); mPos = mParent.Location; } public new Point Location { get { return mParent.PointToClient(this.Location); } set { Point zero = mParent.PointToScreen(Point.Empty); base.Location = new Point(zero.X + value.X, zero.Y + value.Y); } } protected override Size DefaultSize { get { return mInitialized ? base.DefaultSize : Size.Empty; } } protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified) { if (this.mInitialized) base.SetBoundsCore(x, y, width, height, specified); } void parent_LocationChanged(object sender, EventArgs e) { base.Location = new Point(base.Left + mParent.Left - mPos.X, base.Top + mParent.Top - mPos.Y); mPos = mParent.Location; } protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; if (mParent != null && !DesignMode) { cp.Style = (int)(((long)cp.Style & 0xffff) | 0x90200000); cp.Parent = mParent.Handle; Point pos = mParent.PointToScreen(Point.Empty); cp.X = pos.X; cp.Y = pos.Y; cp.Width = base.DefaultSize.Width; cp.Height = base.DefaultSize.Height; } return cp; } } } 

我最近做了类似的事情,我使用了ListBox。 很酷的想法是一个列表框,你可以在任何你想要的地方展示它,甚至超出你的控制范围。 这样,当您通过单击按钮或其他任何内容进行检测时,您需要显示所需的DropDown,只需填充ListBox并将其显示在您想要的任何位置。 我从这里得到了这个想法:

http://msdn.microsoft.com/en-us/library/aa480727.aspx

它们展示了如何使用过滤构建Custom DataGridView,并显示filter值,它们将ListBox放在标题单元格下。

这里有一篇好文章:

http://www.vbaccelerator.com/home/NET/Code/Controls/Popup_Windows/Popup_Windows/article.asp

这有一个类可以处理使其正常工作的一些棘手方面,例如保持应用程序窗口标题栏处于活动状态,处理Alt-Tab并用鼠标单击取消。