扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:张伟 来源:yesky 2007年11月14日
关键字:
private void comboBox1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e) { //确定画布 Graphics g = e.Graphics ; //绘制区域 Rectangle r = e.Bounds ; Font fn = null ; if ( e.Index >= 0 ) { //设置字体、字符串格式、对齐方式 fn = (Font)fontArray[e.Index]; string s = (string)comboBox1.Items[e.Index]; StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Near; //根据不同的状态用不同的颜色表示 if ( e.State == ( DrawItemState.NoAccelerator | DrawItemState.NoFocusRect)) { e.Graphics.FillRectangle(new SolidBrush(Color.Red) , r); e.Graphics.DrawString( s , fn , new SolidBrush(Color.Black), r ,sf); e.DrawFocusRectangle(); } else { e.Graphics.FillRectangle(new SolidBrush(Color.LightBlue) , r); e.Graphics.DrawString( s , fn , new SolidBrush(Color.Red), r ,sf); e.DrawFocusRectangle(); } } } |
再来看看comboBox2的DrawItem事件处理函数,其代码如下:
private void comboBox2_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e) { Graphics g = e.Graphics ; Rectangle r = e.Bounds ; if ( e.Index >= 0 ) { //设置字符串前矩形块rd的大小 Rectangle rd = r ; rd.Width = rd.Left + 20 ; Rectangle rt = r ; r.X = rd.Right ; //用不同的颜色画矩形块 SolidBrush b = (SolidBrush)brushArray[e.Index]; g.FillRectangle(b , rd); //设置字符串的格式 StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Near; if ( e.State == ( DrawItemState.NoAccelerator | DrawItemState.NoFocusRect)) { //字符串背景 e.Graphics.FillRectangle(new SolidBrush(Color.White) , r); //显示字符串 e.Graphics.DrawString( b.Color.Name, new Font("Ariel" ,8 , FontStyle.Bold ) , new SolidBrush(Color.Black), r ,sf); //绘制取得焦点时的虚线框 e.DrawFocusRectangle(); } else { e.Graphics.FillRectangle(new SolidBrush(Color.LightBlue) , r); e.Graphics.DrawString( b.Color.Name, new Font("Veranda" , 8 , FontStyle.Bold ) , new SolidBrush(Color.Red), r ,sf); e.DrawFocusRectangle(); } } } |
最后我们看看comboBox3的DrawItem事件处理函数,其源代码如下:
private void comboBox3_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e) { Graphics g = e.Graphics ; Rectangle r = e.Bounds ; Size imageSize = imageList1.ImageSize; Font fn = null ; if ( e.Index >= 0 ) { fn = (Font)fontArray[0]; string s = (string)comboBox3.Items[e.Index]; StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Near; if ( e.State == ( DrawItemState.NoAccelerator | DrawItemState.NoFocusRect)) { //画条目背景 e.Graphics.FillRectangle(new SolidBrush(Color.Red) , r); //绘制图像 imageList1.Draw(e.Graphics, r.Left, r.Top,e.Index); //显示字符串 e.Graphics.DrawString( s , fn , new SolidBrush(Color.Black), r.Left+imageSize.Width ,r.Top); //显示取得焦点时的虚线框 e.DrawFocusRectangle(); } else { e.Graphics.FillRectangle(new SolidBrush(Color.LightBlue) , r); imageList1.Draw(e.Graphics, r.Left, r.Top,e.Index); e.Graphics.DrawString( s , fn , new SolidBrush(Color.Black),r.Left+imageSize.Width ,r.Top); e.DrawFocusRectangle(); } } } |
看到这儿,聪明的读者也许会说,其实为组合框"变脸"很简单,只要修改各个组合框的DrawItem事件处理函数即可。如果你能明白这一点,我这篇文章的目的就达到了。
在本文快要结果之前我们还是来看看应用程序入口函数的代码:
static void Main() { Form frm=new Form1(); frm.ShowDialog(); } |
最后我要指出本文的局限性,那就是本文中组合框的"顺序性"很强,即组合框中条目格式与我们定义的字符串格式数组、画刷数组、图像数组顺序一样,但如果要求顺序不一样,例如在下面的情况下:用红黄绿三种颜色分别代表三个班级的颜色,即一班所学同学的姓名都用红色表示、二班所有同学的姓名都用黄色表示、三班所有同学的姓名都用绿色表示,这又如何实现呢?有些读者可能会想到用if-else-if语句,但是如果班级有10、100个甚至1000个你还用if-else-if语句吗?这个问题我们留在下一篇文章中解决。
婵犵數濮烽。浠嬪焵椤掆偓閸熷潡鍩€椤掆偓缂嶅﹪骞冨Ο璇茬窞闁归偊鍓涢悾娲⒑闂堟单鍫ュ疾濠婂嫭鍙忔繝濠傜墛閸嬨劍銇勯弽銊с€掗柟钘夊暣閺岀喖鎮滈埡鍌涚彋閻庤娲樺畝绋跨暦閸洖鐓涢柛灞剧矋濞堟悂姊绘担绛嬪殐闁搞劋鍗冲畷銏ゅ冀椤愩儱小闂佹寧绋戠€氼參宕伴崱妯镐簻闁靛牆鎳庢慨顒€鈹戦埥鍡椾簼婵犮垺锚铻炴俊銈呮噺閸嬪倹绻涢崱妯诲碍閻庢艾顦甸弻宥堫檨闁告挾鍠庨锝夘敆娓氬﹦鐭楁繛鎾村焹閸嬫捇鏌e☉娆愬磳闁哄本绋戦埞鎴﹀川椤曞懏鈻婄紓鍌欑劍椤ㄥ懘鎯岄崒鐐靛祦閹兼番鍔岄悞鍨亜閹烘垵顏╅悗姘槹閵囧嫰寮介妸褎鍣ョ紓浣筋嚙濡繈寮婚悢纰辨晣鐟滃秹鎮橀懠顒傜<閺夊牄鍔庣粻鐐烘煛鐏炶姤鍠橀柡浣瑰姍瀹曠喖顢橀悩铏钒闂備浇宕垫慨鎶芥⒔瀹ュ鍨傞柦妯猴級閿濆绀嬫い鏍ㄧ☉濞堟粓姊虹涵鍛【妞ゎ偅娲熼崺鈧い鎺嗗亾闁挎洩濡囧Σ鎰板籍閸繄顓洪梺缁樺姇瀵剙螖閸涱喚鍘搁梺鍓插亽閸嬪嫰鎮橀敃鍌涚厱閻庯綆鍋嗘晶顒傜磼閸屾稑绗ч柟鐟板閹煎湱鎲撮崟闈涙櫏闂傚倷绀侀幖顐も偓姘卞厴瀹曞綊鏌嗗鍛紱閻庡箍鍎遍ˇ浼村磿瀹ュ鐓曢柡鍥ュ妼婢ь垰霉閻樿秮顏堟箒闂佹寧绻傚Λ妤呭煝閺囥垺鐓冪憸婊堝礈濮樿泛钃熼柕濞у嫷鍋ㄩ梺缁樺姇椤曨參鍩㈤弴銏″€甸柨婵嗗€瑰▍鍥ㄣ亜韫囨稐鎲鹃柡灞炬礋瀹曢亶顢橀悢濂変紦