c# - C# WinForms,具有半透明背景的工具提示
问题描述
我正在开发这个小型 WinForm 应用程序,并决定使用具有半透明背景的自定义绘制工具提示。所以我开始将OwnerDraw
ToolTip 上的属性设置为,为和事件True
创建事件处理程序(参见下面的示例代码。注释版本也不起作用)。Draw
Popup
private void toolTip_Popup(object sender, PopupEventArgs e)
{
e.ToolTipSize = new Size(400, 400);
}
private void toolTip_Draw(object sender, DrawToolTipEventArgs e)
{
//e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(120, Color.Red)), new Rectangle(e.Bounds.Location, e.Bounds.Size));
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(120, Color.Red)), new Rectangle(0, 0, 400, 400));
}
现在,当工具提示第一次显示特定控件时,一切都按预期工作。见下图(400x400 工具提示,半透明红色背景)。
但是当我第二次将鼠标悬停在同一个控件上时,ToolTip 失去了它的半透明性。见下图。为什么呢?
解决方案
谢谢大家的帮助。我很确定 Ben Voigts 的回答,或者 Jimis 的评论也可以以某种方式解决这个问题(我稍后会尝试并更新答案,如果我能够使用它们)。
我的解决方案基于 Hans Passant 提出的第一条评论,他建议Graphics.CopyFromScreen()
在Popup
事件处理程序(toolTipDay_Popup
)中使用,以捕获工具提示下方的图像,然后在Draw
事件处理程序(toolTipDay_Draw
)中我只是绘制了捕获的图像。
(如 Hans Passant 所述,不同的 DPI 缩放存在问题,但这可以通过 Farshid T 在How to get Windows Display settings?中的回答解决,我没有将它包含在下面的代码中)。
所以我现在使用的解决方案如下:
Bitmap dayToolTipBackground = new Bitmap(200, 200);
private void toolTipDay_Popup(object sender, PopupEventArgs e)
{
e.ToolTipSize = new Size(200, 200);
var backGraphics = Graphics.FromImage(dayToolTipBackground);
var cursorPosition = Cursor.Position;
backGraphics.CopyFromScreen(new Point(Cursor.Position.X, Cursor.Position.Y + 21), new Point(0, 0), new Size((200, 200)));
}
private void toolTipDay_Draw(object sender, DrawToolTipEventArgs e)
{
e.Graphics.DrawImage(dayToolTipBackground, new Point(0, 0));
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(120, Color.Red)), new Rectangle(e.Bounds.Location, e.Bounds.Size));
}
推荐阅读
- java - JSON Jackson将多个键反序列化到同一字段中
- javascript - 使用 lodash cond 获取某个分支
- r - 重新调整ggplot中的水平轴
- python-3.x - TypeError: ord() 期望一个字符,但找到长度为 5 的字符串
- laravel - “前任”的形式和可用性
- php - 集成 Third Restful.json 以获取信息并将其发布到 WordPress
- html - XSD 文件中的标记验证
- vba - 如何将 TreeView 控件中的节点设置为粗体 (Access 2013)
- sql - 从多行计算持续时间并分组
- python - Python 即时压缩库