如何让整个游戏窗口透明?

时间:2015-04-16 05:15:42

标签: c# xna

我正在为暗黑破坏神3做一点覆盖(仅供个人使用!) 我只想在屏幕中间绘制一个文本字符串(我们稍后会看到字体)。 但是使用XNA我找不到如何将背景设置为透明... 到目前为止我的代码是:

        GraphicsDevice.Clear(new Color(0, 0, 0, 255));
        spriteBatch.Begin();
        spriteBatch.DrawString(font, this.TestToShow, new Vector2(23, 23), Color.White);
        spriteBatch.End();

所以我只需要一件事:让这个黑色透明!

1 个答案:

答案 0 :(得分:3)

您似乎不明白GraphicsDevice.Clear(Color)的作用。 XNA打开一个Windows窗口并使用DirectX绘制它。

GraphicsDevice.Clear(Color)清除使用DirectX绘制的缓冲区,但与窗口没有任何关系。 要使窗口透明,您必须修改底层窗口。

为此,您必须首先添加对System.WIndows.Forms和System.Drawing的引用。

在Game1类的构造函数中,执行以下操作:

public Game1()
{
    graphics = new GraphicsDeviceManager(this);
    Content.RootDirectory = "Content";
    IntPtr hWnd = Window.Handle;
    System.Windows.Forms.Control ctrl = System.Windows.Forms.Control.FromHandle(hWnd);
    System.Windows.Forms.Form form = ctrl.FindForm();
    form.TransparencyKey = System.Drawing.Color.Black;
}

让我们逐行说明:

嗯,前两个是自动生成的,我们不关心这些。

IntPtr hWnd = Window.Handle;

此行为您提供指向Windows中注册的底层窗口的指针。

System.Windows.Forms.Control ctrl = System.Windows.Forms.Control.FromHandle(hWnd);

此行获取给定窗口中的WindowsForms - Control

System.Windows.Forms.Form form = ctrl.FindForm();

此行显示控件所属的表单。

form.TransparencyKey = System.Drawing.Color.Black;

最后一行设置了键 - Color,用于标识一个单独的Color - 值根本不绘制。我使用了Black,但您也可以选择CornflowerBlue

这使您的窗口内部透明Color。我建议您选择与Color明确相同的Color

有两点需要注意:

  1. 最佳做法是对Form进行缓存,以便您可以随时随地设置TransparencyKey

  2. 您也可以通过这种方式使Window无边框:

  3. form.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;

    希望我能提供帮助。

    编辑: 我刚刚意识到这是几年前被问过的,没有答案。如果您偶然发现它,请随意使用它。