透明的richTextBox

ahm*_*ori 7 .net c# richtextbox winforms

如何让我的richtext框透明
我想要这个因为我试图将文本放在图形图像(这是我的表单的背景)之上.

这就是为什么我希望richTextBox透明,
我使用.NET,c#和windows窗体应用程序

Sha*_*air 7

我知道这个答案很晚,但我希望能帮助其他想要轻松完成任务的人.

首先,在项目中创建一个新的用户控件并为其命名,比如CustomRTB.cs.完成后,打开分部类并更改:

public partial class CustomRTB : UserControl
Run Code Online (Sandbox Code Playgroud)

至:

public partial class CustomRTB : RichTextBox
Run Code Online (Sandbox Code Playgroud)

这将在您打开Design文件时导致错误,因此只需转到Designer.cs文件并删除/注释显示错误的行(不会有超过两行有错误).接下来,将以下内容添加到分部类:

protected override CreateParams CreateParams
{
    get
    {
        //This makes the control's background transparent
        CreateParams CP = base.CreateParams;
        CP.ExStyle |= 0x20;
        return CP;
    }
}
Run Code Online (Sandbox Code Playgroud)

这个类现在应该是这样的:

public partial class CustomRTB : RichTextBox
{
    public CustomRTB()
    {
        InitializeComponent();
    }

    protected override CreateParams CreateParams
    {
        get
        {
            //This makes the control's background transparent
            CreateParams CP = base.CreateParams;
            CP.ExStyle |= 0x20;
            return CP;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在构建您的解决方案,您将能够在表单中使用该控件.此控件将完全透明,您将无法调整透明度.通过更改此代码中的第一行,您还可以创建除richtextbox之外的其他透明控件.希望这可以帮助 :)

编辑:

上述控件的问题在于它只能用于以编程方式显示文本,因为在运行或调试应用程序时编辑是有问题的(正如@nevelis在下面的注释中解释的那样).但是,有一个简单的解决方法:

首先,在项目中创建另一个用户控件并将其命名为TranslucentPanel.cs(是的,它是一个面板,它将是半透明的,其不透明度可以通过编程方式控制).现在打开分部类并将其修改为:

public partial class TranslucentPanel : Panel
{
    public TranslucentPanel()
    {
        InitializeComponent();
        SetStyle(ControlStyles.SupportsTransparentBackColor |
             ControlStyles.OptimizedDoubleBuffer |
             ControlStyles.AllPaintingInWmPaint |
             ControlStyles.ResizeRedraw |
             ControlStyles.UserPaint, true);
        BackColor = Color.Transparent;
    }
}
Run Code Online (Sandbox Code Playgroud)

只需注释掉引发它的Designer.cs文件中的行,就必须处理构建项目时出现的错误.完成后,再次构建项目,半透明面板将像以前一样出现在工具箱中.使用此面板作为透明richtextbox的父控件,即将面板放在表单上并将RTB放在其中.您还可以将BorderStyle属性设置为None,以从UI中删除任何RTB跟踪.

您还可以通过在程序中使用其BackColor属性来控制半透明面板的不透明度:

translucentPanel1.BackColor = Color.FromArgb(50, 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)

更改上面传递的参数将允许您控制面板的不透明度和颜色.

此解决方法不仅可以解决透明RTB的光标和滚动问题,还可以解决您创建的任何其他透明控件的问题.

  • 这对于滚动或编辑来说效果不太好。0x20 或 WS_EX_TRANSPARENT 表示控件不会被重新绘制,除非其父窗口被绘制。如果你打字,光标会在每个字符后留下,如果你滚动它就会变成一团模糊的东西:( (2认同)

Mar*_*all 5

在WinForms控件中没有真正的透明度.透明模式继承其父级的默认背景.我过去解决它OnPaintGraphics.DrawString方法是使用该事件,然后使用该方法将文本定位在我想要的位置.