工具提示文本离开屏幕 (WinForms)
Tooltip Text going off screen (WinForms)
我画了一个工具提示控件 - 代码如下。
private void toolTip1_Popup(object sender, PopupEventArgs e)
{
ToolTip tt = (sender as ToolTip);
string toolTipText = tt.GetToolTip(e.AssociatedControl);
e.ToolTipSize = TextRenderer.MeasureText(toolTipText, new Font("Arial", 16.0f));
}
private void toolTip1_Draw(object sender, DrawToolTipEventArgs e) => DrawToolTip(sender, e);
[System.Runtime.InteropServices.DllImport("User32.dll")]
static extern bool MoveWindow(IntPtr h, int x, int y, int width, int height, bool redraw);
private void DrawToolTip(object sender, DrawToolTipEventArgs e)
{
ToolTip tt = (sender as ToolTip);
string toolTipText = tt.GetToolTip(e.AssociatedControl);
Font f = new Font("Arial", 16.0f);
e.DrawBackground();
e.DrawBorder();
toolTipText = e.ToolTipText;
e.Graphics.DrawString(e.ToolTipText, f, Brushes.Black, new PointF(2, 2));
}
然后设置工具提示文本:
toolTip1.SetToolTip(btnLogin, "Some text.....");
此外,here is an image of what is happening.
看起来不错,但我注意到,如果文本超过一定长度,工具提示将离开屏幕。有什么办法可以防止这种情况发生吗?我宁愿不必添加 Environment.NewLine();或 \n 等,因为我需要对许多字符串执行此操作。
如果我对你的问题的理解正确,你正在尝试结合发布 and 的两个解决方案,主要是根据屏幕宽度调整ToolTip
window的大小,并将其移动到Point(2, 2)
, 屏幕坐标.
如果这就是你所需要的,你需要修改源代码一点,在Popup
事件中设置正确的e.ToolTipSize
,并且像上面的先生们评论的那样,将字符串绘制在矩形,Draw
事件中的 e.Bounds
属性。
using System;
using System.Drawing;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public partial class Form1 : Form
{
TextFormatFlags flags = TextFormatFlags.VerticalCenter
| TextFormatFlags.Left
| TextFormatFlags.LeftAndRightPadding
| TextFormatFlags.NoClipping
| TextFormatFlags.WordBreak;
public Form1()
{
InitializeComponent();
}
private void toolTip1_Popup(object sender, PopupEventArgs e)
{
var tt = sender as ToolTip;
var toolTipText = tt.GetToolTip(e.AssociatedControl);
var screen = Screen.FromControl(e.AssociatedControl).WorkingArea;
using (var g = e.AssociatedControl.CreateGraphics())
using (var font = new Font("Arial", 16))
{
var sz = TextRenderer.MeasureText(
g, toolTipText, font, screen.Size, flags);
e.ToolTipSize = new Size(screen.Width - 2, sz.Height + 10);
}
}
private void toolTip1_Draw(object sender, DrawToolTipEventArgs e)
{
var t = sender as ToolTip;
var h = (IntPtr)t.GetType().GetProperty("Handle",
BindingFlags.NonPublic | BindingFlags.Instance).GetValue(t);
MoveWindow(h, 2, 2, e.Bounds.Width - 2, e.Bounds.Height, false);
e.DrawBackground();
e.DrawBorder();
using (var font = new Font("Arial", 16))
TextRenderer.DrawText(e.Graphics, e.ToolTipText, font,
e.Bounds, Color.Black, flags);
}
[DllImport("User32.dll")]
static extern bool MoveWindow(IntPtr h, int x, int y,
int width, int height, bool redraw);
}
我画了一个工具提示控件 - 代码如下。
private void toolTip1_Popup(object sender, PopupEventArgs e)
{
ToolTip tt = (sender as ToolTip);
string toolTipText = tt.GetToolTip(e.AssociatedControl);
e.ToolTipSize = TextRenderer.MeasureText(toolTipText, new Font("Arial", 16.0f));
}
private void toolTip1_Draw(object sender, DrawToolTipEventArgs e) => DrawToolTip(sender, e);
[System.Runtime.InteropServices.DllImport("User32.dll")]
static extern bool MoveWindow(IntPtr h, int x, int y, int width, int height, bool redraw);
private void DrawToolTip(object sender, DrawToolTipEventArgs e)
{
ToolTip tt = (sender as ToolTip);
string toolTipText = tt.GetToolTip(e.AssociatedControl);
Font f = new Font("Arial", 16.0f);
e.DrawBackground();
e.DrawBorder();
toolTipText = e.ToolTipText;
e.Graphics.DrawString(e.ToolTipText, f, Brushes.Black, new PointF(2, 2));
}
然后设置工具提示文本:
toolTip1.SetToolTip(btnLogin, "Some text.....");
此外,here is an image of what is happening.
看起来不错,但我注意到,如果文本超过一定长度,工具提示将离开屏幕。有什么办法可以防止这种情况发生吗?我宁愿不必添加 Environment.NewLine();或 \n 等,因为我需要对许多字符串执行此操作。
如果我对你的问题的理解正确,你正在尝试结合发布ToolTip
window的大小,并将其移动到Point(2, 2)
, 屏幕坐标.
如果这就是你所需要的,你需要修改源代码一点,在Popup
事件中设置正确的e.ToolTipSize
,并且像上面的先生们评论的那样,将字符串绘制在矩形,Draw
事件中的 e.Bounds
属性。
using System;
using System.Drawing;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public partial class Form1 : Form
{
TextFormatFlags flags = TextFormatFlags.VerticalCenter
| TextFormatFlags.Left
| TextFormatFlags.LeftAndRightPadding
| TextFormatFlags.NoClipping
| TextFormatFlags.WordBreak;
public Form1()
{
InitializeComponent();
}
private void toolTip1_Popup(object sender, PopupEventArgs e)
{
var tt = sender as ToolTip;
var toolTipText = tt.GetToolTip(e.AssociatedControl);
var screen = Screen.FromControl(e.AssociatedControl).WorkingArea;
using (var g = e.AssociatedControl.CreateGraphics())
using (var font = new Font("Arial", 16))
{
var sz = TextRenderer.MeasureText(
g, toolTipText, font, screen.Size, flags);
e.ToolTipSize = new Size(screen.Width - 2, sz.Height + 10);
}
}
private void toolTip1_Draw(object sender, DrawToolTipEventArgs e)
{
var t = sender as ToolTip;
var h = (IntPtr)t.GetType().GetProperty("Handle",
BindingFlags.NonPublic | BindingFlags.Instance).GetValue(t);
MoveWindow(h, 2, 2, e.Bounds.Width - 2, e.Bounds.Height, false);
e.DrawBackground();
e.DrawBorder();
using (var font = new Font("Arial", 16))
TextRenderer.DrawText(e.Graphics, e.ToolTipText, font,
e.Bounds, Color.Black, flags);
}
[DllImport("User32.dll")]
static extern bool MoveWindow(IntPtr h, int x, int y,
int width, int height, bool redraw);
}