2013-05-03 11 views
5

Mam obecnie projekt Windows Form, w którym utworzyłem prostą aplikację do czatu. Obecnie czat jest wysyłany do wieloliniowego pola tekstowego, jednak chcę go teraz nieco poprawić i dodać trochę stylizacji. Z czasem chciałbym mieć jakiś obraz, dobrze go sformatować i być może jakiś HTML (choć to nie jest istotne) w przyszłości. Zastanawiam się tylko, co powinienem zrobić, aby to osiągnąć. Myślałem o aktualizacji strony HTML, a następnie załadowaniu jej z każdą nową wiadomością, ale to nie dałoby bardzo dobrego wrażenia użytkownika. Spojrzałem również na klasę richtextbox, ale wydaje mi się, że jest to trochę ograniczone dla tego, co szukam. Mam nadzieję, że ktoś może wskazać mi właściwy kierunek, co do tego, czego użyć.Windows Form TextBox do wyświetlania obrazów

staram się osiągnąć coś podobnego jak to, co mam podświetlone na czerwono:

enter image description here

+1

Użyj [RichTextBox] (http://msdn.microsoft.com/en-us/library/system.windows. forms.richtextbox.aspx). –

+1

Niezbyt pomocny, ponieważ OP powiedział, że próbował "RichTextBox" i stwierdził, że jest ograniczony. Czy możesz dodać kod, aby pokazać Josephowi, jak używać "RichTextBoxa", aby osiągnąć to, czego chce? –

+0

Kontrola HTML dla winforms http://stackoverflow.com/questions/3456787/a-good-html-capable-richedit-replacement-for-winforms – Nick

Odpowiedz

0

Podczas gdy niektóre inne komentarze wskazują, że WPF jest dobrze nadaje się do tego, w realnym świecie, to jest nie zawsze jest to możliwe lub pożądane, aby się przełączyć.

Do tego celu nadaje się regularne okno listy właścicieli.

Aby to zrobić, po prostu ustaw tryb DrawMode w polu listy na OwnerDrawVariable, np.

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

Potem wystarczy dostarczyć dwa obsługi zdarzeń, pierwszy pomiar element (pole listy powiedzieć jak wysoka pozycja będzie), a co innego faktycznie czynią go. na przykład

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

renderowania obrazu na liście jest dość proste z GDI + drawImage (gdzie g to Twój context_ grafika:

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); 

To jest przykład systemu Windows Form, który ma pole listy właściciel rysowane wszystkich czcionek w systemie, produkujące zmiennej wysokości lista przedmiotów właściciela rysowane: 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 { 
      } 
     } 
    } 
} 
Powiązane problemy