場景:一個(小的)表單託管一個用戶控件。如何在Windows.Forms中創建浮動(工具提示)控件?
圖:每當UserControl引發懸停事件時,都會以工具提示方式顯示一些(圖形)信息。當用戶移動鼠標時,再次淡出它們。
備註:我想顯示多個「工具提示」,每個工具提示都是一個以圖形方式顯示信息的UserControl。不只是黃色框中的文字!另外,我正在使用Windows.Forms庫。
這是我到目前爲止有:
private void myControl_Hovered(object sender, MyEventArgs e)
{
var tooltip = new MyToolTip();
Controls.Add(tooltip);
tooltip.UpdateDisplay(e.Data);
tooltip.Show();
}
但它在後臺顯示出來(我可以處理)和可悲的是,被限制在窗口...
編輯:這是我最終做的...
我無法得到ToolTip
提供的控制與.NET工作。這主要是因爲我試圖在用戶繪製的控件中顯示用於「熱點」的工具提示(認爲功能點的圖形,顯示點的附加項目)。 ToolTip控件真的只想在用戶第一次進入控件時才顯示 - 手動顯示它似乎不起作用。我試過了。漫長而艱難。
所以,這個ToolTipWindow
類可以用來在無框窗口中顯示控件。我添加了Offset
屬性,因此它可以顯示在當前鼠標位置的偏移處。
/// <summary>
/// A tooltip class to display some information from a control.
/// </summary>
internal class ToolTipWindow: Form
{
/// <summary>
/// The offset from the mouse pointer to show the window at.
/// </summary>
public Point Offset { get; set;}
internal ToolTipWindow(Control controlToDisplay)
{
FormBorderStyle = FormBorderStyle.None;
TopMost = true;
ShowInTaskbar = false;
Opacity = 0.9;
Width = controlToDisplay.Width;
Height = controlToDisplay.Height;
Controls.Add(controlToDisplay);
controlToDisplay.Show();
}
/// <summary>
/// Move the window to an offset of mouse pointer.
/// </summary>
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
Location = new Point(MousePosition.X + Offset.X, MousePosition.Y + Offset.Y);
}
/// <summary>
/// Move the window to an offset of mouse pointer.
/// </summary>
protected override void OnVisibleChanged(EventArgs e)
{
base.OnVisibleChanged(e);
if (Visible)
{
Location = new Point(MousePosition.X + Offset.X, MousePosition.Y + Offset.Y);
}
}
}
要顯示工具提示,你可以趕上MouseHover
和MouseMove
事件。首先檢查,如果你在「熱點」上方並顯示工具提示。在MouseMove
中,如果您不在「熱點」之上,請隱藏工具提示。另外,關閉窗口時,請確保您關閉所有工具提示窗口!
注意:MouseHover
事件只會在第一次鼠標進入控件時顯示。如果你想讓它反覆(如在檢測的「熱點」的情況下)顯示出來,你應該增加類似的代碼包含「熱點」下面的控制:
#region AddReHoverExperience
// ReSharper disable InconsistentNaming
// found this code here: http://www.pinvoke.net/default.aspx/user32.TrackMouseEvent
[DllImport("user32.dll")]
static extern int TrackMouseEvent(ref TRACKMOUSEEVENT lpEventTrack);
[StructLayout(LayoutKind.Sequential)]
public struct TRACKMOUSEEVENT
{
public UInt32 cbSize;
public UInt32 dwFlags;
public IntPtr hwndTrack;
public UInt32 dwHoverTime;
}
TRACKMOUSEEVENT tme;
private const uint TME_HOVER = 0x1;
protected override void OnMouseHover(EventArgs e)
{
base.OnMouseHover(e);
OnMouseEnter(e);
}
protected override void OnMouseEnter(EventArgs e)
{
base.OnMouseEnter(e);
tme = new TRACKMOUSEEVENT
{
hwndTrack = Handle,
dwFlags = TME_HOVER,
dwHoverTime = 500
};
tme.cbSize = (uint)Marshal.SizeOf(tme);
TrackMouseEvent(ref tme);
}
// ReSharper restore InconsistentNaming
#endregion AddReHoverExperience
會顯示一個無邊框,TopMost窗體的幫助? – fre0n 2010-03-17 11:06:11
是的,fre0n,它會 - 我現在正在探索這條路線 - 將在完成後發佈此類代碼的源代碼) – 2010-03-17 11:26:16