C# 具有透明度的分层图形
只是做一个小游戏,想把我的暂停菜单放在上面 计时器负责游戏循环。暂停时,它会调用一个单独的函数来绘制暂停菜单。现在我正在画一个小的中心矩形。但是,矩形不是透明的,即使我将其清除为透明 我有办法做到吗 下面是我的游戏循环的代码,它更新状态并基于状态绘制。如您所见,当游戏暂停时,它会调用一个单独的方法C# 具有透明度的分层图形,c#,.net,transparency,gdi+,drawstring,C#,.net,Transparency,Gdi+,Drawstring,只是做一个小游戏,想把我的暂停菜单放在上面 计时器负责游戏循环。暂停时,它会调用一个单独的函数来绘制暂停菜单。现在我正在画一个小的中心矩形。但是,矩形不是透明的,即使我将其清除为透明 我有办法做到吗 下面是我的游戏循环的代码,它更新状态并基于状态绘制。如您所见,当游戏暂停时,它会调用一个单独的方法 private void tmrGameLoop_Tick(object sender, EventArgs e) { if (Paused) {
private void tmrGameLoop_Tick(object sender, EventArgs e)
{
if (Paused)
{
Pause();
return;
}
using (Graphics gr = CreateGraphics())
{
using (BufferedGraphicsContext bgc = new BufferedGraphicsContext())
{
using (BufferedGraphics bg = bgc.Allocate(gr, DisplayRectangle))
{
bg.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
bg.Graphics.Clear(Color.Transparent);
// draw the stuff
bg.Render();
}
}
}
}
这是Pause()。它按预期绘制在顶部,但因为它是一个单独的图形对象,所以它绘制在顶部,并不像我预期的那样透明
private void Pause()
{
using (Graphics gr = CreateGraphics())
{
using (BufferedGraphicsContext bgc = new BufferedGraphicsContext())
{
using (BufferedGraphics bg = bgc.Allocate(gr, m_menu))
{
bg.Graphics.Clear(Color.Transparent);
// draw pause menu
bg.Render();
}
}
}
}
有什么方法可以做到透明吗?你似乎认为
Graphics.Clear(Color.transparent)
可以创建一个透明的画布
好的,只有将其应用于位图
时,这才是正确的。对于控件
,它让父控件的背景色
透亮,对于没有父控件的窗体
,它使窗体
看起来黑色
它还重置图形对象,该对象也可能不是您想要的
下面是如何在表单上绘制半透明覆盖:
using (SolidBrush br = new SolidBrush(Color.FromArgb(192, Color.Silver)))
g.FillRectangle(br, ClientRectangle);
StringFormat fmt = new StringFormat()
{ Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center };
using (SolidBrush br = new SolidBrush(Color.FromArgb(128, Color.Tomato)))
using (Font f = new Font("Consolas", 40f))
g.DrawString("PAUSED",f, br, ClientRectangle, fmt);
结果:
使用您的数字作为覆盖层和(可能)文本的alpha值
通常要使用的Graphics
对象应该是Form
的Paint
事件中的e.Graphics
但是,由于您似乎是通过计时器来完成所有绘图。勾选,您可能不需要使用CreateGraphics
来创建它,这通常是不推荐的,因为结果是非持久性的。您似乎相信Graphics.Clear(Color.Transparent)
会创建一个透明的画布
好的,只有将其应用于位图
时,这才是正确的。对于控件
,它让父控件的背景色
透亮,对于没有父控件的窗体
,它使窗体
看起来黑色
它还重置图形对象,该对象也可能不是您想要的
下面是如何在表单上绘制半透明覆盖:
using (SolidBrush br = new SolidBrush(Color.FromArgb(192, Color.Silver)))
g.FillRectangle(br, ClientRectangle);
StringFormat fmt = new StringFormat()
{ Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center };
using (SolidBrush br = new SolidBrush(Color.FromArgb(128, Color.Tomato)))
using (Font f = new Font("Consolas", 40f))
g.DrawString("PAUSED",f, br, ClientRectangle, fmt);
结果:
使用您的数字作为覆盖层和(可能)文本的alpha值
通常要使用的Graphics
对象应该是Form
的Paint
事件中的e.Graphics
但是,由于您似乎是通过计时器完成所有绘图。勾选,您可以使用CreateGraphics
创建它,这通常是不推荐的,因为结果是非持久性的。显示您拥有的代码!我添加的代码中没有我实际绘制的所有部分,因为这是不相关的。我试过用各种方式来传递图形对象,但都没有成功。那么,你只是在从中绘制吗?对它没有其他控制吗?你知道你永远不应该使用CreateGrpahics,因为它是无效的,那么它所绘制的图形是非持久的!?我真的不知道你在说什么。我是一个彻头彻尾的傻瓜。好吧,回答我的质疑将是一个好的开始:-)-至于其他几点:只要你是从滴答声中吸取教训,持续性实际上可能并不重要。。但是如果看不到绘制图纸的代码,我们怎么能提供帮助呢?至少显示bg.Draw()。请注意,清晰(透明)使窗体变为黑色,因为它试图使父窗体发光,但由于没有父窗体,因此结果为黑色..显示您拥有的代码!我添加的代码中没有我实际绘制的所有部分,因为这是不相关的。我试过用各种方式来传递图形对象,但都没有成功。那么,你只是在从中绘制吗?对它没有其他控制吗?你知道你永远不应该使用CreateGrpahics,因为它是无效的,那么它所绘制的图形是非持久的!?我真的不知道你在说什么。我是一个彻头彻尾的傻瓜。好吧,回答我的质疑将是一个好的开始:-)-至于其他几点:只要你是从滴答声中吸取教训,持续性实际上可能并不重要。。但是如果看不到绘制图纸的代码,我们怎么能提供帮助呢?至少显示bg.Draw()。请注意,清晰(透明)使窗体变黑,因为它试图使父对象发光,但由于没有,因此结果为黑色。。