在ComboBox中绘制图形

Posted on 2005-05-03 09:19 kun 阅读(994) 评论(1)  编辑 收藏

为了让程序更具个性,有时候我们需要在ComboBox中绘制图形。效果如图所示。

      

代码如下:

using System;
using
 System.Collections.Generic;
using
 System.ComponentModel;
using
 System.Data;
using
 System.Drawing;
using
 System.Drawing.Drawing2D;
using
 System.Text;
using
 System.Windows.Forms;

partial 
class
 Form2 : Form
{
    
public
 Form2()
    
{
        InitializeComponent();
        
this.comboBox1.Items.Add("Solid Brush"
);
        
this.comboBox1.Items.Add("Horizontal"
);
        
this.comboBox1.Items.Add("Min"
);
        
this.comboBox1.Items.Add("Vertical"
);
        
this.comboBox1.Items.Add("Forward Diagonal"
);
        
this.comboBox1.Items.Add("Backward Diagonal"
);
        
this.comboBox1.Items.Add("Cross"
);
        
this.comboBox1.Items.Add("Large Grid"
);
        
this.comboBox1.Items.Add("Max"
);
        
this.comboBox1.Items.Add("Diagonal Cross"
);

        
this.comboBox1.SelectedIndex = 0
;
        
this.comboBox1.DrawMode =
 DrawMode.OwnerDrawVariable;
        
this.comboBox1.DropDownStyle =
 ComboBoxStyle.DropDownList;
        
this.comboBox1.DropDownWidth = 190
;
        
this.comboBox1.DropDownHeight = 300
;
        
this.comboBox1.MeasureItem += new
 MeasureItemEventHandler(comboBox1_MeasureItem);
        
this.comboBox1.DrawItem += new
 DrawItemEventHandler(comboBox1_DrawItem);
    }


    
void comboBox1_MeasureItem(object sender, MeasureItemEventArgs e)
    
{
        
string displayText = this
.comboBox1.Items[e.Index].ToString();
        SizeF stringSize 
= e.Graphics.MeasureString(displayText, this
.Font);
        e.ItemHeight 
= (int
)stringSize.Height;
        e.ItemWidth 
= (int
)stringSize.Width;
    }



    
private String RemoveSpaces(String str1)
    
{
        
int
 start;
        
int
 at;
        
int
 end;

        String str2 
=
 String.Copy(str1);

        at 
= 0
;
        end 
= str2.Length - 1
;
        start 
= 0
;

        
while ((start <= end) && (at > -1
))
        
{
            
// start+count must be a position within str2.

            at = str2.IndexOf(" ", start);
            
if (at == -1break
;
            str2 
= str2.Remove(at, 1
);
            start 
= at + 1
;
        }


        
return str2;
    }


    
private HatchStyle getHatchStyle(String s)
    
{
        String str 
=
 RemoveSpaces(s);
        
return (HatchStyle)Enum.Parse(typeof(HatchStyle), str, true
);
    }


    
void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
    
{
        
//throw new NotImplementedException();

        e.DrawBackground();

        Rectangle r 
=
 e.Bounds;

        
if (e.Index != -1
)
        
{
            
if (e.Index > 0
)
            
{
                Rectangle rd 
=
 r;
                rd.Width 
= rd.Left + 25
;

                Rectangle rt 
=
 r;
                r.X 
=
 rd.Right;

                
string displayText = this
.comboBox1.Items[e.Index].ToString();
                HatchStyle hs 
= this
.getHatchStyle(displayText);

                
using (HatchBrush b = new
 HatchBrush(hs,e.ForeColor,e.BackColor))
                
{
                    e.Graphics.FillRectangle(b,rd);
                }


                StringFormat sf 
= new StringFormat();
                sf.Alignment 
=
 StringAlignment.Near;

                
using(SolidBrush sb = new
 SolidBrush(Color.White))
                
{
                        
if((e.State & DrawItemState.Focus) == 0
)
                        
{
                            sb.Color 
=
 SystemColors.Window;
                            e.Graphics.FillRectangle(sb,r);
                            sb.Color 
=
 SystemColors.WindowText;
                            e.Graphics.DrawString(displayText,
this
.Font,sb,r,sf);
                        }

                        
else
                        
{
                            sb.Color 
=
 SystemColors.Highlight;
                            e.Graphics.FillRectangle(sb,r);
                            sb.Color 
=
 SystemColors.HighlightText;
                            e.Graphics.DrawString(displayText,
this
.Font,sb,r,sf);
                        }

                }

            }
   // if (e.Index > 0)
            else
            
{
                
using(SolidBrush sb = new
 SolidBrush(Color.White))
                
{
                    
if((e.State & DrawItemState.Focus) == 0
)
                    
{
                        sb.Color 
=
 SystemColors.Window;
                        e.Graphics.FillRectangle(sb,e.Bounds);
                        
string displayText = this
.comboBox1.Items[e.Index].ToString();
                        sb.Color 
=
 SystemColors.WindowText;
                        e.Graphics.DrawString(displayText,
this
.Font,sb,e.Bounds);
                    }

                    
else
                    
{
                        sb.Color 
=
 SystemColors.Highlight;
                        e.Graphics.FillRectangle(sb,e.Bounds);
                        
string displayText = this
.comboBox1.Items[e.Index].ToString();
                        sb.Color 
=
 SystemColors.HighlightText;
                        e.Graphics.DrawString(displayText,
this
.Font,sb,e.Bounds);
                    }

                }

            }

            e.DrawFocusRectangle();
        }

    }

Feedback

# re: 在ComboBox中绘制图形

2008-03-07 11:16 by talaolaode
正要用,谢了!!
标题  
姓名  
主页
内容   
请输入验证码:
*
  登录  使用高级评论  Top 订阅回复  取消订阅
[使用Ctrl+Enter键可以直接提交]