我尝试将表单的不透明度设置为50%,然后在其上绘制字符串。似乎我在其上绘制的字符串也具有50%的不透明度。如何绘制非透明字符串,但让表单背景透出50%?
如果可能的话,我也愿意在WPF中实现此操作,但我需要明确的说明或示例项目,因为我以前从未这样做过。
澄清一下,我希望表单背景是黑色的,不透明度为80%,透出底部内容的50%,然后我想在其上绘制文本等并使其看起来100%不透明。
我尝试将表单的不透明度设置为50%,然后在其上绘制字符串。似乎我在其上绘制的字符串也具有50%的不透明度。如何绘制非透明字符串,但让表单背景透出50%?
如果可能的话,我也愿意在WPF中实现此操作,但我需要明确的说明或示例项目,因为我以前从未这样做过。
澄清一下,我希望表单背景是黑色的,不透明度为80%,透出底部内容的50%,然后我想在其上绘制文本等并使其看起来100%不透明。
在WPF中,这非常容易实现:
以下是一个快速示例:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300" AllowsTransparency="True" Background="#AAFFFFFF" WindowStyle="None">
<Grid>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="20" FontWeight="Bold">Hello World!</TextBlock>
</Grid>
显然,由于您已禁用了标准的Windows窗口装饰,您需要提供自己的按钮来关闭/最小化/最大化/拖动窗口。您可以自己很容易地实现这个功能,或者您可以考虑购买 Blendables 这样的工具,它附带了一个“无边框窗口”控件,您可以使用。
我想到的一个解决方法是使用两个重叠的窗口。将底部窗口渲染为50%的不透明度,然后在另一个重叠的窗口上绘制文本。如果您正在执行标签类型显示,这可能很简单,但如果您需要大量用户输入,则可能会变得复杂,并且可能需要通过“主”或“底部”窗口进行过滤。
所以,我让它工作了,但有点棘手。两个窗口的解决方案似乎很有前途,直到我发现当您甚至隐式地引用.Net或Win32时,它会做一些奇怪的自动父级控制。可能与消息被泵送的方式有关。主父级控件持有应用程序消息泵和猜测是隐式的父级控件......
我尝试了许多解决方法,但下面的计时器效果最好。无论如何,这可能是更好地解决它的线索......
// 主窗口或透明窗口。请注意,它只是设置并运行计时器。 using System; using System.Windows.Forms; namespace TransparencyPlusNottransparentTest { public partial class FormMain : Form { public FormMain() { InitializeComponent(); }
private void timer1_Tick(object sender, EventArgs e)
{
Program.ShowNontransparency();
}
}
}
// 这是“顶部”或不透明的窗口。请注意,它在透明背景上进行所有者绘制。设计时设置也没有边框等。 using System.Drawing; using System.Windows.Forms;
namespace TransparencyPlusNottransparentTest { public partial class FormTop : Form { public FormTop() { InitializeComponent(); BackColor = Color.Firebrick; TransparencyKey = Color.Firebrick; }
private void FormTop_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawString("Hello Whirrled!", new Font("Tahoma", 14f), Brushes.Black, 10f, 10f );
}
}
}
// 这个程序的控制。它实例化了两个窗口, // 将主窗口设置为主应用程序窗口,并托管公共 // hacky 方法来强制非透明窗口显示在顶部 // 并偏移,以免遮挡主窗口的顶部。 using System; using System.Drawing; using System.Windows.Forms;
namespace TransparencyPlusNottransparentTest { static class Program { private static FormMain _formMain; private static FormTop _formTop; private const int XY_OFFSET = 30;
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
_formTop = new FormTop();
_formTop.Show(null);
_formMain = new FormMain();
Application.Run(_formMain);
}
public static void ShowNontransparency()
{
_formTop.Location =
new Point(
_formMain.Location.X + XY_OFFSET,
_formMain.Location.Y + XY_OFFSET);
_formTop.BringToFront();
}
}
}
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
那么你可以将背景颜色设置为Color.Transparent。
希望这可以帮到你。
我假设这是一个WinForms项目,尽管你说过你愿意尝试WPF。
让我换个思路:有没有什么特别的原因你不能只是“假装”一下呢?比如,在PhotoShop Elements或Paint Shop Pro中制作一个位图,将其设置为WinForm的整个背景,然后在该位图上直接“绘制”控件将放置在其上的部分透明区域?