猿问

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

我正在开发这个小型 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 工具提示,半透明红色背景)。

但是当我第二次将鼠标悬停在同一个控件上时,工具提示失去了它的半透明性。见下图。为什么呢?


http://img4.mukewang.com/617e7eb100013ddb06270554.jpg

郎朗坤
浏览 334回答 3
3回答

月关宝盒

第一次将鼠标悬停在控件上时,将使用透明色 (ARGB.120) 创建一个新的工具提示实例。当您在工具提示外单击时,是完全释放工具提示对象还是您只是将实例设置为不可见?当您第二次将鼠标悬停在实例上时,如果旧的工具提示对象没有被释放,则有可能再次调用相同的对象。因此,现在当您在现有工具提示上使用 color = ARGB.120 执行 Graphics.FillRectangle() 时,您只是在其上叠加了另一层 ARGB.120 颜色,这将使其进一步变暗,因为颜色级别已更改。因此,当您在第一次调用工具提示后单击工具提示之外时,您可能需要处理工具提示对象(或 e.Graphics 对象,如果这不影响应用程序的其他部分)并每隔一段时间创建新的工具提示对象将鼠标悬停在控件上的时间。

慕无忌1623718

需要告诉 Windows 需要重新绘制弹出窗口下方的窗口。这是通过“分层窗口”样式完成的。通过分层,内容以 z 顺序绘制,透明度混合工作。如果没有分层,只有顶部窗口会被发送重绘,并且它会在 DC 屏幕缓冲区中无意义的剩余数据之上进行绘制。您可以尝试p/invokingSetLayeredWindowAttributes我强烈建议阅读有关分层 Windows 的 MSDN 文档: 这里和这里
随时随地看视频慕课网APP
我要回答