c# - 工具提示文本离开屏幕 (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));
}
然后设置 ToolTip 文本:
toolTip1.SetToolTip(btnLogin, "Some text.....");
看起来不错,但我注意到如果文本有一定长度,工具提示将离开屏幕。有没有办法阻止这种情况?我宁愿不必添加 Environment.NewLine(); 或 \n 等,因为我需要为许多字符串执行此操作。
解决方案
如果我正确理解您的问题,您正在尝试将此处和此处发布的两种解决方案结合起来,主要是根据屏幕宽度调整ToolTip
窗口大小,并将其移动到Point(2, 2)
屏幕坐标。
如果这是您需要的,则需要稍微修改源代码以e.ToolTipSize
在Popup
事件中设置权限,并如上面先生评论的那样,将字符串绘制在一个矩形中,即事件e.Bounds
中的属性。Draw
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);
}
推荐阅读
- html - 内容宽度在打印屏幕中不起作用
- python - 只要按住射击按钮,如何射击多发子弹
- php - LAMP Stack 无法正确读取 mysql 数据库,但无法正确插入。功能“成功”没有错误,但数据库不更新
- continuous-integration - GitHub Workflow 中的 `github.event` 有哪些属性?
- django - http流实际上是由http chunk实现的吗?
- jquery - 替换输入jQuery的先前值
- typescript - 打字稿“静态导入”?
- c++ - 重载 '++' 运算符 C++
- java - 如何在eclipse中添加maven参数?
- python - Python 解析(想想它的 JSON)