BitmapComboBox.cs
上传用户:nnpulika
上传日期:2013-02-15
资源大小:597k
文件大小:4k
- using System;
- using System.Collections;
- using System.ComponentModel;
- using System.Drawing;
- using System.Data;
- using System.Windows.Forms;
- using System.Diagnostics;
- using UtilityLibrary.General;
- namespace UtilityLibrary.WinControls
- {
- /// <summary>
- /// Summary description for TextComboBox.
- /// </summary>
- [ToolboxItem(false)]
- public class BitmapComboBox : ComboBoxBase
- {
- private const int PREVIEW_BOX_WIDTH = 20;
-
- protected override void OnPaint(PaintEventArgs pe)
- {
- base.OnPaint(pe);
- }
-
- protected override void OnDrawItem(DrawItemEventArgs e)
- {
-
- // Call base class to do the "Flat ComboBox" drawing
- base.OnDrawItem(e);
- // Draw bitmap strech to the size of the size of the combobox
- Graphics g = e.Graphics;
- Rectangle bounds = e.Bounds;
- bool selected = (e.State & DrawItemState.Selected) > 0;
- bool editSel = (e.State & DrawItemState.ComboBoxEdit ) > 0;
- if ( e.Index != -1 )
- DrawComboBoxItem(g, bounds, e.Index, selected, editSel);
-
- }
-
- protected override void DrawComboBoxItem(Graphics g, Rectangle bounds, int Index, bool selected, bool editSel)
- {
- // Call base class to do the "Flat ComboBox" drawing
- // Draw bitmap
- base.DrawComboBoxItem(g, bounds, Index, selected, editSel);
- if ( Index != -1)
- {
- Brush brush;
- brush = new SolidBrush(SystemColors.MenuText);
-
- g.DrawImage(bitmapsArray[Index], bounds.Left+2, bounds.Top+2, PREVIEW_BOX_WIDTH, bounds.Height-4);
- Pen blackPen = new Pen(new SolidBrush(Color.Black), 1);
- g.DrawRectangle(blackPen, new Rectangle(bounds.Left+1, bounds.Top+1, PREVIEW_BOX_WIDTH+1, bounds.Height-3));
- Size textSize = TextUtil.GetTextSize(g, Items[Index].ToString(), Font);
- int top = bounds.Top + (bounds.Height - textSize.Height)/2;
- g.DrawString(Items[Index].ToString(), Font, brush,
- new Point(bounds.Left + 28, top));
- brush.Dispose();
- }
- }
- protected override void DrawComboBoxItemEx(Graphics g, Rectangle bounds, int Index, bool selected, bool editSel)
- {
- // This "hack" is necessary to avoid a clipping bug that comes from the fact that sometimes
- // we are drawing using the Graphics object for the edit control in the combobox and sometimes
- // we are using the graphics object for the combobox itself. If we use the same function to do our custom
- // drawing it is hard to adjust for the clipping because of these limitations
- base.DrawComboBoxItemEx(g, bounds, Index, selected, editSel);
- if ( Index != -1)
- {
- SolidBrush brush;
- brush = new SolidBrush(SystemColors.MenuText);
-
- Rectangle rc = bounds;
- rc.Inflate(-3, -3);
- Pen blackPen = new Pen(new SolidBrush(Color.Black), 1);
- g.DrawRectangle(blackPen, new Rectangle(rc.Left+1, rc.Top+1, PREVIEW_BOX_WIDTH+1, rc.Height-3));
- g.DrawImage(bitmapsArray[Index], rc.Left+2, rc.Top+2, PREVIEW_BOX_WIDTH, rc.Height-4);
- Size textSize = TextUtil.GetTextSize(g, Items[Index].ToString(), Font);
- int top = bounds.Top + (bounds.Height - textSize.Height)/2;
- // Clipping rectangle
- Rectangle clipRect = new Rectangle(bounds.Left + 31, top, bounds.Width - 31 - ARROW_WIDTH - 4, top+textSize.Height);
- g.DrawString(Items[Index].ToString(), Font, brush, clipRect);
- brush.Dispose();
- }
- }
- protected override void DrawDisableState()
- {
- // Draw the combobox state disable
- base.DrawDisableState();
-
- // Draw the specific disable state to
- // this derive class
- using ( Graphics g = CreateGraphics() )
- {
- using ( Brush b = new SolidBrush(SystemColors.ControlDark) )
- {
- Rectangle rc = ClientRectangle;
- Rectangle bounds = new Rectangle(rc.Left, rc.Top, rc.Width, rc.Height);
- bounds.Inflate(-3, -3);
- g.DrawRectangle(SystemPens.ControlDark, new Rectangle(bounds.Left+2,
- bounds.Top+2, PREVIEW_BOX_WIDTH, bounds.Height-4));
- int index = SelectedIndex;
- Size textSize = TextUtil.GetTextSize(g, Items[index].ToString(), Font);
-
- // Clipping rectangle
- int top = rc.Top + (rc.Height - textSize.Height)/2;
- Rectangle clipRect = new Rectangle(rc.Left + 31,
- top, rc.Width - 31 - ARROW_WIDTH - 4, top+textSize.Height);
- g.DrawString(Items[index].ToString(), Font, b, clipRect);
- }
- }
- }
-
-
- }
- }