Winform ToolTip位置设置

nik*_*rio 1 .net c# tooltip winforms

我想知道是否有可能通过MouseHover事件以某种方式将ToolTip的弹出窗口定位在应用程序窗体之外的空桌面上的固定点上,当然该事件是否对ToolTip有用(不确定)。或任何其他可能的方式

我不是在问如何显示另一种形式作为实现此目标的一种选择。

Rez*_*aei 5

您可以使用以下任一选项:

  1. 处理显示和隐藏ToolTip自己的情况。您可以在所需的位置MouseHover显示ToolTipMouseLeave隐藏。

  2. 使用MoveWindowWindows API方法,强制工具提示显示在特定位置而不是默认位置。

选项1

您可以处理MouseHoverMouseLeave你的控制(S)和显示的事件ToolTip在桌面窗口这种方式的具体位置:

private void control_MouseHover(object sender, EventArgs e) 
{
    var control = (Control)sender;
    var text = toolTip1.GetToolTip(control);
    if (!string.IsNullOrEmpty(text))
        toolTip1.Show(text, control, control.PointToClient(new Point(100, 100)));
}
private void control_MouseLeave(object sender, EventArgs e)
{
    var control = (Control)sender;
    toolTip1.Hide(control);
}
Run Code Online (Sandbox Code Playgroud)

选项2

作为我先前提供的用于对齐控件和ToolTip的右边缘的另一个选项,您可以设置to的OwnerDraw属性并处理控件的事件,并使用Windows API方法移动到所需位置:ToolTiptrueDrawMoveWindowToolTip

[System.Runtime.InteropServices.DllImport("User32.dll")]
static extern bool MoveWindow(IntPtr h, int x, int y, int width, int height, bool redraw);
private void toolTip1_Draw(object sender, DrawToolTipEventArgs e) {
    e.DrawBackground();
    e.DrawBorder();
    e.DrawText();
    var t = (ToolTip)sender;
    var h = t.GetType().GetProperty("Handle",
      System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
    var handle = (IntPtr)h.GetValue(t);
    var location = new Point(100,100);
    MoveWindow(handle, location.X, location.Y, e.Bounds.Width, e.Bounds.Height, false);
}
Run Code Online (Sandbox Code Playgroud)