我需要在Windows窗體上以豐富格式編寫一行文本。我怎樣才能做到這一點?如何在Winform上以豐富格式繪製字符串?
回答
如果沒有豐富的文本框,那麼你就需要使用油漆GDI +的文本。檢查it是否有幫助。
將RichTextBox控件設置爲只讀是否會執行您所需的操作?
RichTextBox在我的情況下是不允許的,我需要正確繪製字符串 – 2011-03-22 11:39:06
然後,您必須使用GDI +並手動繪製字符串。 http://msdn.microsoft.com/en-us/library/aa984365(VS.71).aspx – 2011-03-22 11:51:16
您必須將字符串拆分爲具有相同格式的「塊」並繪製每個「塊」。
使用Graphics.MeasureString計算位置,並使用Graphics.DrawString進行最終繪製。
簡單的示例代碼(沒有解決字包木窗,圖片等):
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
this.Paint += new PaintEventHandler(Form1_Paint);
this.SizeChanged += new EventHandler(Form1_SizeChanged);
}
void Form1_SizeChanged(object sender, EventArgs e) {
this.Invalidate();
}
public class RichText {
public Font Font { get; set; }
public Color? TextColor { get; set; }
public string Text { get; set; }
public RichText() { }
public RichText(string text) {
this.Text = text;
}
public RichText(string text, Font font) : this(text) {
this.Font = font;
}
public RichText(string text, Color textColor) : this(text) {
this.TextColor = textColor;
}
public RichText(string text, Color textColor, Font font) : this(text, textColor) {
this.Font = font;
}
}
void Form1_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.")
, new RichText("Default green text.", Color.Green)
, new RichText("Regular arial 8.", arial_8)
, new RichText("Bold arial 8.", new Font(arial_8, FontStyle.Bold))
, new RichText("Regular webdings 10.", webdings_10)
, new RichText("Regular blue webdings 10.", Color.Blue, webdings_10)
};
var g = e.Graphics;
Point textPosition = new Point(0, 0);
int maxWidth = this.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)) {
var rslt_Measure = g.MeasureString(text, font);
if (rslt_Measure.Width + textPosition.X > maxWidth) {
// this code does not solve word-wraping
var rslt_Line = g.MeasureString("\r\n", font);
Point tmpTextPosition = new Point(0, textPosition.Y + (int)rslt_Line.Height);
g.DrawString(text, font, brush, tmpTextPosition);
var newPosition = tmpTextPosition;
newPosition.X += (int)rslt_Measure.Width;
textPosition = newPosition;
}
else {
g.DrawString(text, font, brush, textPosition);
var newPosition = textPosition;
newPosition.X += (int)rslt_Measure.Width;
textPosition = newPosition;
}
}
}
}
}
編輯:
如果你想處理RTF也許這個鏈接將是有益的:
謝謝!這似乎很有幫助,我會嘗試使用您的代碼。但問題是,最初我有一個純RTF格式的字符串 – 2011-03-22 13:30:33
@Anton Semenov:我添加了一些用於RTF處理的鏈接。 – TcKs 2011-03-22 14:13:46
謝謝!鏈接非常有趣 – 2011-03-22 15:51:07
除了第三文化孩子代碼,以下段將解決自動換行功能:
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;
}
}
}
}
- 1. 如何在BitmapData上繪製字符串
- 2. 豐富的編輯控件:防止豐富的格式?
- 3. 將富文本格式字符串複製爲格式文本
- 4. 如何使用所有者繪製的豐富編輯控件
- 5. 如何使用Skia或SkiaSharp繪製豐富文本
- 6. 如何在Winform上繪製透明線?
- 7. 如何繪製一個格式爲R的字符串函數
- 8. 如何使用在Linux bash腳本懈怠豐富的格式
- 9. 如何在textarea中顯示豐富的格式化文本
- 10. 如何以豐富的編輯控件打印表格格式的數據
- 11. 如何將豐富的模式面板
- 12. 在C#網頁上繪製字符串
- 13. 在jpanel上繪製字符串
- 14. 在橢圓上繪製字符串
- 15. Openlayers - 在地圖上繪製字符串
- 16. 在JPanel上繪製字符串
- 17. 「周」以來字符串可以繪製
- 18. 如何頂級豐富:panelMenu豐富:outputPanel與h:panelGrid?
- 19. 如何在Java上的畫布上繪製字符串數組?
- 20. 豐富與非豐富的矩陣
- 21. Android如何豐富arraylist
- 22. iOS上的豐富通知
- 23. 豐富:文件上傳ViewExpiredException
- 24. 豐富:modalPanel上隱藏
- 25. C中的豐富數字
- 26. 豐富的壓延字段
- 27. 如何字符串格式
- 28. 如何製作豐富多彩的文字視圖
- 29. 如何在處理中以角度繪製字符串對象?
- 30. 使用工具提示在豐富的散點圖上繪製75000點
你是什麼意思的呈現?有什麼東西阻止你使用標籤? – 2011-03-22 11:28:10
好的,我編輯了問題。我需要簡單地在窗體上編寫富文本 – 2011-03-22 11:31:16