Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在winform上以丰富格式绘制字符串?_C#_.net_Winforms_Drawstring_Richtext - Fatal编程技术网

C# 如何在winform上以丰富格式绘制字符串?

C# 如何在winform上以丰富格式绘制字符串?,c#,.net,winforms,drawstring,richtext,C#,.net,Winforms,Drawstring,Richtext,我需要在windows窗体上以富格式写一行文本。如何实现这一点?RichTextBox控件是否设置为readonly以满足您的需要?您必须将字符串拆分为具有相同格式的“块”,并绘制每个“块” 使用Graphics.MeasureString计算位置,使用Graphics.DrawString进行最终绘制 简单示例代码(不解决文字包装、图像等问题): 编辑: 如果您想要处理RTF,此链接可能有用: 如果不是富文本框,则需要使用GDI+绘制文本。检查是否有帮助。事实证明,在图形上下文中绘制R

我需要在windows窗体上以富格式写一行文本。如何实现这一点?

RichTextBox控件是否设置为readonly以满足您的需要?

您必须将字符串拆分为具有相同格式的“块”,并绘制每个“块”

使用Graphics.MeasureString计算位置,使用Graphics.DrawString进行最终绘制

简单示例代码(不解决文字包装、图像等问题):

编辑:

如果您想要处理RTF,此链接可能有用:


    • 如果不是富文本框,则需要使用GDI+绘制文本。检查是否有帮助。

      事实证明,在图形上下文中绘制RTF字符串没有任何标准方法。所以我有两种行动方式:

    • 手动解析rtf字符串。将其划分为块,并利用TcKs的答案中所示的图形上下文
    • 第二种方法是某种变通方法,但它完全可以随时使用。看或

    • 谢谢大家的帮助

      除了TcKs代码外,以下部分将解决自动换行功能:

              private void pictureBox2_Paint(object sender, PaintEventArgs e)
          {
              var arial_8 = new Font("Arial", 8);
              var webdings_10 = new Font("Webdings", 10);
      
              var richTexts = new RichText[] {
              new RichText("Default text and this is the lengthy string to check the display. One more line to verify again")
              , new RichText("Default green text. this is the lengthy string to check the display. One more line to verify again", Color.Green)
              , new RichText("Regular arial 8.", arial_8)
              , new RichText("Bold arial 8.", new Font(arial_8, FontStyle.Bold))
              };
      
              var g = e.Graphics;
      
              Point textPosition = new Point(0, 0);
              int maxWidth = this.pictureBox2.ClientSize.Width;
              foreach (var richText in richTexts)
              {
                  var text = richText.Text;
                  if (string.IsNullOrEmpty(text)) { continue; }
      
                  var font = richText.Font ?? Control.DefaultFont;
                  var textColor = richText.TextColor ?? Control.DefaultForeColor;
      
                  using (var brush = new SolidBrush(textColor))
                  {
                      string[] strs = text.Split(new string[] { " " }, StringSplitOptions.None);
                      int fontheight = (int)g.MeasureString("\r\n", font).Height;
                      foreach (string val in strs)
                      {
                          var measure = g.MeasureString(val, font);
                          if (measure.Width + textPosition.X > maxWidth)
                          {
                              var newPosition = textPosition;
                              newPosition.X = 0;
                              newPosition.Y = textPosition.Y + fontheight;
                              textPosition = newPosition;
                          }
      
                          g.DrawString(val, font, brush, textPosition);
      
                          var nextposition = textPosition;
                          nextposition.X = textPosition.X + (int)measure.Width;
                          textPosition = nextposition;
      
                      }
                  }
              }
          }
      

      你说的渲染是什么意思?有什么东西阻止你使用标签吗?好的,我已经编辑了这个问题。我需要简单地在formRichTextBox上写富文本在我的情况下是不允许的,我需要精确地绘制字符串,然后您必须使用GDI+并手动绘制字符串。非常感谢。这似乎是有帮助的,我会尝试使用您的代码。但问题是,最初我有一个纯RTF格式的字符串format@Anton塞门诺夫:我添加了一些RTF处理的链接。谢谢!链接非常有趣两个链接都是死的
              private void pictureBox2_Paint(object sender, PaintEventArgs e)
          {
              var arial_8 = new Font("Arial", 8);
              var webdings_10 = new Font("Webdings", 10);
      
              var richTexts = new RichText[] {
              new RichText("Default text and this is the lengthy string to check the display. One more line to verify again")
              , new RichText("Default green text. this is the lengthy string to check the display. One more line to verify again", Color.Green)
              , new RichText("Regular arial 8.", arial_8)
              , new RichText("Bold arial 8.", new Font(arial_8, FontStyle.Bold))
              };
      
              var g = e.Graphics;
      
              Point textPosition = new Point(0, 0);
              int maxWidth = this.pictureBox2.ClientSize.Width;
              foreach (var richText in richTexts)
              {
                  var text = richText.Text;
                  if (string.IsNullOrEmpty(text)) { continue; }
      
                  var font = richText.Font ?? Control.DefaultFont;
                  var textColor = richText.TextColor ?? Control.DefaultForeColor;
      
                  using (var brush = new SolidBrush(textColor))
                  {
                      string[] strs = text.Split(new string[] { " " }, StringSplitOptions.None);
                      int fontheight = (int)g.MeasureString("\r\n", font).Height;
                      foreach (string val in strs)
                      {
                          var measure = g.MeasureString(val, font);
                          if (measure.Width + textPosition.X > maxWidth)
                          {
                              var newPosition = textPosition;
                              newPosition.X = 0;
                              newPosition.Y = textPosition.Y + fontheight;
                              textPosition = newPosition;
                          }
      
                          g.DrawString(val, font, brush, textPosition);
      
                          var nextposition = textPosition;
                          nextposition.X = textPosition.X + (int)measure.Width;
                          textPosition = nextposition;
      
                      }
                  }
              }
          }