gpt4 book ai didi

c# - 防止表单在工作区域外显示

转载 作者:行者123 更新时间:2023-12-04 07:39:37 24 4
gpt4 key购买 nike

我创建了一个自定义表单以将其显示为工具提示,但要在其上显示数据,当用户将鼠标悬停在按钮上并在鼠标离开时消失时,将显示该显示,一切正常,但如何防止表单显示在屏幕面积??
这是我用来显示表单的代码:

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();
}
enter image description here

最佳答案

我建议:

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

  • 当然,您可以使用公开静态方法的专用类来处理您的工具提示表单
    然后,您可以从应用程序的任何位置访问您的工具提示表单,只需调用 ShowToolTip()HideToolTip()当鼠标指针进入或离开特定控件时:此控件的边界(转换为屏幕坐标)用作定位工具提示的引用。
    在这里,我使用一种简化的方法来确定 ToolTip 应该显示在引用控件的右侧还是左侧以及顶部或底部:
  • 如果引用控件位于屏幕的左半部分,则窗体的左侧部分为:ToolTip.Left = [ref Control].Left
  • 否则,ToolTip.Left = [ref Control].Right - ToolTip-Width
  • 同样的逻辑适用于工具提示的顶部位置

  • 如果需要,调整这个简单的计算以使用不同的逻辑定位您的工具提示表单。
    ▶ 无需销毁 ToolTip Form:当 Form 实例传递给 Application.Run() 时,它会自动销毁。关闭了。
    备注 :如果应用程序不是 DpiAware 并且显示应用程序窗口的屏幕已缩放,则任何与屏幕或 Windows/窗体相关的度量都可能被虚拟化,因此您会收到错误的结果,并且任何计算都将关闭。
    请参阅此处的注释:
    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显示/隐藏工具提示的事件。
    备注 : 我正在使用 Task.Delay()延迟显示工具提示,因此如果您将鼠标指针短暂移动到显示它的控件上,它就不会显示。
    它还验证 Form ToolTip 是否已经显示(您不能显示一个 Form 两次),或者同时鼠标指针已经移动到引用 Control 的边界之外(在这种情况下 ToolTip 没有显示)。
    根据需要更改此行为。
  • ShowToolTip() ,我正在传递一个字符串,旨在用作工具提示的标题。这只是一个示例,表明您可以将任何其他参数传递给此方法(可能是类对象)以自定义方式设置工具提示表单,根据调用者的要求而有所不同。
  • 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();
    }
    }

    关于c# - 防止表单在工作区域外显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67562559/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com