2013-03-06 50 views
0

這是我在列表框中繪製和着色項目的類。該功能是ColorListBox。如果我使用字體大小8,它看起來不錯,但是如果我使用字體大小20,則列表框中的項目彼此重疊;他們之間沒有空間。如何將字體大小設置爲20以便列表框中的項目適合?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Drawing; 
using System.Windows.Forms; 

namespace GatherLinks 
{ 
    class ColorText 
    { 
     public static void Texts(RichTextBox box, string text, Color color) 
     { 
      box.SelectionStart = box.TextLength; 
      box.SelectionLength = 0; 

      box.SelectionColor = color; 
      box.AppendText(text); 
      box.SelectionColor = box.ForeColor; 
     } 

     public static void ColorListBox(List<string> data, DrawItemEventArgs e) 
     { 
      string strLeft = null; 
      string strMid = "---"; 
      string strRight = null; 

      if (data[e.Index].Contains(strMid)) 
      { 
       int index = data[e.Index].IndexOf(strMid); 
       strLeft = data[e.Index].Substring(0, index); 
       strRight = data[e.Index].Substring(index + strMid.Length); 
      } 

      using (Font f = new Font(FontFamily.GenericSansSerif, 20, FontStyle.Regular)) 
      { 
       float startPos; 
       e.Graphics.DrawString(strLeft, f, Brushes.Red, e.Bounds.X, e.Bounds.Y); 
       startPos = e.Graphics.MeasureString(strLeft, f).Width; 
       e.Graphics.DrawString(strMid, f, Brushes.Black, e.Bounds.X + startPos, e.Bounds.Y); 
       startPos = e.Graphics.MeasureString(strLeft + strMid, f).Width; 
       e.Graphics.DrawString(strRight, f, Brushes.Green, e.Bounds.X + startPos, e.Bounds.Y); 

      } 
     } 
    } 
} 

這是它的外觀時,它的尺寸爲20圖像:

enter image description here

+0

所以,你想知道如何改變文本的填充,使得在字體大小爲20時,它們不重疊?它是否正確? – Brian 2013-03-06 17:37:28

+0

Brian正確.. – user2065612 2013-03-06 17:41:52

回答

1

試着畫ListBox中的自己的項目。

將ListBox的DrawMode屬性設置爲OwnerDrawVariable。通過Designer或通過代碼執行此操作:

myListBox.DrawMode = DrawMode.OwnerDrawVariable; 

設置DrawItem和MeasureItem的ListBox事件。通過設計還是通過代碼做到這一點:

myListBox.DrawItem += new DrawItemEventHandler(DrawItem); 
myListBox.MeasureItem += new MeasureItemEventHandler(MeasureItem); 

這將使每當DRAWITEM和MeasureItem事件被解僱ListBox中的每個項目向您發出通知。

爲正在收聽的事件添加事件處理程序。如果您通過設計人員添加它們,它們將自動填充。

private void DrawItem(object sender, DrawItemEventArgs e) 
{ 
    e.DrawBackground(); 
    e.DrawFocusRectangle(); 

    // You'll change the font size here. Notice the 20 
    e.Graphics.DrawString(data[e.Index],new Font(FontFamily.GenericSansSerif, 20, FontStyle.Bold), new SolidBrush(color[e.Index]),e.Bounds); 
} 

private void MeasureItem(object sender, MeasureItemEventArgs e) 
{ 
    // You may need to experiment with the ItemHeight here.. 
    e.ItemHeight = 25; 
} 
+0

moncadad所有我需要的是將設計器中的模式更改爲OwnerDrawVariable,然後添加:listBox1_MeasureItem事件,然後:e.ItemHeight = 25;因爲我在上面的課堂上做了這些,所以我不需要再畫出來或者再做一次。現在工作完美謝謝。 – user2065612 2013-03-06 18:08:15

+0

@ user2065612不客氣。這很好,你只需要聽一個事件。嘗試試用ItemHeight ..我只是隨機選擇25認爲這將是一個很好的選擇。 – 2013-03-06 18:10:33

1

嘗試,

listbox1.IntegralHeight=false; // where listbox1 is your listbox's ID 
listbox1.Height=some_int_number; 
相關問題