为了账号安全,请及时绑定邮箱和手机立即绑定

C# WinForms,具有半透明背景的工具提示

C# WinForms,具有半透明背景的工具提示

C#
郎朗坤 2021-10-31 19:31:24
我正在开发这个小型 WinForm 应用程序,并决定使用具有半透明背景的自定义绘制工具提示。所以我开始将OwnerDrawToolTip 上的属性设置为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 工具提示,半透明红色背景)。但是当我第二次将鼠标悬停在同一个控件上时,工具提示失去了它的半透明性。见下图。为什么呢?
查看完整描述

3 回答

?
月关宝盒

TA贡献1772条经验 获得超5个赞

第一次将鼠标悬停在控件上时,将使用透明色 (ARGB.120) 创建一个新的工具提示实例。当您在工具提示外单击时,是完全释放工具提示对象还是您只是将实例设置为不可见?

当您第二次将鼠标悬停在实例上时,如果旧的工具提示对象没有被释放,则有可能再次调用相同的对象。因此,现在当您在现有工具提示上使用 color = ARGB.120 执行 Graphics.FillRectangle() 时,您只是在其上叠加了另一层 ARGB.120 颜色,这将使其进一步变暗,因为颜色级别已更改。

因此,当您在第一次调用工具提示后单击工具提示之外时,您可能需要处理工具提示对象(或 e.Graphics 对象,如果这不影响应用程序的其他部分)并每隔一段时间创建新的工具提示对象将鼠标悬停在控件上的时间。


查看完整回答
反对 回复 2021-10-31
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

需要告诉 Windows 需要重新绘制弹出窗口下方的窗口。这是通过“分层窗口”样式完成的。通过分层,内容以 z 顺序绘制,透明度混合工作。如果没有分层,只有顶部窗口会被发送重绘,并且它会在 DC 屏幕缓冲区中无意义的剩余数据之上进行绘制。

您可以尝试p/invokingSetLayeredWindowAttributes

我强烈建议阅读有关分层 Windows 的 MSDN 文档: 这里这里


查看完整回答
反对 回复 2021-10-31
  • 3 回答
  • 0 关注
  • 333 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信