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()。请注意,清晰(透明)使窗体变黑,因为它试图使父对象发光,但由于没有,因此结果为黑色。。