C# WinForms,半透明背景的ToolTip

ere*_*ren 3 .net c# winforms

我正在开发这个小型 WinForm 应用程序,并决定使用带有半透明背景的自定义绘制工具提示。因此,我开始将OwnerDrawToolTip 上的属性设置为,为和事件True创建事件处理程序(请参阅下面的示例代码。注释版本也不起作用)。DrawPopup

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));
}
Run Code Online (Sandbox Code Playgroud)

现在,当第一次显示特定控件的工具提示时,一切都会按预期进行。请参见下图(400x400 工具提示,半透明红色背景)。

在此输入图像描述

但是,当我第二次将鼠标悬停在同一控件上时,工具提示会失去半透明度。参见下图。为什么会这样?

在此输入图像描述

ere*_*ren 5

感谢大家的帮助。我很确定 Ben Voigts 的回答或 Jimis 的评论也可以以某种方式解决这个问题(我稍后会尝试它们,如果我能够利用它们,我会更新答案)。

我的解决方案基于 Hans Passant 的第一条评论,他建议Graphics.CopyFromScreen()Popup事件处理程序(toolTipDay_Popup)中使用,以捕获工具提示下方的图像,然后在Draw事件处理程序(toolTipDay_Draw)中我刚刚绘制了捕获的图像。

(Hans Passant 指出,不同的 DPI 缩放存在问题,但这可以通过 Farshid T 在如何获取 Windows 显示设置?中的回答来解决,我没有将其包含在下面的代码中)。

所以我现在使用的解决方案如下:

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));
}
Run Code Online (Sandbox Code Playgroud)