2012-08-08 46 views
2

我需要你在下面的(使用.net 3.5和Windows Forms)問題的幫助:繪製的線條上沒有一個組合框顯示

我只是單純的想畫上一個組合框的中間線(Windows窗體)位於表單上。 我使用的代碼爲:

void comboBox1_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.DrawLine(new Pen(Brushes.DarkBlue), 
         this.comboBox1.Location.X, 
         this.comboBox1.Location.Y + (this.comboBox1.Size.Height/2), 
         this.comboBox1.Location.X + this.comboBox1.Size.Width, 
         this.comboBox1.Location.Y + (this.comboBox1.Size.Height/2)); 
} 

要發射油漆事件:

private void button1_Click(object sender, EventArgs e) 
{ 
    comboBox1.Refresh(); 
} 

當我執行的代碼,並按下按鈕,則不繪製線條。在調試中,繪製處理程序的斷點沒有被擊中。奇怪的是,在MSDN ComBox的事件列表中有一個繪畫事件,但在VS 2010中,IntelliSense在ComboBox的成員中未找到此類事件

謝謝。

+0

我認爲你必須重寫組合框的OnPaint事件並觸發一個畫圖,你可以調用InvalidateRect – Schwarzie2478 2012-08-08 10:13:28

回答

2
public Form1() 
{ 
    InitializeComponent(); 
    comboBox1.DrawMode = DrawMode.OwnerDrawFixed; 
    comboBox1.DrawItem += new DrawItemEventHandler(comboBox1_DrawItem); 
} 

void comboBox1_DrawItem(object sender, DrawItemEventArgs e) { 
    e.DrawBackground(); 
    e.Graphics.DrawLine(Pens.Black, new Point(e.Bounds.Left, e.Bounds.Bottom-1), 
    new Point(e.Bounds.Right, e.Bounds.Bottom-1)); 
    TextRenderer.DrawText(e.Graphics, comboBox1.Items[e.Index].ToString(), 
    comboBox1.Font, e.Bounds, comboBox1.ForeColor, TextFormatFlags.Left); 
    e.DrawFocusRectangle(); 
} 
+0

謝謝它的工作!你能回答另一個小問題嗎?我用DrawImage替換了DrawLine,並且我想繪製動畫GIF(類似等待動畫),但它僅在靜態中繪製,而不是動畫,我可以使用什麼來繪製動畫圖像? – Apokal 2012-08-08 11:04:07

+0

我認爲你應該使用一個PictureBox,如[早期問題]中所述(http://stackoverflow.com/questions/165735/how-do-you-show-animated-gifs-on-a-windows-form-c )。 – 2012-08-08 11:25:50

1

Paint事件不會觸發。
你想要什麼是可能只有當DropDownStyle == ComboBoxStyle.DropDownList

 comboBox1.DrawMode = DrawMode.OwnerDrawFixed; 
     comboBox1.DropDownStyle = ComboBoxStyle.DropDownList; 
     comboBox1.DrawItem += (sender, args) => 
     { 
      var ordinate = args.Bounds.Top + args.Bounds.Height/2; 
      args.Graphics.DrawLine(new Pen(Color.Red), new Point(args.Bounds.Left, ordinate), 
       new Point(args.Bounds.Right, ordinate)); 
     }; 

可以得出自己所選的項目區域這種方式。

+0

謝謝!你的答案也有效! – Apokal 2012-08-08 11:04:43