public partial class ComboBoxEx : ComboBox { private string imagePath = AppDomain.CurrentDomain.BaseDirectory + "Image\{0}.png"; private Image _normalImage = null; private Image _hoverImage = null; private Image _disableImage = null; private bool mouseHover; private bool mouseDown; public ComboBoxEx() { base.SetStyle( ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.ResizeRedraw | ControlStyles.SupportsTransparentBackColor, true); this.DrawMode = DrawMode.OwnerDrawFixed; this.DropDownStyle = ComboBoxStyle.DropDownList; base.UpdateStyles(); } protected override void OnCreateControl() { base.OnCreateControl(); if (!DesignMode && this.Items.Count != 0) { this.DropDownHeight = this.Items.Count * 17; } ResetBitmap(); } private void ResetBitmap() { this._normalImage = Image.FromFile(string.Format(imagePath,"combobox-normal")); this._hoverImage = Image.FromFile(string.Format(imagePath,"combobox-hover")); this._disableImage = Image.FromFile(string.Format(imagePath,"combobox-disable")); } protected override void OnMouseEnter(EventArgs e) { mouseHover = true; this.Invalidate(); base.OnMouseEnter(e); } protected override void OnMouseLeave(EventArgs e) { mouseHover = false; this.Invalidate(); base.OnLeave(e); } protected override void OnMouseDown(MouseEventArgs mevent) { if (mevent.Button == MouseButtons.Left) { mouseDown = true; this.Invalidate(); base.OnMouseDown(mevent); } } protected override void OnMouseUp(MouseEventArgs mevent) { mouseDown = false; this.Invalidate(); base.OnMouseUp(mevent); } [DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern IntPtr GetWindowDC(IntPtr handle); [DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern IntPtr ReleaseDC(IntPtr handle, IntPtr hDC); protected override void WndProc(ref Message m) { base.WndProc(ref m); if (m.Msg == 0xf || m.Msg == 0x133) { IntPtr hDC = GetWindowDC(m.HWnd); if (hDC.ToInt32() == 0) return; Graphics g = Graphics.FromHdc(hDC); OverrideDropDown(g); OverrideControlBorder(g); ReleaseDC(m.HWnd, hDC); } } private static int DropDownButtonWidth = 17; private void OverrideDropDown(Graphics g) { if (DesignMode) return; Rectangle rect = new Rectangle(this.Width - DropDownButtonWidth - 3, 0, DropDownButtonWidth + 3, this.Height); g.FillRectangle(new SolidBrush(Color.FromArgb(236, 240, 241)), rect); if (!this.Enabled) { g.DrawImage(this._disableImage, new Rectangle(this.Width - 15, 6, 9, 9)); } else if (mouseDown) { g.DrawImage(this._hoverImage, new Rectangle(this.Width - 15, 6, 9, 9)); } else if (mouseHover) { g.DrawImage(this._hoverImage, new Rectangle(this.Width - 15, 6, 9, 9)); } else if (this.Focused) { g.DrawImage(this._hoverImage, new Rectangle(this.Width - 15, 6, 9, 9)); } else { g.DrawImage(this._normalImage, new Rectangle(this.Width - 15, 6, 9, 9)); } } private void OverrideControlBorder(Graphics g) { if (!this.Enabled) { g.DrawRectangle(new Pen(Color.FromArgb(189, 195, 199), 2), new Rectangle(0, 0, this.Width, this.Height)); } else if (mouseDown) { g.DrawRectangle(new Pen(Color.FromArgb(41, 128, 185), 3), new Rectangle(0, 0, this.Width - 1, this.Height - 1)); } else if (mouseHover) { g.DrawRectangle(new Pen(Color.FromArgb(41, 128, 185), 2), new Rectangle(0, 0, this.Width, this.Height)); } else if (this.Focused) { g.DrawRectangle(new Pen(Color.FromArgb(41, 128, 185), 3), new Rectangle(0, 0, this.Width - 1, this.Height - 1)); } else { g.DrawRectangle(new Pen(Color.FromArgb(127, 140, 141), 2), new Rectangle(0, 0, this.Width, this.Height)); } } protected override void OnDrawItem(DrawItemEventArgs e) { Graphics g = e.Graphics; Rectangle r = e.Bounds; Font fn = null; if (e.Index >= 0) { fn = e.Font; string s = this.Items[e.Index].ToString(); 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(s, fn, new SolidBrush(Color.FromArgb(127, 140, 141)), r, sf); e.DrawFocusRectangle(); } else { e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(41, 128, 185)), r); e.Graphics.DrawString(s, fn, new SolidBrush(Color.FromArgb(255, 255, 255)), r, sf); e.DrawFocusRectangle(); } if (!this.Focused) { e.Graphics.FillRectangle(new SolidBrush(Color.White), r); e.Graphics.DrawString(s, fn, new SolidBrush(Color.Black), r, sf); e.DrawFocusRectangle(); } } base.OnDrawItem(e); } }
选择时可以看到下拉框内容,点击内容后不在combobox上显示
解决方案
20
来顶下,看有没有有高手回复
10
把 ControlStyles.UserPaint 去掉就好了
10
本人的理解是假如你加上了ControlStyles.UserPaint ,
你还得 在protected override void OnPaint(PaintEventArgs e) 方法里绘制选择以后的内容
你还得 在protected override void OnPaint(PaintEventArgs e) 方法里绘制选择以后的内容