我正在开发这个小型 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 对象,如果这不影响应用程序的其他部分)并每隔一段时间创建新的工具提示对象将鼠标悬停在控件上的时间。
慕无忌1623718
TA贡献1744条经验 获得超4个赞
需要告诉 Windows 需要重新绘制弹出窗口下方的窗口。这是通过“分层窗口”样式完成的。通过分层,内容以 z 顺序绘制,透明度混合工作。如果没有分层,只有顶部窗口会被发送重绘,并且它会在 DC 屏幕缓冲区中无意义的剩余数据之上进行绘制。
您可以尝试p/invokingSetLayeredWindowAttributes
我强烈建议阅读有关分层 Windows 的 MSDN 文档: 这里和这里
- 3 回答
- 0 关注
- 333 浏览
添加回答
举报
0/150
提交
取消