防止表格显示在工作区外

Prevent Form from showing outside the working area

我创建了一个自定义表单以将其显示为工具提示但要在其上显示数据,当用户将鼠标悬停在按钮上并在鼠标离开时消失时将显示该节目,一切正常但我如何才能防止来自屏幕区域外显示的表单??

这是我用来显示表单的代码:

Info_Form tooltip = new Info_Form();
private void Button131_MouseHover(object sender, EventArgs e)
{
    Button b = (Button)sender;

    tooltip = new Info_Form();
    tooltip.Height = tooltip.Height + 30;
    tooltip.Location = new Point(
    b.Right,
    b.Top);

    tooltip.Show();
}

private void Button131_MouseLeave(object sender, EventArgs e)
{
    tooltip.Close();
}

我建议:

  • 在 Program.cs
  • 中声明您的工具提示表单
  • 添加静态方法来显示和隐藏它

当然你可以使用一个专用的class公开静态方法来处理你的工具提示表单

然后您可以从应用程序的任何位置访问您的工具提示表单,只需在鼠标指针进入或离开特定控件时调用 ShowToolTip()HideToolTip():此控件的边界,转换为屏幕坐标,用作定位工具提示的参考。

在这里,我使用一种简化的方法来确定工具提示是显示在参考控件的右侧还是左侧以及顶部还是底部:

  • 如果引用控件位于屏幕的左半部分,则窗体的左侧部分为:ToolTip.Left = [ref Control].Left
  • 否则,ToolTip.Left = [ref Control].Right - ToolTip-Width
  • 相同的逻辑适用于工具提示的顶部位置

如果需要,调整这个简单的计算以使用不同的逻辑定位您的工具提示表单。

▶ 无需处理 ToolTip Form:当传递给 Application.Run() 的 Form 实例关闭时,它会自动处理。

注意:如果应用程序不是 DpiAware 并且显示应用程序 Windows 的屏幕已缩放,则任何与屏幕或 Windows/Forms 可能已被虚拟化,因此您收到 错误的 结果,所有计算都将关闭。

在此处查看注释:
Using SetWindowPos with multiple monitors

using System.Drawing;
using System.Threading.Tasks;
using System.Windows.Forms;

public static frmToolTip tooltip = null;

[STAThread]
static void Main() {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    tooltip = new frmToolTip();
    Application.Run(new SomeForm());
}

public async static Task ShowToolTip(Control control, string title) {
    await Task.Delay(400);
    if (tooltip.Visible) return;

    Rectangle refBounds = control.RectangleToScreen(control.ClientRectangle);
    if (!refBounds.Contains(Cursor.Position)) {
        HideToolTip();
    }
    else {
        var screen = Screen.GetBounds(control);
        var leftPos = refBounds.Left <= screen.Width / 2 ? refBounds.Left : refBounds.Right - tooltip.Width;
        var topPos = refBounds.Top <= screen.Height / 2 ? refBounds.Bottom + 2: refBounds.Top - tooltip.Height - 2;
        tooltip.Location = new Point(leftPos, topPos);
        tooltip.Text = title;
        tooltip.Show(control.FindForm());
    }
}
public static void HideToolTip() => tooltip.Hide();

在任何表单中,将控件的 MouseEnterMouseLeave 事件用于 show/hide 您的工具提示。

注意:我正在使用 Task.Delay() 来延迟工具提示的显示,所以如果您将鼠标指针短暂地移到显示它的控件。
它还会验证是否已显示窗体工具提示(您不能两次显示窗体)或鼠标指针同时移动到引用控件的边界之外(在这种情况下未显示工具提示)。

根据需要更改此行为。

  • ShowToolTip() 中,我正在传递一个字符串,用作工具提示的标题。这只是一个例子,表明您可以将任何其他参数传递给此方法(可能是 class object,以自定义方式设置工具提示表单,根据调用者的要求而有所不同。
using System.Threading.Tasks;

public partial class SomeForm : Form
{
   // [...]

    private async void SomeControl_MouseEnter(object sender, EventArgs e)
    {
        await Program.ShowToolTip(sender as Control, "Some Title Text");
    }

    private void SomeControl_MouseLeave(object sender, EventArgs e)
    {
        Program.HideToolTip();
    }
}