C# 我如何使我的表单透明,但我在表单上绘制的内容却不透明?

C# 我如何使我的表单透明,但我在表单上绘制的内容却不透明?,c#,wpf,winforms,transparency,C#,Wpf,Winforms,Transparency,我试着将表格的不透明度设置为50%,然后在上面画一个字符串。我在上面画的字符串似乎也有50%的不透明度。我如何画一个不透明的字符串,但让窗体背景显示50% 如果可能的话,我也愿意在WPF中这样做,但我需要明确的指示或一个示例项目,因为我以前从未这样做过 为了澄清,我希望表单背景是一个80%不透明的黑色,然后我想画文本,等等。。并使其显示为100%不透明。您可以使用透明键 在ControlStyles枚举中有一个名为SupportsTransparentBackColor的值。在窗体构造函数中运行

我试着将表格的不透明度设置为50%,然后在上面画一个字符串。我在上面画的字符串似乎也有50%的不透明度。我如何画一个不透明的字符串,但让窗体背景显示50%

如果可能的话,我也愿意在WPF中这样做,但我需要明确的指示或一个示例项目,因为我以前从未这样做过


为了澄清,我希望表单背景是一个80%不透明的黑色,然后我想画文本,等等。。并使其显示为100%不透明。

您可以使用透明键


在ControlStyles枚举中有一个名为SupportsTransparentBackColor的值。在窗体构造函数中运行以下命令:

SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
然后可以将背景色设置为color.Transparent


希望这有帮助。

使用透明键将窗口渲染为透明。创建一个带有背景色的空面板,并为其提供所需的不透明度

然后在一个单独的容器/面板中创建所有子对象(它本身是上面创建的半透明面板的同级对象),并使其完全不渲染背景


这应该给你一个半透明的背景效果,但是可以看到控件。

这在WPF中很容易做到:

  • 在窗口上设置WindowStyle=“None”(注意:这是必需的,不能使用透明和标准的windows chrome)
  • 在窗口上设置AllowTransparency=“True”
  • 使用具有透明度的笔刷在窗口上设置背景,例如Background=“#AAFFFFFF”
  • 下面是一个快速示例:

    <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 chrome,您需要提供自己的按钮来关闭/最小化/最大化/拖动窗口。您可以自己轻松地完成这项工作,也可以考虑购买类似的产品,该产品带有一个“无铬窗口”控件,您可以使用。

    在winforms中,MSDN说:

    “不透明度”属性使您能够 指定的透明度级别 窗体及其控件。当这 属性设置为小于的值 100%(1.00),整个表格, 包括边界在内,它的作用更大 透明的


    因此,设置“不透明度”的窗体的任何子控件都将更改其不透明度。如果您想在单个控件上实现不同级别的不透明度,则必须切换到WPF。

    我假设这是一个WinForms项目,尽管您说过您愿意尝试WPF


    让我换个角度思考:有什么特别的原因你不能假装吗?如中所示,在PhotoShop Elements或Paint Shop Pro或其他类似工具中制作位图,将其设置为WinForm的整个背景,只需绘制部分透明区域,控件将放置在该位图上?

    想到的一个解决方法是使用两个窗口重叠。以50%不透明度渲染“底部”窗口,然后所有者将文本绘制到覆盖在另一个窗口顶部的窗口。如果您正在进行标签类型显示,这可能很简单,但如果您需要大量的用户输入,然后可能需要过滤到“主”或“底部”窗口,则可能会很快变得复杂

    所以,我让它工作,但它有点松鼠。两个窗口的解决方案似乎很有希望,直到我发现.Net或Win32做了一些奇怪的自动育儿的事情,甚至当你隐式引用它的时候。不过,这可能与信息传递的方式有关。主父级保存应用程序消息pump,int guess隐式地是父级

    我尝试了一系列的解决方法,但是下面这个计时器的效果最好。在任何情况下,这可能是一个线索,做得更好


    }

    // the "main" or transparent window. Notice it just sets and runs the timer 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();
        }
    }
    
        private void FormTop_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawString("Hello Whirrled!", new Font("Tahoma", 14f), Brushes.Black, 10f, 10f );
        }
    }
    
    //“顶部”或非透明窗口。请注意,它并不是所有者使用的 //透明背景。设计时设置也包括无边框等。 使用系统图; 使用System.Windows.Forms

    命名空间透明PlusNotTransparentTest { 公共部分类FormTop:Form { 公共表格 { 初始化组件(); 背景色=颜色。耐火砖; 透明键=颜色。耐火砖; }

    // the "main" or transparent window. Notice it just sets and runs the timer 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();
        }
    }
    
        private void FormTop_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawString("Hello Whirrled!", new Font("Tahoma", 14f), Brushes.Black, 10f, 10f );
        }
    }
    
    }

    // the "main" or transparent window. Notice it just sets and runs the timer 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();
        }
    }
    
        private void FormTop_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawString("Hello Whirrled!", new Font("Tahoma", 14f), Brushes.Black, 10f, 10f );
        }
    }
    
    //整个spiel的控制它实例化了两个窗口, //将main设置为主应用程序窗口并承载公共应用程序 //强制不透明窗口显示在顶部的hacky方法 //和偏移,这样就不会遮住主窗口的顶部。 使用制度; 使用系统图; 使用System.Windows.Forms

    命名空间透明PlusNotTransparentTest { 静态类程序 { 私有静态FormMain _FormMain; 专用静态FormTop _FormTop; 私有常量内XY_偏移=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();
        }
    }
    

    }

    这是不一样的,这说明当您绘制此关键点设置为的任何颜色时,它都将显示为透明,这意味着0%不透明(或完全透明,取决于您是否是杯子半满的人)。它不允许您将其设置为50%透明。好的。谢谢您的更新。当然,您是对的。只有当您想使其100%透明时,透明键才会起作用。(我自己也是一个半杯满的人。)嗯,这听起来像是我想要的,但是我得到了一个灰色的框,如果上面画的东西没有显示出来,我就尝试了Color.Transparent和this.BackColor=Color.FromArgb(180,0,0,0);我认为这是行不通的,从MSDN来看:如果为true,控件接受一个alpha分量小于255的背景色来模拟透明度。只有当UserPaint位设置为true且父控件派生自控件时,才会模拟透明度。我猜,由于主窗体没有父控件,所以最后一次失败测试。啊,对不起。我没注意到。我怀疑你的理论是正确的。我只是试了一下 // the "main" or transparent window. Notice it just sets and runs the timer 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();
        }
    }
    
        private void FormTop_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawString("Hello Whirrled!", new Font("Tahoma", 14f), Brushes.Black, 10f, 10f );
        }
    }