2013-05-03 133 views
5

我目前有一個Windows窗體項目,我創建了一個簡單的聊天應用程序。目前聊天輸出到多行文本框,但我想現在增強一點,並添加一些樣式。我希望有一些圖像,可以很好地格式化,也可以在將來使用一些HTML(儘管這不是重要的)。我只是想知道我應該用什麼來達到這個目的。我確實想過更新一個HTML頁面,然後用每條新消息重新加載它,但是這不會給用戶帶來很好的體驗。我也看了richtextbox類,但這似乎有點受限於我所追求的。我希望有人能指出我正確的使用方法。Windows窗體文本框顯示圖像

我想實現類似的東西爲我所用紅色突出顯示:

enter image description here

+1

使用[RichTextBox的](http://msdn.microsoft.com/en-us/library/system.windows。 forms.richtextbox.aspx)。 – 2013-05-03 15:29:27

+1

由於OP說他嘗試了「RichTextBox」並且發現它受到限制,所以並不真正有幫助。你可以添加一些代碼來顯示Joseph如何使用RichTextBox來實現他想要的嗎? – 2013-05-03 15:37:00

+0

WinForms的HTML控件http://stackoverflow.com/questions/3456787/a-good-html-capable-richedit-replacement-for-winforms – Nick 2013-05-03 16:00:16

回答

0

雖然一些其他的評論表明,WPF非常適合於這一點,在現實世界中,它是並不總是可能的或可取的切換。

一個正常的自繪列表框非常適合這個目的。

要創建一個,只需將列表框上的DrawMode設置爲OwnerDrawVariable,例如,

list.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable; 

然後你只需要提供兩個事件處理程序,首先要測量項目(告訴列表框中的項目將有多高定),另一條實際渲染。例如

this.list.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.list_DrawItem); 
this.list.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.list_MeasureItem); 

渲染圖像到列表與GDI +的DrawImage(其中g是圖形context_相當簡單:

Bitmap bmp = Bitmap.FromFile("test.jpg"); 
Rectangle source = new Rectangle(0, 0, bmp.Width, bmp.Height); 
Rectangle dest = source; 
g.DrawImage(bmp, dest, source, GraphicsUnit.Pixel); 

這是一個示例Windows窗體具有所有的所有者繪製的列表框在系統上的字體,產生高度可變的所有者繪製列表項: enter image description here

using System; 
using System.Drawing; 
using System.Windows.Forms; 

namespace Font_Display 
{ 
    public class Test : System.Windows.Forms.Form 
    { 
     private Font head; 
     private System.Windows.Forms.ListBox list; 
     private System.ComponentModel.Container components = null; 

     public Test() 
     { 
      InitializeComponent(); 

      head = new Font("Arial", 10, GraphicsUnit.Pixel); 
     } 

     protected override void Dispose(bool disposing) 
     { 
      if (disposing) { 
       if (components != null) { 
        components.Dispose(); 
       } 
      } 
      base.Dispose(disposing); 
     } 

     #region Windows Form Designer generated code 
     /// <summary> 
     /// Required method for Designer support - do not modify 
     /// the contents of this method with the code editor. 
     /// </summary> 
     private void InitializeComponent() 
     { 
      this.list = new System.Windows.Forms.ListBox(); 
      this.SuspendLayout(); 
      // 
      // list 
      // 
      this.list.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable; 
      this.list.IntegralHeight = false; 
      this.list.Location = new System.Drawing.Point(12, 12); 
      this.list.Name = "list"; 
      this.list.Size = new System.Drawing.Size(604, 323); 
      this.list.TabIndex = 0; 
      this.list.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.list_DrawItem); 
      this.list.MeasureItem += new System.Windows.Forms.MeasureItemEventHandler(this.list_MeasureItem); 
      // 
      // Test 
      // 
      this.AutoScaleBaseSize = new System.Drawing.Size(6, 15); 
      this.ClientSize = new System.Drawing.Size(520, 358); 
      this.Controls.Add(this.list); 
      this.Name = "Test"; 
      this.Text = "Display"; 
      this.Load += new System.EventHandler(this.Test_Load); 
      this.Resize += new System.EventHandler(this.Display_Resize); 
      this.ResumeLayout(false); 

     } 
     #endregion 

     [STAThread] 
     static void Main() 
     { 
      Application.Run(new Test()); 
     } 

     private void Test_Load(object sender, EventArgs e) 
     { 
      try { 
       // Loop all font families 
       FontFamily[] families = FontFamily.Families; 
       foreach (FontFamily family in families) { 
        try { list.Items.Add(new Font(family, 20, FontStyle.Regular, GraphicsUnit.Pixel)); continue; } 
        catch { } 
       } 

       Display_Resize(this, EventArgs.Empty); 
      } 
      catch { 
      } 
     } 

     private void Display_Resize(object sender, System.EventArgs e) 
     { 
      Rectangle r = this.ClientRectangle; 
      list.SetBounds(list.Left, 
       list.Top, 
       r.Width - (list.Left * 2), 
       r.Height - (list.Top + list.Left)); 
     } 

     public string TextValue = "Example String"; 

     public StringFormat Format 
     { 
      get 
      { 
       StringFormat format = StringFormat.GenericTypographic; 
       format.FormatFlags |= StringFormatFlags.NoWrap; 
       return format; 
      } 
     } 

     private void list_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e) 
     { 
      Brush back = null; 
      Brush fore = null; 
      Brush htext = null; 
      Rectangle r; 

      try { 
       Font font = (Font)list.Items[e.Index]; 

       // Loop 
       if ((e.State & DrawItemState.Selected) != 0) { 
        back = new SolidBrush(Color.DarkBlue); 
        fore = new SolidBrush(Color.White); 
        htext = new SolidBrush(Color.Orange); 
       } 
       else { 
        back = new SolidBrush(Color.White); 
        fore = new SolidBrush(Color.Black); 
        htext = new SolidBrush(Color.DarkRed); 
       } 

       // Fill the rect 
       e.Graphics.FillRectangle(back, e.Bounds); 

       // Get the size of the header 
       SizeF szHeader = e.Graphics.MeasureString(font.Name, head, int.MaxValue, Format); 
       SizeF szText = e.Graphics.MeasureString(TextValue, font, int.MaxValue, Format); 

       // Draw the string 
       r = e.Bounds; 
       r.Height = (int)szHeader.Height; 
       e.Graphics.DrawString(font.Name, head, htext, r, Format); 

       // Draw the string 
       r = e.Bounds; 
       r.Y = (int)(e.Bounds.Y + szHeader.Height); 
       r.Height = (int)szText.Height; 
       e.Graphics.DrawString(TextValue, font, fore, r, Format); 
      } 
      catch { 
      } 
      finally { 
       if (fore != null) fore.Dispose(); 
       if (back != null) back.Dispose(); 
       if (htext != null) htext.Dispose(); 
      } 
     } 

     private void list_MeasureItem(object sender, System.Windows.Forms.MeasureItemEventArgs e) 
     { 
      try { 
       Font font = (Font)list.Items[e.Index]; 
       SizeF szHeader = e.Graphics.MeasureString(font.Name, head, int.MaxValue, Format); 
       SizeF szText = e.Graphics.MeasureString(TextValue, font, int.MaxValue, Format); 

       // Return it 
       e.ItemHeight = (int)(szText.Height + szHeader.Height); 
       e.ItemWidth = (int)Math.Max(szText.Width, szHeader.Width); 
      } 
      catch { 
      } 
     } 
    } 
}