2017-03-01 91 views
1

我想知道是否有可能以某种方式在MouseHover事件的空桌面上以固定点定位应用程序窗体之外的工具提示弹出窗口,当然如果事件对ToolTip有用,则不确定。或者任何其他方式,如果它是可能的Winform工具提示位置设置

我不是要求如何显示另一个窗体作为此目标的选项。

+0

你想创建一个全局点击事件处理器?因为除非您构建/使用鼠标点击,否则鼠标点击无法在您的程序之外工作。 – EpicKip

+0

目前还不清楚你如何显示工具提示。最好添加一些代码来展示你如何展示它,然后其他用户可以尝试解决定位问题。 –

+0

@EpicKip您好,我上面编辑了错误,我希望弹出工具提示与MouseHover事件通过文本框或窗体无论如何,但除了应用程序窗体例如与大小800x300和固定位置在空白桌面独立于鼠标箭头位置。 – nikorio

回答

4

您可以使用这些选项:

  1. 手柄显示和隐藏ToolTip自己。您可以使用MouseHover在所需的位置显示ToolTip并使用MouseLeave隐藏它。

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

选项1

您可以处理你的控制(S)的MouseHoverMouseLeave事件,并显示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); 
} 

选项2

作为另一个这是我以前的align right edges of a control and ToolTip提供的选项,你可以的ToolTipOwnerDraw属性设置为true和处理Draw事件的控制和使用MoveWindow Windows API的方法移动ToolTip到所需的位置:

[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); 
} 
+0

谢谢。非常有用 – nikorio

+0

不客气:) –

1

听起来最终你想要的是一个盒子,当你将鼠标悬停在GUI上的某些特定项目上时,可以显示一些信息。你也可以说你想要的信息显示在一个固定的点。

至于反对与工具提示实现这一目标,我将做到以下几点:

  1. 创建一些固定的标签或文本框来显示信息,并把它放在你的Windows窗体上。
  2. 创建一个用户到鼠标悬停事件。
  3. 根据鼠标悬停事件中的sender(控制您悬停),选择要在固定位置显示的信息。

我见过有人在一些其他程序中这样做......以RealTerm为例。尝试一下,如果你想,看看它的感觉,然后再尝试这个解决方案。

另一方面,如果您必须使用工具提示进行此操作。您可以使用ToolTip.Show的超载选择位置。