【问题标题】:RichTextBox not showing the textRichTextBox 不显示文本
【发布时间】:2017-06-01 05:53:29
【问题描述】:

我正在尝试从 RichTextBox 创建位图并将其设置为面板的背景图像,但不幸的是没有显示文本。

Bitmap l_bitmap = new Bitmap(m_control.Width, m_control.Height);
m_control.DrawToBitmap(l_bitmap, new Rectangle(0, 0, l_bitmap.Width, l_bitmap.Height));
m_panel.BackgroundImage = l_bitmap;
m_panel.Refresh();

m_control 是我的 RichTextBox。调试时,可以看到控件包含我写的文本,但位图只显示一个空的 RichTextBox。

我对其他类型的控件(按钮、复选框、文本框...)使用相同的代码。文本显示没有问题。

【问题讨论】:

  • 工具箱中有几个控件不支持 DrawToBitmap(),WebBrowser 和 RichTextBox 不支持。他们不这样做是有充分理由的,如果你不告诉我们为什么这个非常不寻常的代码对你很重要,那么这里任何人提出的替代方案也很有可能无法完成工作。
  • 我正在尝试创建一种 GUI 设计器,其中用户(就像在 Visual Studio 中一样)在预览屏幕中拖放控件并更改它们的属性。为此,我创建了一个定义了控件和面板的类。我正在代码中创建控件,更改其属性,为其创建位图并将该位图设置为面板的背景图像。
  • 根据an answer here,有一个更新版本的RichTextBox 支持DrawToBitmap。也许你可以调查一下。

标签: c# richtextbox


【解决方案1】:

您正试图从控件创建位图。你放在那里的文本不是控件,所以它不会费心把它当作位图。尝试从屏幕创建图片(如屏幕截图)。

例子:

Graphics gr = Graphics.FromImage(l_bitmap);
gr.CopyFromScreen(m_control.PointToScreen(Point.Empty),  point.Empty, m_control.Size);

这将从您给定的点生成位图。这将额外显示文本。

编辑


也许您可以改用它。除了你的想法,我只是在我的面板上贴了一个标签。 (L 代表标签,P 代表面板)

如您所见,标签为空,因为我清除了 Text 属性。现在,当您单击面板下方的按钮之一时,它将更新label.Text 属性,并且将显示您授予控制权的文本。

这里有一些例子:

如您所见,标签显示控件的名称。如您在我的源代码中所见,完全自定义:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

    }

    public RichTextBox tmpRtf = new RichTextBox();

    //Poor button name incoming...
    private void button1_Click(object sender, EventArgs e)
    {
        if (tmpRtf == null)
            tmpRtf = new RichTextBox();

        //You can add any text here and it will be shown on the label.
        this.tmpRtf.Text = "Richtextbox";
        this.UpdatePanel(this.tmpRtf);
    }

    //Custom method to update the panel for any control. Can pobably be done way better than this, but hey.
    private void UpdatePanel(object pControl)
    {
        //Checks if control is a rtf
        if(pControl is RichTextBox)
        {
            //This is your code! Ay.
            Bitmap l_bitmap = new Bitmap(this.panel1.Width / 2, this.panel1.Height / 2);
            (pControl as RichTextBox).DrawToBitmap(l_bitmap, new Rectangle(0, 0, l_bitmap.Width, l_bitmap.Height));
            this.tmpRtf.BackColor = Color.LightGray;

            this.panel1.BackgroundImage = l_bitmap;
            this.panel1.BackgroundImageLayout = ImageLayout.Center;

            this.labelControlName.Text = this.tmpRtf.Text;

            this.panel1.Refresh();
        }
    }
}

无法在未可视化的控件上显示文本。但是你可以建立一个解决方法!或者,您可以简单地在其上创建控件,而不是拍照,这也将显示文本,也许用户可以对其进行测试(例如,单击按钮,查看控件行为)。

希望这能激发您的灵感,因为总有更多的方法可以完成。

【讨论】:

  • 控件不在屏幕上。我只是在代码中创建它,添加文本,尝试从中获取位图,以便将其设置为面板的背景图像(在屏幕上)。
  • 哇哦。解释你想要达到的目标,这样也许我们可以更好地理解这一点。因为,这听起来不是解决您问题的最佳方法。
  • 我正在尝试创建一种 GUI 设计器,其中用户(就像在 Visual Studio 中一样)在预览屏幕中拖放控件并更改它们的属性。为此,我创建了一个定义了控件和面板的类。我正在代码中创建控件,更改其属性,为其创建位图并将该位图设置为面板的背景图像。正如我所说,该代码适用于所有其他控件,但不适用于 RichTextBox。
  • 是否需要在其上显示文本?为什么不给 Panel 一个文本值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
相关资源
最近更新 更多