DotNetBar ComboBoxEx

DotNetBar ComboBoxEx
   1 using System;
   2 using System.ComponentModel;
   3 using System.Drawing;
   4 using System.Runtime.InteropServices;
   5 using System.Windows.Forms;
   6 using Endv.DotNetBar.Rendering;
   7 using Endv.DotNetBar.TextMarkup;
   8 using Endv.Editors;
   9 
  10 namespace Endv.DotNetBar.Controls
  11 {
  12     /// <summary>
  13     /// Represents enhanced Windows combo box control.
  14     /// </summary>
  15     [ToolboxBitmap(typeof(ComboBoxEx), "Controls.ComboBoxEx.ico"), ToolboxItem(true), Designer(typeof(Design.ComboBoxExDesigner))]
  16     public class ComboBoxEx : System.Windows.Forms.ComboBox, ICommandSource
  17     {
  18         /// <summary>
  19         /// Represents the method that will handle the DropDownChange event.
  20         /// </summary>
  21         public delegate void OnDropDownChangeEventHandler(object sender, bool Expanded);
  22         /// <summary>
  23         /// Occurs when drop down portion of combo box is shown or hidden.
  24         /// </summary>
  25         public event OnDropDownChangeEventHandler DropDownChange;
  26 
  27         private eDotNetBarStyle m_Style=eDotNetBarStyle.Office2007;
  28         private bool m_DefaultStyle=false;            // Disables our drawing in WndProc
  29         private bool m_MouseOver=false;
  30         private bool m_MouseOverThumb=false;
  31         private bool m_DroppedDown=false;
  32         //private System.Windows.Forms.Timer m_Timer;
  33         private bool m_WindowsXPAware=false;
  34         private bool m_DisableInternalDrawing=false;
  35         private ImageList m_ImageList=null;
  36         private int m_DropDownHeight=0;
  37         private IntPtr m_LastFocusWindow;
  38         private IntPtr m_DropDownHandle=IntPtr.Zero;
  39         private ComboTextBoxMsgHandler m_TextWindowMsgHandler=null;
  40         //private ComboListBoxMsgHandler m_ListBoxMsgHandler = null;
  41 
  42         [DllImport("user32")]
  43         private static extern bool ValidateRect(IntPtr hWnd,ref NativeFunctions.RECT pRect);
  44 
  45         [DllImport("user32",SetLastError=true, CharSet=CharSet.Auto)]
  46         private static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);
  47         private const uint GW_CHILD=5;
  48 
  49         private bool m_PreventEnterBeep=false;
  50 
  51         private string m_WatermarkText = "";
  52         private bool m_Focused = false;
  53         private Font m_WatermarkFont = null;
  54         private Color m_WatermarkColor = SystemColors.GrayText;
  55         private bool m_IsStandalone = true;
  56         private Timer m_MouseOverTimer = null;
  57         private Rectangle m_ThumbRect = Rectangle.Empty;
  58         private bool _FocusHighlightEnabled = false;
  59         private static Color _DefaultHighlightColor = Color.FromArgb(0xFF, 0xFF, 0x88);
  60         private Color _FocusHighlightColor = _DefaultHighlightColor;
  61 
  62         /// <summary>
  63         /// Creates new instance of ComboBoxEx.
  64         /// </summary>
  65         public ComboBoxEx():base()
  66         {
  67             if(!ColorFunctions.ColorsLoaded)
  68             {
  69                 NativeFunctions.RefreshSettings();
  70                 NativeFunctions.OnDisplayChange();
  71                 ColorFunctions.LoadColors();
  72             }
  73             m_MouseOverTimer = new Timer();
  74             m_MouseOverTimer.Interval = 10;
  75             m_MouseOverTimer.Enabled = false;
  76             m_MouseOverTimer.Tick += new EventHandler(MouseOverTimerTick);
  77 #if FRAMEWORK20
  78             this.FlatStyle = FlatStyle.Flat;
  79 #endif
  80         }
  81 
  82         private bool _FocusCuesEnabled = true;
  83         /// <summary>
  84         /// Gets or sets whether control displays focus cues when focused.
  85         /// </summary>
  86         [DefaultValue(true), Category("Behavior"), Description("Indicates whether control displays focus cues when focused.")]
  87         public virtual bool FocusCuesEnabled
  88         {
  89             get { return _FocusCuesEnabled; }
  90             set
  91             {
  92                 _FocusCuesEnabled = value;
  93                 if (this.Focused) this.Invalidate();
  94             }
  95         }
  96 
  97         /// <summary>
  98         /// Gets or sets whether control is stand-alone control. Stand-alone flag affects the appearance of the control in Office 2007 style.
  99         /// </summary>
 100         [Browsable(true), DefaultValue(true), Category("Appearance"), Description("Indicates the appearance of the control.")]
 101         public bool IsStandalone
 102         {
 103             get { return m_IsStandalone; }
 104             set
 105             {
 106                 m_IsStandalone = value;
 107             }
 108         }
 109 
 110         private bool _WatermarkEnabled = true;
 111         /// <summary>
 112         /// Gets or sets whether watermark text is displayed when control is empty. Default value is true.
 113         /// </summary>
 114         [DefaultValue(true), Description("Indicates whether watermark text is displayed when control is empty.")]
 115         public virtual bool WatermarkEnabled
 116         {
 117             get { return _WatermarkEnabled; }
 118             set { _WatermarkEnabled = value; this.Invalidate(); }
 119         }
 120 
 121         /// <summary>
 122         /// Gets or sets the watermark (tip) text displayed inside of the control when Text is not set and control does not have input focus. This property supports text-markup.
 123         /// Note that WatermarkText is not compatible with the auto-complete feature of .NET Framework 2.0.
 124         /// </summary>
 125         [Browsable(true), DefaultValue(""), Localizable(true), Category("Appearance"), Description("Indicates watermark text displayed inside of the control when Text is not set and control does not have input focus."), Editor(typeof(Design.TextMarkupUIEditor), typeof(System.Drawing.Design.UITypeEditor))]
 126         public string WatermarkText
 127         {
 128             get { return m_WatermarkText; }
 129             set
 130             {
 131                 if (value == null) value = "";
 132                 m_WatermarkText = value;
 133                 MarkupTextChanged();
 134                 this.Invalidate();
 135             }
 136         }
 137 
 138         private eWatermarkBehavior _WatermarkBehavior = eWatermarkBehavior.HideOnFocus;
 139         /// <summary>
 140         /// Gets or sets the watermark hiding behaviour. Default value indicates that watermark is hidden when control receives input focus.
 141         /// </summary>
 142         [DefaultValue(eWatermarkBehavior.HideOnFocus), Category("Behavior"), Description("Indicates watermark hiding behaviour.")]
 143         public eWatermarkBehavior WatermarkBehavior
 144         {
 145             get { return _WatermarkBehavior; }
 146             set { _WatermarkBehavior = value; this.Invalidate(); }
 147         }
 148 
 149         private TextMarkup.BodyElement m_TextMarkup = null;
 150         private void MarkupTextChanged()
 151         {
 152             m_TextMarkup = null;
 153 
 154             if (!TextMarkup.MarkupParser.IsMarkup(ref m_WatermarkText))
 155                 return;
 156 
 157             m_TextMarkup = TextMarkup.MarkupParser.Parse(m_WatermarkText);
 158             ResizeMarkup();
 159         }
 160 
 161         private void ResizeMarkup()
 162         {
 163             if (m_TextMarkup != null)
 164             {
 165                 using (Graphics g = this.CreateGraphics())
 166                 {
 167                     MarkupDrawContext dc = GetMarkupDrawContext(g);
 168                     m_TextMarkup.Measure(GetWatermarkBounds().Size, dc);
 169                     Size sz = m_TextMarkup.Bounds.Size;
 170                     m_TextMarkup.Arrange(new Rectangle(GetWatermarkBounds().Location, sz), dc);
 171                 }
 172             }
 173         }
 174         private MarkupDrawContext GetMarkupDrawContext(Graphics g)
 175         {
 176             return new MarkupDrawContext(g, (m_WatermarkFont == null ? this.Font : m_WatermarkFont), m_WatermarkColor, this.RightToLeft == RightToLeft.Yes);
 177         }
 178 
 179         /// <summary>
 180         /// Gets or sets the watermark font.
 181         /// </summary>
 182         [Browsable(true), Category("Appearance"), Description("Indicates watermark font."), DefaultValue(null)]
 183         public Font WatermarkFont
 184         {
 185             get { return m_WatermarkFont; }
 186             set { m_WatermarkFont = value; this.Invalidate(true); }
 187         }
 188 
 189         /// <summary>
 190         /// Gets or sets the watermark text color.
 191         /// </summary>
 192         [Browsable(true), Category("Appearance"), Description("Indicates watermark text color.")]
 193         public Color WatermarkColor
 194         {
 195             get { return m_WatermarkColor; }
 196             set { m_WatermarkColor = value; this.Invalidate(true); }
 197         }
 198         /// <summary>
 199         /// Indicates whether property should be serialized by Windows Forms designer.
 200         /// </summary>
 201         [EditorBrowsable(EditorBrowsableState.Never)]
 202         public bool ShouldSerializeWatermarkColor()
 203         {
 204             return m_WatermarkColor != SystemColors.GrayText;
 205         }
 206         /// <summary>
 207         /// Resets the property to default value.
 208         /// </summary>
 209         [EditorBrowsable(EditorBrowsableState.Never)]
 210         public void ResetWatermarkColor()
 211         {
 212             this.WatermarkColor = SystemColors.GrayText;
 213         }
 214 
 215         /// <summary>
 216         /// Gets or sets the combo box background color. Note that in Office 2007 style back color of the control is automatically managed.
 217         /// </summary>
 218         [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
 219         public override Color BackColor
 220         {
 221             get
 222             {
 223                 return base.BackColor;
 224             }
 225             set
 226             {
 227                 base.BackColor = value;
 228             }
 229         }
 230 
 231         private bool m_UseCustomBackColor=false;
 232         /// <summary>
 233         /// Gets or sets whether the BackColor value you set is used instead of the style back color automatically provided by the control. Default
 234         /// value is false which indicates that BackColor property is automatically managed. Set this property to true and then set BackColor property
 235         /// to make control use your custom back color.
 236         /// </summary>
 237         [Browsable(false), DefaultValue(false)]
 238         public bool UseCustomBackColor
 239         {
 240             get { return m_UseCustomBackColor; }
 241             set { m_UseCustomBackColor = value; }
 242         }
 243 
 244         /// <summary>
 245         /// Gets or sets value indicating whether system combo box appearance is used. Default value is false.
 246         /// </summary>
 247         [Browsable(false),Category("Behavior"),Description("Makes Combo box appear the same as built-in Combo box."),DefaultValue(false)]
 248         public bool DefaultStyle
 249         {
 250             get
 251             {
 252                 return m_DefaultStyle;
 253             }
 254             set
 255             {
 256                 if(m_DefaultStyle!=value)
 257                 {
 258                     m_DefaultStyle=value;
 259                     this.Invalidate(true);
 260                 }
 261             }
 262         }
 263 
 264         /// <summary>
 265         /// Gets or sets value indicating whether the combo box is draw using the Windows XP Theme manager when running on Windows XP or theme aware OS.
 266         /// </summary>
 267         [Browsable(false),Category("Behavior"),Description("When running on WindowsXP draws control using the Windows XP Themes if theme manager is enabled."),DefaultValue(false)]
 268         public bool ThemeAware
 269         {
 270             get
 271             {
 272                 return m_WindowsXPAware;
 273             }
 274             set
 275             {
 276                 if(m_WindowsXPAware!=value)
 277                 {
 278                     m_WindowsXPAware=value;
 279                     if(!m_WindowsXPAware)
 280                         m_DefaultStyle=false;
 281                     else if (m_WindowsXPAware && BarFunctions.ThemedOS)
 282                     {
 283                         m_DefaultStyle = true;
 284                         #if FRAMEWORK20
 285                         this.FlatStyle = FlatStyle.Standard;
 286                         #endif
 287                     }
 288                 }
 289             }
 290         }
 291 
 292         /// <summary>
 293         /// Disables internal drawing support for the List-box portion of Combo-box. Default value is false which means that internal drawing code is used. If
 294         /// you plan to provide your own drawing for combo box items you must set this property to True.
 295         /// </summary>
 296         [Browsable(true),Category("Behavior"),Description("Disables internal drawing support for the List-box portion of Combo-box."), DefaultValue(false)]
 297         public bool DisableInternalDrawing
 298         {
 299             get
 300             {
 301                 return m_DisableInternalDrawing;
 302             }
 303             set
 304             {
 305                 if(m_DisableInternalDrawing!=value)
 306                     m_DisableInternalDrawing=value;
 307             }
 308         }
 309 
 310         /// <summary>
 311         /// Gets or sets whether combo box generates the audible alert when Enter key is pressed.
 312         /// </summary>
 313         [System.ComponentModel.Browsable(true),DevCoBrowsable(true),System.ComponentModel.Category("Behavior"),System.ComponentModel.Description("Indicates whether combo box generates the audible alert when Enter key is pressed."),System.ComponentModel.DefaultValue(false)]
 314         public bool PreventEnterBeep
 315         {
 316             get
 317             {
 318                 return m_PreventEnterBeep;
 319             }
 320             set
 321             {
 322                 m_PreventEnterBeep=value;
 323             }
 324         }
 325 
 326         /// <summary>
 327         /// The ImageList control used by Combo box to draw images.
 328         /// </summary>
 329         [Browsable(true),Category("Behavior"),Description("The ImageList control used by Combo box to draw images."), DefaultValue(null)]
 330         public System.Windows.Forms.ImageList Images
 331         {
 332             get
 333             {
 334                 return m_ImageList;
 335             }
 336             set
 337             {
 338                 m_ImageList=value;
 339             }
 340         }
 341 
 342         /// <summary>
 343         /// Determines the visual style applied to the combo box when shown. Default style is Office 2007.
 344         /// </summary>
 345         [Browsable(true),Category("Appearance"), DefaultValue(eDotNetBarStyle.Office2007) ,Description("Determines the display of the item when shown.")]
 346         public eDotNetBarStyle Style
 347         {
 348             get
 349             {
 350                 return m_Style;
 351             }
 352             set
 353             {
 354                 m_Style=value;
 355                 UpdateBackColor();
 356                 this.Invalidate(true);
 357             }
 358         }
 359 
 360         protected override void OnHandleCreated(EventArgs e)
 361         {
 362             base.OnHandleCreated(e);
 363             UpdateBackColor();
 364             SetupTextBoxMessageHandler();
 365             RemoveTheme(this.Handle);
 366         }
 367 
 368         /*protected override void OnHandleDestroyed(EventArgs e)
 369         {
 370             if(m_Timer!=null)
 371                 m_Timer.Enabled=false;
 372             base.OnHandleDestroyed(e);
 373         }*/
 374 
 375         protected override void OnResize(EventArgs e)
 376         {
 377             ResizeMarkup();
 378             this.Invalidate();
 379             base.OnResize(e);
 380         }
 381         
 382         private void MouseOverTimerTick(object sender, EventArgs e)
 383         {
 384             bool over = false;
 385             
 386             if (this.IsHandleCreated && this.Visible)
 387             {
 388                 WinApi.RECT rw = new WinApi.RECT();
 389                 WinApi.GetWindowRect(this.Handle, ref rw);
 390                 Rectangle r = rw.ToRectangle();
 391                 if (r.Contains(Control.MousePosition))
 392                     over = true;
 393                 Point p=this.PointToClient(Control.MousePosition);
 394                 if (m_ThumbRect.Contains(p))
 395                     MouseOverThumb = true;
 396                 else
 397                     MouseOverThumb = false;
 398             }
 399 
 400             if (!over)
 401             {
 402                 SetMouseOverTimerEnabled(false);
 403                 m_MouseOver = false;
 404                 UpdateBackColor();
 405                 this.Invalidate();
 406                 if (this.ParentItem != null) this.ParentItem.HideToolTip();
 407             }
 408         }
 409         internal BaseItem ParentItem = null;
 410 
 411         private bool MouseOverThumb
 412         {
 413             get { return m_MouseOverThumb; }
 414             set
 415             {
 416                 if (m_MouseOverThumb != value)
 417                 {
 418                     m_MouseOverThumb = value;
 419                     this.Invalidate();
 420                 }
 421             }
 422         }
 423 
 424         protected override void OnGotFocus(EventArgs e)
 425         {
 426             base.OnGotFocus(e);
 427             if (!m_MouseOver)
 428                 m_MouseOver = true;
 429             UpdateBackColor();
 430             this.Invalidate(true);
 431         }
 432 
 433         protected override void OnLostFocus(EventArgs e)
 434         {
 435             //if(!this.ClientRectangle.Contains(this.PointToClient(Control.MousePosition)))
 436                 //m_MouseOver=false;
 437             SetMouseOverTimerEnabled(true);
 438             //Color c = GetComboColors().Background;
 439             //if (this.BackColor != c)
 440                 //this.BackColor = c;
 441             //if(!m_MouseOver)
 442             //    this.Refresh();
 443             m_LastFocusWindow=IntPtr.Zero;
 444             base.OnLostFocus(e);
 445         }
 446 
 447         private Timer m_DropDownTrackTimer = null;
 448         private void StartDropDownTrackTimer()
 449         {
 450             if (m_DropDownTrackTimer == null)
 451             {
 452                 m_DropDownTrackTimer = new Timer();
 453                 m_DropDownTrackTimer.Tick += new EventHandler(DropDownTrackTimerTick);
 454                 m_DropDownTrackTimer.Interval = 200;
 455             }
 456             m_DropDownTrackTimer.Start();
 457         }
 458         private void StopDropDownTrackTimer()
 459         {
 460             Timer t = m_DropDownTrackTimer;
 461             m_DropDownTrackTimer = null;
 462             if (t != null)
 463             {
 464                 t.Stop();
 465                 t.Dispose();
 466             }
 467         }
 468 
 469         private void DropDownTrackTimerTick(object sender, EventArgs e)
 470         {
 471             DroppedDownInternal = (WinApi.SendMessage(this.Handle, (int)WinApi.WindowsMessages.CB_GETDROPPEDSTATE, IntPtr.Zero, IntPtr.Zero) != 0);
 472         }
 473 
 474         private bool DroppedDownInternal
 475         {
 476             get
 477             {
 478                 return m_DroppedDown;
 479             }
 480             set
 481             {
 482                 if (m_DroppedDown != value)
 483                 {
 484                     StopDropDownTrackTimer();
 485                     m_DroppedDown = value;
 486                     this.Invalidate();
 487 
 488                     if (DropDownChange != null)
 489                         DropDownChange(this, m_DroppedDown);
 490                     #if !FRAMEWORK20
 491                     if(m_DroppedDown)
 492                     {
 493                         StartDropDownTrackTimer();
 494                     }
 495                     #endif
 496                 }
 497             }
 498         }
 499 
 500 #if FRAMEWORK20
 501         protected override void OnDropDownClosed(EventArgs e)
 502         {
 503             DroppedDownInternal = false;
 504             m_SelectedIndexInternal = this.SelectedIndex;
 505             base.OnDropDownClosed(e);
 506         }
 507 #endif
 508 
 509         protected override void OnDropDown(EventArgs e)
 510         {
 511             base.OnDropDown(e);
 512             if(DropDownChange!=null)
 513                 this.DropDownChange(this,true);
 514             DroppedDownInternal=true;
 515         }
 516 
 517         [DllImport("user32", CharSet = CharSet.Unicode)]
 518         private static extern int SetWindowTheme(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)] String pszSubAppName, [MarshalAs(UnmanagedType.LPWStr)] String pszSubIdList);
 519 
 520         private void RemoveTheme(IntPtr handle)
 521         {
 522             bool isXp = false;
 523             if (System.Environment.Version.Major > 5)
 524                 isXp = true;
 525             else if ((System.Environment.Version.Major == 5) &&
 526                (System.Environment.Version.Minor >= 1))
 527                 isXp = true;
 528             if (isXp)
 529                 SetWindowTheme(handle, " ", " ");
 530         }
 531 
 532         #region Internal Combo Colors
 533         private class InternalComboColors
 534         {
 535             public Color Background = SystemColors.Window;
 536             public Color Border = SystemColors.Window;
 537             public LinearGradientColorTable ThumbBackground = null;
 538             public Color ThumbText = SystemColors.ControlText;
 539             public LinearGradientColorTable ThumbBorderOuter = null;
 540             public LinearGradientColorTable ThumbBorderInner = null;
 541         }
 542 
 543         private InternalComboColors GetComboColors()
 544         {
 545             InternalComboColors c = new InternalComboColors();
 546             
 547             bool bFocus = (m_MouseOverThumb || this.Focused || this.DroppedDownInternal && this.DropDownStyle != ComboBoxStyle.Simple);
 548             if (bFocus && !this.Enabled)
 549                 bFocus = false;
 550 
 551             if (BarFunctions.IsOffice2007Style(this.Style) && GlobalManager.Renderer is Office2007Renderer)
 552             {
 553                 Office2007ComboBoxColorTable colorTable = ((Office2007Renderer)GlobalManager.Renderer).ColorTable.ComboBox;
 554                 Office2007ComboBoxStateColorTable stateColors = (IsToolbarStyle && !m_MouseOver ? colorTable.Default : colorTable.DefaultStandalone);
 555                 if (bFocus)
 556                 {
 557                     if (this.DroppedDown)
 558                         stateColors = colorTable.DroppedDown;
 559                     else if(bFocus)
 560                         stateColors = colorTable.MouseOver;
 561                 }
 562 
 563                 c.Background = stateColors.Background;
 564                 c.Border = stateColors.Border;
 565                 c.ThumbBackground = stateColors.ExpandBackground;
 566                 c.ThumbText = stateColors.ExpandText;
 567                 c.ThumbBorderOuter = stateColors.ExpandBorderOuter;
 568                 c.ThumbBorderInner = stateColors.ExpandBorderInner;
 569             }
 570             else
 571             {
 572                 ColorScheme cs = new ColorScheme(this.Style);
 573                 if (bFocus)
 574                 {
 575                     if (DroppedDownInternal)
 576                     {
 577                         c.ThumbBackground = new LinearGradientColorTable(cs.ItemPressedBackground, cs.ItemPressedBackground2, cs.ItemPressedBackgroundGradientAngle);
 578                         c.Border = cs.ItemPressedBorder;
 579                         c.ThumbText = cs.ItemPressedText;
 580                     }
 581                     else
 582                     {
 583                         if (m_MouseOverThumb)
 584                             c.ThumbBackground = new LinearGradientColorTable(cs.ItemHotBackground, cs.ItemHotBackground2, cs.ItemHotBackgroundGradientAngle);
 585                         else
 586                             c.ThumbBackground = new LinearGradientColorTable(cs.BarBackground, cs.BarBackground2, cs.BarBackgroundGradientAngle);
 587                         c.Border = cs.ItemHotBorder;
 588                         c.ThumbText = cs.ItemHotText;
 589                     }
 590                 }
 591                 else
 592                 {
 593                     c.ThumbBackground = new LinearGradientColorTable(cs.BarBackground, cs.BarBackground2, cs.BarBackgroundGradientAngle);
 594                     if (m_MouseOver || !IsToolbarStyle)
 595                     {
 596                         c.Border = cs.ItemHotBorder;
 597                     }
 598                 }
 599             }
 600 
 601             if (_FocusHighlightEnabled && this.Enabled && this.Focused)
 602                 c.Background = _FocusHighlightColor;
 603             else if (!this.Enabled)
 604             {
 605                 c.Background = _DisabledBackColor.IsEmpty ? SystemColors.Control : _DisabledBackColor;
 606                 c.ThumbText = _DisabledForeColor.IsEmpty ? SystemColors.ControlDark : _DisabledForeColor; ;
 607             }
 608 
 609             return c;
 610         }
 611         #endregion
 612 
 613         protected override void WndProc(ref Message m)
 614         {
 615             const int WM_PAINT = 0xF;
 616             const int WM_PRINTCLIENT = 0x0318;
 617             const int WM_CTLCOLORLISTBOX = 0x0134;
 618             const int CB_ADDSTRING = 0x143;
 619             const int CB_INSERTSTRING = 0x14A;
 620             const int CB_DELETESTRING = 0x0144;
 621 
 622             WinApi.RECT rect = new WinApi.RECT();
 623 
 624             if (m.Msg == WM_CTLCOLORLISTBOX)
 625             {
 626                 m_DropDownHandle = m.LParam;
 627                 if (m_DropDownHeight > 0)
 628                 {
 629                     WinApi.GetWindowRect(m.LParam, ref rect);
 630                     NativeFunctions.SetWindowPos(m.LParam, 0, rect.Left, rect.Top, rect.Right - rect.Left, m_DropDownHeight, NativeFunctions.SWP_NOACTIVATE | NativeFunctions.SWP_NOMOVE);
 631                 }
 632             }
 633             else if (m.Msg == (int)WinApi.WindowsMessages.CB_GETDROPPEDSTATE)
 634             {
 635                 base.WndProc(ref m);
 636                 if (m.Result == IntPtr.Zero)
 637                 {
 638                     if (DroppedDownInternal)
 639                     {
 640                         DroppedDownInternal = false;
 641                     }
 642                 }
 643                 return;
 644             }
 645             else if (m.Msg == NativeFunctions.WM_SETFOCUS)
 646             {
 647                 if (m.WParam != this.Handle)
 648                     m_LastFocusWindow = m.WParam;
 649             }
 650             else if (m.Msg == CB_ADDSTRING)
 651             {
 652                 if (this.Items.Count > 0)
 653                 {
 654                     ComboItem cb = this.Items[this.Items.Count - 1] as ComboItem;
 655                     if (cb != null)
 656                         cb.m_ComboBox = this;
 657                 }
 658             }
 659             else if (m.Msg == CB_INSERTSTRING)
 660             {
 661                 int index = m.WParam.ToInt32();
 662                 if (index >= 0 && index < this.Items.Count)
 663                 {
 664                     ComboItem cb = this.Items[index] as ComboItem;
 665                     if (cb != null)
 666                         cb.m_ComboBox = this;
 667                 }
 668                 m_SelectedIndexInternal = -1;
 669             }
 670             else if (m.Msg == CB_DELETESTRING)
 671             {
 672                 m_SelectedIndexInternal = -1;
 673             }
 674             else if (m.Msg == NativeFunctions.WM_USER + 7)
 675             {
 676                 if (this.DropDownStyle == ComboBoxStyle.DropDown && !m_Focused) this.SelectionLength = 0;
 677                 this.Invalidate(true);
 678                 return;
 679             }
 680             
 681             if (m_DefaultStyle)
 682             {
 683                 base.WndProc(ref m);
 684                 return;
 685             }
 686 
 687             if ((m.Msg == WM_PAINT || m.Msg == WM_PRINTCLIENT) && this.DrawMode != DrawMode.Normal)
 688             {
 689                 WinApi.GetWindowRect(m.HWnd, ref rect);
 690                 System.Drawing.Size controlSize = new Size(rect.Width, rect.Height);
 691 
 692                 WinApi.PAINTSTRUCT ps = new WinApi.PAINTSTRUCT();
 693                 IntPtr hdc = WinApi.BeginPaint(m.HWnd, ref ps);
 694                 try
 695                 {
 696                     Graphics g = Graphics.FromHdc(hdc);
 697                     try
 698                     {
 699                         PaintComboBox(g, controlSize);
 700                     }
 701                     finally
 702                     {
 703                         g.Dispose();
 704                     }
 705                 }
 706                 finally
 707                 {
 708                     WinApi.EndPaint(m.HWnd, ref ps);
 709                 }
 710 
 711                 if (this.Parent is ItemControl)
 712                     ((ItemControl)this.Parent).UpdateKeyTipsCanvas();
 713             }
 714             else
 715                 base.WndProc(ref m);
 716         }
 717 
 718         private void PaintComboBox(Graphics targetGraphics, System.Drawing.Size controlSize)
 719         {
 720             InternalComboColors colors = GetComboColors();
 721             Rectangle r = new Rectangle(Point.Empty, controlSize);
 722 
 723             BufferedBitmap bmp = new BufferedBitmap(targetGraphics, new Rectangle(0, 0, this.Width, this.Height));
 724             try
 725             {
 726                 Graphics g = bmp.Graphics;
 727 
 728                 PaintComboBackground(g, r, colors);
 729                 PaintComboBorder(g, r, colors);
 730                 Rectangle contentRect = PaintComboThumb(g, r, colors);
 731                 int selectedIndex = this.SelectedIndex == -1 ? -1 : m_SelectedIndexInternal;
 732                 if (m_SelectedIndexInternal == -1 && this.SelectedIndex >= 0) selectedIndex = this.SelectedIndex;
 733                 if (DropDownStyle == ComboBoxStyle.DropDownList && selectedIndex >= 0 && this.Items.Count > 0 && selectedIndex < this.Items.Count)
 734                 {
 735                     DrawItemState state = DrawItemState.ComboBoxEdit;
 736                     if (Focused)
 737                         state |= (DrawItemState.Focus | DrawItemState.Selected);
 738 
 739                     if (!Enabled) state = DrawItemState.Disabled | DrawItemState.ComboBoxEdit;
 740                     contentRect.Inflate(-1, -1);
 741                     this.OnDrawItem(new DrawItemEventArgs(g, this.Font, contentRect,
 742                         selectedIndex, state, this.ForeColor, this.BackColor));
 743                 }
 744                 if (this.ShouldDrawWatermark() && this.DropDownStyle == ComboBoxStyle.DropDownList)
 745                     DrawWatermark(g);
 746 
 747                 bmp.Render(targetGraphics);
 748             }
 749             finally
 750             {
 751                 bmp.Dispose();
 752             }
 753         }
 754 
 755         private Rectangle PaintComboThumb(Graphics g, Rectangle r, InternalComboColors colors)
 756         {
 757             Rectangle contentRect = r;
 758             contentRect.Inflate(-2, -2);
 759 
 760             if (this.DropDownStyle == ComboBoxStyle.Simple) return contentRect;
 761             
 762             int thumbWidth = SystemInformation.HorizontalScrollBarThumbWidth;
 763             Rectangle thumbRect = new Rectangle(r.Width - thumbWidth, r.Y, thumbWidth, r.Height);
 764             if (RightToLeft == RightToLeft.Yes)
 765                 thumbRect = new Rectangle(r.X + 1, r.Y + 1, thumbWidth, r.Height - 2);
 766             if (!this.IsToolbarStyle)
 767             {
 768                 thumbRect.Y += 2;
 769                 thumbRect.Height -= 4;
 770                 thumbRect.Width -= 2; ;
 771                 if (RightToLeft == RightToLeft.Yes)
 772                     thumbRect.X += 2;
 773             }
 774             else if (!BarFunctions.IsOffice2007Style(this.Style))
 775                 thumbRect.Inflate(-1, -1);
 776 
 777             if (RightToLeft == RightToLeft.Yes)
 778             {
 779                 int diff = thumbRect.Right - contentRect.X + 2;
 780                 contentRect.Width -= diff;
 781                 contentRect.X += diff;
 782             }
 783             else
 784             {
 785                 int diff = contentRect.Right - thumbRect.X + 2;
 786                 contentRect.Width -= diff;
 787             }
 788             //contentRect.Y++;
 789             //contentRect.Height--;
 790 
 791             if (!this.IsToolbarStyle && BarFunctions.IsOffice2007Style(this.Style))
 792             {
 793                 Office2007ButtonItemPainter.PaintBackground(g, GetOffice2007StateColorTable(), thumbRect, RoundRectangleShapeDescriptor.RectangleShape);
 794             }
 795             else
 796             {
 797                 if (colors.ThumbBackground != null)
 798                     DisplayHelp.FillRectangle(g, thumbRect, colors.ThumbBackground);
 799                 if (colors.ThumbBorderOuter != null)
 800                     DisplayHelp.DrawGradientRectangle(g, thumbRect, colors.ThumbBorderOuter, 1);
 801                 Rectangle innerBorder = thumbRect;
 802                 innerBorder.Inflate(-1, -1);
 803                 if (colors.ThumbBorderInner != null)
 804                     DisplayHelp.DrawGradientRectangle(g, innerBorder, colors.ThumbBorderInner, 1);
 805             }
 806 
 807             using(SolidBrush brush=new SolidBrush(colors.ThumbText))
 808                 DrawArrow(thumbRect, g, brush);
 809 
 810             m_ThumbRect = thumbRect;
 811             return contentRect;
 812         }
 813 
 814         [Browsable(false)]
 815         public bool IsToolbarStyle
 816         {
 817             get { return !m_IsStandalone; }
 818         }
 819 
 820         protected Office2007ButtonItemStateColorTable GetOffice2007StateColorTable()
 821         {
 822             bool bFocus = (m_MouseOverThumb || this.DroppedDownInternal && this.DropDownStyle != ComboBoxStyle.Simple);
 823 
 824             if (GlobalManager.Renderer is Office2007Renderer)
 825             {
 826                 Office2007ColorTable ct = ((Office2007Renderer)GlobalManager.Renderer).ColorTable;
 827                 Office2007ButtonItemColorTable buttonColorTable = ct.ButtonItemColors[Enum.GetName(typeof(eButtonColor), eButtonColor.OrangeWithBackground)];
 828                 if (!this.Enabled)
 829                     return buttonColorTable.Disabled;
 830                 else if (this.DroppedDownInternal)
 831                     return buttonColorTable.Checked;
 832                 else if (bFocus)
 833                     return buttonColorTable.MouseOver;
 834                 else
 835                     return buttonColorTable.Default;
 836             }
 837 
 838             return null;
 839         }
 840 
 841         private void PaintComboBorder(Graphics g, Rectangle controlBounds, InternalComboColors colors)
 842         {
 843             DisplayHelp.DrawRectangle(g, colors.Border, controlBounds);
 844         }
 845 
 846         private void PaintComboBackground(Graphics g, Rectangle controlBounds, InternalComboColors colors)
 847         {
 848             DisplayHelp.FillRectangle(g, controlBounds, colors.Background);
 849         }
 850 
 851         private bool ShouldDrawWatermark()
 852         {
 853             if (_WatermarkEnabled && this.Enabled && (!this.Focused || _WatermarkBehavior== eWatermarkBehavior.HideNonEmpty) && this.Text == "" && this.SelectedIndex == -1)
 854                 return true;
 855             return false;
 856         }
 857 
 858         private void DrawWatermark(Graphics g)
 859         {
 860             if (m_TextMarkup != null)
 861             {
 862                 MarkupDrawContext dc = GetMarkupDrawContext(g);
 863                 m_TextMarkup.Render(dc);
 864             }
 865             else
 866             {
 867                 eTextFormat tf = eTextFormat.Left | eTextFormat.VerticalCenter;
 868 
 869                 if (this.RightToLeft == RightToLeft.Yes) tf |= eTextFormat.RightToLeft;
 870                 //if (this.TextAlign == HorizontalAlignment.Left)
 871                 //    tf |= eTextFormat.Left;
 872                 //else if (this.TextAlign == HorizontalAlignment.Right)
 873                 //    tf |= eTextFormat.Right;
 874                 //else if (this.TextAlign == HorizontalAlignment.Center)
 875                 //    tf |= eTextFormat.HorizontalCenter;
 876                 tf |= eTextFormat.EndEllipsis;
 877                 tf |= eTextFormat.WordBreak;
 878                 TextDrawing.DrawString(g, m_WatermarkText, (m_WatermarkFont == null ? this.Font : m_WatermarkFont),
 879                     m_WatermarkColor, GetWatermarkBounds(), tf);
 880             }
 881         }
 882 
 883         private Rectangle GetWatermarkBounds()
 884         {
 885             if (this.DropDownStyle != ComboBoxStyle.DropDownList && m_TextWindowMsgHandler!=null)
 886             {
 887                 WinApi.RECT rect = new WinApi.RECT();
 888                 WinApi.GetWindowRect(m_TextWindowMsgHandler.Handle, ref rect);
 889                 return new Rectangle(0, 0, rect.Width, rect.Height);
 890             }
 891 
 892             Rectangle r = new Rectangle(2, 0, this.Width - 2, this.Height);
 893             r.Inflate(-2, -1);
 894             int thumbSize = SystemInformation.HorizontalScrollBarThumbWidth;
 895             r.Width -= thumbSize;
 896             if (this.RightToLeft == RightToLeft.Yes)
 897                 r.X += thumbSize;
 898 
 899             return r;
 900         }
 901 
 902         //private void CreateListBoxMsgHandler(IntPtr m_DropDownHandle)
 903         //{
 904         //    DisposeListBoxMsgHandler();
 905         //    m_ListBoxMsgHandler = new ComboListBoxMsgHandler();
 906         //    m_ListBoxMsgHandler.AssignHandle(m_DropDownHandle);
 907         //}
 908 
 909         //private void DisposeListBoxMsgHandler()
 910         //{
 911         //    if (m_ListBoxMsgHandler != null)
 912         //    {
 913         //        m_ListBoxMsgHandler.ReleaseHandle();
 914         //        m_ListBoxMsgHandler = null;
 915         //    }
 916         //}
 917 
 918         private void DrawArrow(Rectangle r, Graphics g, Brush b)
 919         {
 920             Point[] p=new Point[3];
 921             p[0].X=r.Left+(r.Width-4)/2;
 922             p[0].Y=r.Top+(r.Height-3)/2 + 1;
 923             p[1].X=p[0].X+5;
 924             p[1].Y=p[0].Y;
 925             p[2].X=p[0].X+2;
 926             p[2].Y=p[0].Y+3;
 927             g.FillPolygon(b,p);
 928         }
 929 
 930         /*private void OnTimer(object sender, EventArgs e)
 931         {
 932             bool bRefresh=false;
 933 
 934             if(m_DroppedDown && !this.DroppedDown)
 935             {
 936                 m_DroppedDown=false;
 937                 
 938                 if(DropDownChange!=null)
 939                     this.DropDownChange(this,false);
 940 
 941                 m_DropDownHandle=IntPtr.Zero;
 942                 bRefresh=true;
 943             }
 944 
 945             Point mousePos=this.PointToClient(Control.MousePosition);
 946             if(!this.ClientRectangle.Contains(mousePos))
 947             {
 948                 if(m_MouseOver && !m_DroppedDown)
 949                 {
 950                     m_MouseOver=false;
 951                     bRefresh=true;
 952                 }
 953             }
 954             else if(!m_MouseOver)
 955             {
 956                 m_MouseOver=true;
 957                 bRefresh=true;
 958             }
 959 
 960             if(bRefresh)
 961                 this.Refresh();
 962         }*/
 963 
 964         protected override void OnVisibleChanged(EventArgs e)
 965         {
 966             base.OnVisibleChanged(e);
 967             m_MouseOver=false;
 968             if (this.DropDownStyle == ComboBoxStyle.DropDown && this.Items.Count > 0 && this.Items[0] is ComboItem && this.DisplayMember!="")
 969             {
 970                 string s = this.DisplayMember;
 971                 this.DisplayMember = "";
 972                 this.DisplayMember = s;
 973             }
 974             if (this.IsHandleCreated && !this.IsDisposed)
 975             {
 976                 UpdateBackColor();
 977             }
 978         }
 979 
 980         private int m_SelectedIndexInternal = -1;
 981 
 982         protected override void OnSelectedIndexChanged(EventArgs e)
 983         {
 984             m_SelectedIndexInternal = this.SelectedIndex;
 985             
 986             if(!this.DroppedDownInternal)
 987             {
 988                 if(DroppedDownInternal)
 989                 {
 990                     DroppedDownInternal=false;
 991                 }
 992                 if(!m_MouseOver)
 993                     this.Invalidate(true);
 994             }
 995             if (this.SelectedIndex == -1 && _WatermarkBehavior == eWatermarkBehavior.HideNonEmpty && m_WatermarkText.Length > 0 && this.Text == "")
 996                 this.Invalidate(true);
 997             else if (this.DropDownStyle == ComboBoxStyle.DropDownList)
 998                 this.Invalidate();
 999             
1000             base.OnSelectedIndexChanged(e);
1001 
1002             ExecuteCommand();
1003         }
1004 
1005         protected override void OnTextChanged(EventArgs e)
1006         {
1007             if (this.SelectedIndex == -1 && _WatermarkBehavior == eWatermarkBehavior.HideNonEmpty && m_WatermarkText.Length > 0 && this.Text == "")
1008                 this.Invalidate(true);
1009             base.OnTextChanged(e);
1010         }
1011 
1012         /*protected override void OnEnabledChanged(EventArgs e)
1013         {
1014             base.OnEnabledChanged(e);
1015             SyncTimerEnabled();
1016         }*/
1017 
1018         /*private void SyncTimerEnabled()
1019         {
1020             if(this.Visible)
1021             {
1022                 if(!m_Timer.Enabled && this.Enabled && !this.DesignMode)
1023                     m_Timer.Enabled=true;
1024             }
1025             else
1026             {
1027                 if(m_Timer.Enabled)
1028                     m_Timer.Enabled=false;
1029             }
1030         }*/
1031 
1032         /// <summary> 
1033         /// Clean up any resources being used.
1034         /// </summary>
1035         protected override void Dispose( bool disposing )
1036         {
1037             /*if(m_Timer!=null)
1038             {
1039                 if(m_Timer.Enabled)
1040                     m_Timer.Enabled=false;
1041                 m_Timer.Dispose();
1042                 m_Timer=null;
1043             }*/
1044             if (m_MouseOverTimer != null)
1045             {
1046                 m_MouseOverTimer.Enabled = false;
1047                 m_MouseOverTimer.Dispose();
1048                 m_MouseOverTimer = null;
1049             }
1050             m_DisableInternalDrawing=true;
1051             if(m_TextWindowMsgHandler!=null)
1052             {
1053                 m_TextWindowMsgHandler.ReleaseHandle();
1054                 m_TextWindowMsgHandler=null;
1055             }
1056             base.Dispose( disposing );
1057         }
1058 
1059         protected override void OnFontChanged(EventArgs e)
1060         {
1061             base.OnFontChanged(e);
1062             if(this.Disposing || this.IsDisposed)
1063                 return;
1064             if(!m_DisableInternalDrawing && this.DrawMode==DrawMode.OwnerDrawFixed)
1065             {
1066                 if(this.IsHandleCreated && this.Parent!=null && !this.Parent.IsDisposed)
1067                     this.ItemHeight=this.FontHeight + 1;
1068             }
1069         }
1070 
1071         internal int GetFontHeight()
1072         {
1073             return this.FontHeight;
1074         }
1075 
1076         protected override void OnMeasureItem(MeasureItemEventArgs e)
1077         {
1078             base.OnMeasureItem(e);
1079             if(!m_DisableInternalDrawing)
1080             {
1081                 if(this.DrawMode==DrawMode.OwnerDrawFixed)
1082                 {
1083                     e.ItemHeight = this.ItemHeight - 2;
1084                 }
1085                 else
1086                 {
1087                     object o=this.Items[e.Index];
1088                     if(o is ComboItem)
1089                     {
1090                         if(((ComboItem)o).IsFontItem)
1091                             MeasureFontItem(e);
1092                         else
1093                         {
1094                             Size sz=GetComboItemSize(o as ComboItem);
1095                             e.ItemHeight=sz.Height;
1096                             e.ItemWidth=sz.Width;
1097                             if (BarFunctions.IsOffice2007Style(m_Style))
1098                             {
1099                                 e.ItemHeight += 6;
1100                                 e.ItemWidth += 6;
1101                             }
1102                         }
1103                     }
1104                 }
1105             }
1106         }
1107 
1108         protected override void OnDrawItem(DrawItemEventArgs e)
1109         {
1110             base.OnDrawItem(e);
1111             InternalDrawItem(e);
1112         }
1113 
1114         private void InternalDrawItem(DrawItemEventArgs e)
1115         {
1116             if(!m_DisableInternalDrawing && e.Index>=0)
1117             {
1118                 object o=this.Items[e.Index];
1119                 if(o is ComboItem)
1120                     DrawComboItem(e);
1121                 else
1122                     DrawObjectItem(e);
1123             }
1124         }
1125 
1126         protected virtual Size GetComboItemSize(ComboItem item)
1127         {
1128             Size size=Size.Empty;
1129             if(BarFunctions.IsHandleValid(this))
1130             {
1131                 Graphics g=this.CreateGraphics();
1132                 try
1133                 {
1134                     size=GetComboItemSize(item, g);
1135                 }
1136                 finally
1137                 {
1138                     g.Dispose();
1139                 }
1140             }
1141             return size;
1142         }
1143 
1144         protected virtual void DrawObjectItem(DrawItemEventArgs e)
1145         {
1146             Graphics g=e.Graphics;
1147             string text=GetItemText(this.Items[e.Index]);
1148             Color textColor = Color.Empty;
1149             Office2007ButtonItemStateColorTable ct = null;
1150             
1151             if (BarFunctions.IsOffice2007Style(m_Style))
1152             {
1153                 Office2007ButtonItemColorTable bct = ((Office2007Renderer)GlobalManager.Renderer).ColorTable.ButtonItemColors[0];
1154                 if ((e.State & DrawItemState.Selected) != 0 || (e.State & DrawItemState.HotLight) != 0)
1155                     ct = bct.MouseOver;
1156                 else if ((e.State & DrawItemState.Disabled) != 0 || !this.Enabled)
1157                     ct = bct.Disabled;
1158                 else
1159                     ct = bct.Default;
1160 
1161                 //if (ct != null)
1162                 //    textColor = ct.Text;
1163                 if ((e.State & DrawItemState.Disabled) != 0 || !this.Enabled)
1164                     textColor = _DisabledForeColor.IsEmpty ? SystemColors.ControlDark : _DisabledForeColor;
1165                 else
1166                     textColor = this.ForeColor;
1167 
1168                 if ((e.State & DrawItemState.HotLight) != 0 || (e.State & DrawItemState.Selected) != 0)
1169                 {
1170                     Rectangle r = e.Bounds;
1171                     r.Width--;
1172                     r.Height--;
1173                     Office2007ButtonItemPainter.PaintBackground(g, ct, r, RoundRectangleShapeDescriptor.RoundCorner2);
1174                 }
1175                 else
1176                     e.DrawBackground();
1177             }
1178             else
1179             {
1180                 e.DrawBackground();
1181 
1182                 if ((e.State & DrawItemState.HotLight) != 0 || (e.State & DrawItemState.Selected) != 0)
1183                 {
1184                     g.FillRectangle(SystemBrushes.Highlight, e.Bounds);
1185                     textColor = SystemColors.HighlightText;
1186                 }
1187                 else if ((e.State & DrawItemState.Disabled) != 0 || (e.State & DrawItemState.Grayed) != 0)
1188                     textColor = _DisabledForeColor.IsEmpty ? SystemColors.ControlDark : _DisabledForeColor;
1189                 else
1190                     textColor = SystemColors.ControlText;
1191             }
1192 
1193             if((e.State & DrawItemState.Focus)!=0)
1194                 DrawFocusRectangle(e);
1195             Rectangle rText = e.Bounds;
1196             
1197             if ((e.State & DrawItemState.ComboBoxEdit) == DrawItemState.ComboBoxEdit)
1198             {
1199                 //rText.Inflate(-1, 0);
1200                 
1201             }
1202             else if (BarFunctions.IsOffice2007Style(m_Style))
1203                 rText.Inflate(-3, 0);
1204             else
1205                 rText.Inflate(-2, 0);
1206 
1207             TextDrawing.DrawString(g,text,this.Font,textColor,rText,eTextFormat.Default | eTextFormat.NoClipping | eTextFormat.NoPrefix);
1208         }
1209 
1210         private void DrawFocusRectangle(DrawItemEventArgs e)
1211         {
1212             if (_FocusCuesEnabled && ((e.State & DrawItemState.Focus) == DrawItemState.Focus) && ((e.State & DrawItemState.NoFocusRect) != DrawItemState.NoFocusRect))
1213             {
1214                 Rectangle r = e.Bounds;
1215                 //r.Width--;
1216                 //r.Height--;
1217                 ControlPaint.DrawFocusRectangle(e.Graphics, r, e.ForeColor, e.BackColor);
1218             }
1219         }
1220 
1221         private Color _DisabledForeColor = Color.Empty;
1222         /// <summary>
1223         /// Gets or sets the text color for the text in combo-box when control Enabled property is set to false.
1224         /// Setting this property is effective only for DropDownList ComboBox style.
1225         /// </summary>
1226         [Category("Appearance"), Description("Indicates text color for the text in combo-box when control Enabled property is set to false. Setting this property is effective only for DropDownList ComboBox style.")]
1227         public Color DisabledForeColor
1228         {
1229             get { return _DisabledForeColor; }
1230             set 
1231             { 
1232                 _DisabledForeColor = value;
1233                 if (!this.Enabled)
1234                     this.Invalidate();
1235             }
1236         }
1237         [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
1238         public bool ShouldSerializeDisabledForeColor()
1239         {
1240             return !_DisabledForeColor.IsEmpty;
1241         }
1242         [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
1243         public void ResetDisabledForeColor()
1244         {
1245             DisabledForeColor = Color.Empty;
1246         }
1247 
1248         private Color _DisabledBackColor = Color.Empty;
1249         /// <summary>
1250         /// Gets or sets the control background color when control is disabled. Default value is an empty color which indicates that system background color is used when control is disabled.
1251         /// </summary>
1252         [Description("Indicates control background color when control is disabled"), Category("Appearance")]
1253         public Color DisabledBackColor
1254         {
1255             get { return _DisabledBackColor; }
1256             set
1257             {
1258                 if (_DisabledBackColor != value)
1259                 {
1260                     _DisabledBackColor = value;
1261                     if (!this.Enabled) this.Invalidate();
1262                 }
1263             }
1264         }
1265         [EditorBrowsable(EditorBrowsableState.Never)]
1266         public bool ShouldSerializeDisabledBackColor()
1267         {
1268             return !_DisabledBackColor.IsEmpty;
1269         }
1270         [EditorBrowsable(EditorBrowsableState.Never)]
1271         public void ResetDisabledBackColor()
1272         {
1273             DisabledBackColor = Color.Empty;
1274         }
1275 
1276         protected virtual void DrawComboItem(DrawItemEventArgs e)
1277         {
1278             ComboItem item=this.Items[e.Index] as ComboItem;
1279             if(item.IsFontItem)
1280             {
1281                 this.DrawFontItem(e);
1282                 return;
1283             }
1284 
1285             Graphics g=e.Graphics;
1286             Image img=null;
1287             Color clr;
1288             Color textColor = item.ForeColor;
1289             if (textColor.IsEmpty || (e.State & DrawItemState.Selected) != 0 || (e.State & DrawItemState.HotLight) != 0)
1290                 textColor = this.ForeColor;
1291 
1292             if (item.ImageIndex >= 0 && m_ImageList != null && m_ImageList.Images.Count > item.ImageIndex)
1293                 img = m_ImageList.Images[item.ImageIndex];
1294             else if (item.Image != null)
1295                 img = item.Image;
1296 
1297             Office2007ButtonItemStateColorTable ct = null;
1298             if (BarFunctions.IsOffice2007Style(m_Style))
1299             {
1300                 Office2007ButtonItemColorTable bct = ((Office2007Renderer)GlobalManager.Renderer).ColorTable.ButtonItemColors[0];
1301                 if ((e.State & DrawItemState.Selected) != 0 || (e.State & DrawItemState.HotLight) != 0)
1302                     ct = bct.MouseOver;
1303                 else if ((e.State & DrawItemState.Disabled) != 0 || !this.Enabled)
1304                     ct = bct.Disabled;
1305                 else
1306                     ct = bct.Default;
1307                 //if (ct == null)
1308                 if (!this.Enabled)
1309                     textColor = _DisabledForeColor.IsEmpty ? SystemColors.ControlDark : _DisabledForeColor;
1310                 //else
1311                 //    textColor = SystemColors.ControlText;
1312                 //else
1313                   //  textColor = ct.Text;
1314             }
1315 
1316             int contWidth=this.DropDownWidth;
1317             if(item.ImagePosition!=HorizontalAlignment.Center && img!=null)
1318             {
1319                 contWidth-=img.Width;
1320                 if(contWidth<=0)
1321                     contWidth=this.DropDownWidth;
1322             }
1323 
1324             // Back Color
1325             if((e.State & DrawItemState.Selected)!=0 || (e.State & DrawItemState.HotLight)!=0)
1326             {
1327                 if (BarFunctions.IsOffice2007Style(m_Style))
1328                     Office2007ButtonItemPainter.PaintBackground(g, ct, e.Bounds, RoundRectangleShapeDescriptor.RoundCorner2);
1329                 else
1330                     e.DrawBackground();
1331                 DrawFocusRectangle(e);
1332             }
1333             else
1334             {
1335                 clr=item.BackColor;
1336                 if(item.BackColor.IsEmpty)
1337                     clr=e.BackColor;
1338                 g.FillRectangle(new SolidBrush(clr),e.Bounds);
1339             }
1340 
1341             // Draw Image
1342             Rectangle rImg=e.Bounds;
1343             Rectangle rText=e.Bounds;
1344             //if (e.State != DrawItemState.ComboBoxEdit)
1345             {
1346                 if ((e.State & DrawItemState.ComboBoxEdit) == DrawItemState.ComboBoxEdit)
1347                 {
1348                     if (img != null)
1349                     {
1350                         rText.X += 3;
1351                         rText.Width -= 3;
1352                     }
1353                     //rText.Inflate(-1, 0);
1354                     //rText.Y++;
1355                     //rText.Height--;
1356                 }
1357                 else if (BarFunctions.IsOffice2007Style(m_Style))
1358                     rText.Inflate(-3, 0);
1359                 else
1360                     rText.Inflate(-2, 0);
1361             }
1362             if(img!=null)
1363             {
1364                 rImg.Width=img.Width;
1365                 rImg.Height=img.Height;
1366                 if(item.ImagePosition==HorizontalAlignment.Left)
1367                 {
1368                     // Left
1369                     if(e.Bounds.Height>img.Height)
1370                         rImg.Y+=(e.Bounds.Height-img.Height)/2;
1371                     rText.Width-=rImg.Width;
1372                     rText.X+=rImg.Width;
1373                 }
1374                 else if(item.ImagePosition==HorizontalAlignment.Right)
1375                 {
1376                     // Right
1377                     if(e.Bounds.Height>img.Height)
1378                         rImg.Y+=(e.Bounds.Height-img.Height)/2;
1379                     rImg.X=e.Bounds.Right-img.Width;
1380                     rText.Width-=rImg.Width;
1381                 }
1382                 else
1383                 {
1384                     // Center
1385                     rImg.X+=(e.Bounds.Width-img.Width)/2;
1386                     rText.Y=rImg.Bottom;
1387                 }
1388                 g.DrawImage(img,rImg);
1389             }
1390             
1391             // Draw Text
1392             if(item.Text!="")
1393             {
1394                 System.Drawing.Font f=e.Font;
1395                 bool bDisposeFont=false;
1396                 try
1397                 {
1398                     if(item.FontName!="")
1399                     {
1400                         f=new Font(item.FontName,item.FontSize,item.FontStyle);
1401                         bDisposeFont=true;
1402                     }
1403                     else if(item.FontStyle!=f.Style)
1404                     {
1405                         f = new Font(f, item.FontStyle);
1406                         bDisposeFont=true;
1407                     }
1408                 }
1409                 catch
1410                 {
1411                     f=e.Font;
1412                     if(f==null)
1413                     {
1414                         f=System.Windows.Forms.SystemInformation.MenuFont.Clone() as Font;
1415                         bDisposeFont=true;
1416                     }
1417                 }
1418 
1419                 eTextFormat format = eTextFormat.Default | eTextFormat.NoClipping | eTextFormat.NoPrefix;
1420                 if (item.TextFormat.Alignment == StringAlignment.Center)
1421                     format = eTextFormat.HorizontalCenter;
1422                 else if (item.TextFormat.Alignment == StringAlignment.Far)
1423                     format = eTextFormat.Right;
1424                 if (item.TextLineAlignment == StringAlignment.Center)
1425                     format |= eTextFormat.VerticalCenter;
1426                 else if (item.TextLineAlignment == StringAlignment.Far)
1427                     format |= eTextFormat.Bottom;
1428                 TextDrawing.DrawString(g, item.Text, f, textColor, rText, format);
1429                 
1430                 if(bDisposeFont)
1431                     f.Dispose();
1432             }
1433             
1434         }
1435 
1436         protected virtual Size GetComboItemSize(ComboItem item, Graphics g)
1437         {
1438             if(this.DrawMode==DrawMode.OwnerDrawFixed)
1439                 return new Size(this.DropDownWidth,this.ItemHeight);
1440 
1441             Size sz=Size.Empty;
1442             Size textSize=Size.Empty;
1443             Image img=null;
1444             if(item.ImageIndex>=0)
1445                 img=m_ImageList.Images[item.ImageIndex];
1446             else if(item.Image!=null)
1447                 img=item.Image;
1448             
1449             int contWidth=this.DropDownWidth;
1450             if(item.ImagePosition!=HorizontalAlignment.Center && img!=null)
1451             {
1452                 contWidth-=img.Width;
1453                 if(contWidth<=0)
1454                     contWidth=this.DropDownWidth;
1455             }
1456             
1457             Font font=this.Font;
1458             if(item.FontName!="")
1459             {
1460                 try
1461                 {
1462                     font=new Font(item.FontName,item.FontSize,item.FontStyle);
1463                 }
1464                 catch
1465                 {
1466                     font=this.Font;
1467                 }
1468             }
1469 
1470             eTextFormat format = eTextFormat.Default;
1471             if (item.TextFormat.Alignment == StringAlignment.Center)
1472                 format = eTextFormat.HorizontalCenter;
1473             else if (item.TextFormat.Alignment == StringAlignment.Far)
1474                 format = eTextFormat.Right;
1475             if (item.TextLineAlignment == StringAlignment.Center)
1476                 format |= eTextFormat.VerticalCenter;
1477             else if (item.TextLineAlignment == StringAlignment.Far)
1478                 format |= eTextFormat.Bottom;
1479 
1480             textSize=TextDrawing.MeasureString(g,item.Text,font,this.DropDownWidth,format);
1481             textSize.Width += 2;
1482             sz.Width=textSize.Width;
1483             sz.Height=textSize.Height;
1484             if(sz.Width<this.DropDownWidth)
1485                 sz.Width=this.DropDownWidth;
1486 
1487             if(item.ImagePosition==HorizontalAlignment.Center && img!=null)
1488                 sz.Height+=img.Height;
1489             else if(img!=null && img.Height>sz.Height)
1490                 sz.Height=img.Height;
1491 
1492             return sz;
1493         }
1494 
1495         /// <summary>
1496         /// Loads all fonts available on system into the combo box.
1497         /// </summary>
1498         public void LoadFonts()
1499         {
1500             this.Items.Clear();
1501 
1502             System.Drawing.Text.InstalledFontCollection colInstalledFonts = new System.Drawing.Text.InstalledFontCollection();
1503             FontFamily[] aFamilies = colInstalledFonts.Families;
1504             foreach(FontFamily ff in aFamilies)
1505             {
1506                 ComboItem item=new ComboItem();
1507                 item.IsFontItem=true;
1508                 item.FontName=ff.GetName(0);
1509                 item.FontSize=this.Font.Size;
1510                 item.Text=ff.GetName(0);
1511                 this.Items.Add(item);
1512             }
1513             this.DropDownWidth=this.Width*2;
1514         }
1515 
1516         private void DrawFontItem(DrawItemEventArgs e)
1517         {
1518             FontStyle[] styles=new FontStyle[4]{FontStyle.Regular,FontStyle.Bold,FontStyle.Italic,FontStyle.Bold | FontStyle.Italic};
1519             if (!BarFunctions.IsOffice2007Style(m_Style))
1520                 e.DrawBackground();
1521             string fontname = this.Items[e.Index].ToString();
1522             FontFamily family = new FontFamily(fontname);
1523 
1524             int iWidth = this.DropDownWidth/2-4;
1525             if(iWidth<=0)
1526                 iWidth=this.Width;
1527             foreach(FontStyle style in styles)
1528             {
1529                 if(family.IsStyleAvailable(style))
1530                 {
1531                     eTextFormat format = eTextFormat.Default | eTextFormat.NoPrefix;
1532                     Color textColor = (e.State & DrawItemState.Selected) != 0 ? SystemColors.HighlightText : SystemColors.ControlText;
1533 
1534                     Office2007ButtonItemStateColorTable ct = null;
1535                     if (BarFunctions.IsOffice2007Style(m_Style))
1536                     {
1537                         Office2007ButtonItemColorTable bct = ((Office2007Renderer)GlobalManager.Renderer).ColorTable.ButtonItemColors[0];
1538                         if ((e.State & DrawItemState.Selected) != 0 || (e.State & DrawItemState.HotLight) != 0)
1539                             ct = bct.MouseOver;
1540                         else if ((e.State & DrawItemState.Disabled) != 0 || !this.Enabled)
1541                             ct = bct.Disabled;
1542                         else
1543                             ct = bct.Default;
1544                         //if (ct == null)
1545                         if (!this.Enabled)
1546                             textColor = _DisabledForeColor.IsEmpty ? SystemColors.ControlDark : _DisabledForeColor;
1547                         else
1548                             textColor = SystemColors.ControlText;
1549 
1550                         if ((e.State & DrawItemState.Selected) != 0 || (e.State & DrawItemState.HotLight) != 0)
1551                             Office2007ButtonItemPainter.PaintBackground(e.Graphics, ct, e.Bounds, RoundRectangleShapeDescriptor.RoundCorner2);
1552                         else
1553                         {
1554                             e.DrawBackground();
1555                         }
1556                     }
1557 
1558                     if ((e.State & DrawItemState.ComboBoxEdit) == DrawItemState.ComboBoxEdit)
1559                     {
1560                         Rectangle rt = e.Bounds;
1561                         //rt.Y += 1;
1562                         //rt.Height -= 1;
1563                         TextDrawing.DrawString(e.Graphics, fontname, this.Font, textColor, rt, format);
1564                     }
1565                     else
1566                     {
1567                         Size szFont = TextDrawing.MeasureString(e.Graphics, fontname, this.Font);
1568                         int iDiff = (int)((e.Bounds.Height - szFont.Height) / 2);
1569                         Rectangle rFontName = new Rectangle(e.Bounds.X, e.Bounds.Y + iDiff, 
1570                             ((e.State & DrawItemState.Disabled)==DrawItemState.Disabled?e.Bounds.Width: Math.Max(e.Bounds.Width - 100, 32)), e.Bounds.Height - iDiff);
1571                         TextDrawing.DrawString(e.Graphics, fontname, this.Font, textColor, rFontName, format);
1572                         Rectangle rRemainder = new Rectangle(e.Bounds.X + iWidth + 4, e.Bounds.Y, e.Bounds.Width + 100, e.Bounds.Height);
1573                         Font f = new Font(family, (float)e.Bounds.Height - 8, style);
1574                         TextDrawing.DrawString(e.Graphics, fontname, f, textColor, rRemainder, format);
1575                     }
1576                     break;
1577                 }
1578             }
1579         }
1580 
1581         private void MeasureFontItem(MeasureItemEventArgs e)
1582         {
1583             e.ItemHeight = 18;
1584         }
1585 
1586 #if !FRAMEWORK20
1587         /// <summary>
1588         /// Specifies the height of the drop-down portion of combo box.
1589         /// </summary>
1590         [Browsable(true),Category("Behavior"),Description("The height, in pixels, of drop down box in a combo box."), DefaultValue(0)]
1591         public int DropDownHeight
1592         {
1593             get
1594             {
1595                 return m_DropDownHeight;
1596             }
1597             set
1598             {
1599                 m_DropDownHeight=value;
1600             }
1601         }
1602 #endif
1603 
1604         /// <summary>
1605         /// Releases the focus from combo box. The control that last had focus will receive focus back when this method is called.
1606         /// </summary>
1607         public void ReleaseFocus()
1608         {
1609             if(this.Focused && m_LastFocusWindow!=IntPtr.Zero)
1610             {
1611                 Control ctrl=Control.FromChildHandle(new System.IntPtr(m_LastFocusWindow.ToInt32()));
1612                 if(ctrl!=this)
1613                 {
1614                     if(ctrl!=null)
1615                         ctrl.Focus();
1616                     else
1617                     {
1618                         NativeFunctions.SetFocus(m_LastFocusWindow.ToInt32());
1619                     }
1620                     this.OnLostFocus(new System.EventArgs());
1621                 }
1622                 m_LastFocusWindow=IntPtr.Zero;
1623                 
1624             }
1625         }
1626 
1627         protected override bool ProcessCmdKey(ref Message msg,Keys keyData)
1628         {
1629             if(keyData==Keys.Enter && m_PreventEnterBeep)
1630             {
1631                 this.OnKeyPress(new KeyPressEventArgs((char)13));
1632                 return true;
1633             }
1634             return base.ProcessCmdKey(ref msg, keyData);
1635         }
1636 
1637         protected override void OnKeyDown(KeyEventArgs e)
1638         {
1639             if (!IsStandalone)
1640             {
1641                 if (e.KeyCode == Keys.Enter)
1642                     ReleaseFocus();
1643                 else if (e.KeyCode == Keys.Escape)
1644                 {
1645                     ReleaseFocus();
1646                 }
1647             }
1648 
1649             base.OnKeyDown(e);
1650         }
1651 
1652         /// <summary>
1653         /// Gets the window handle that the drop down list is bound to.
1654         /// </summary>
1655         [Browsable(false)]
1656         public IntPtr DropDownHandle
1657         {
1658             get
1659             {
1660                 return m_DropDownHandle;
1661             }
1662         }
1663 
1664         internal bool MouseOver
1665         {
1666             get
1667             {
1668                 return m_MouseOver;
1669             }
1670             set
1671             {
1672                 if(m_MouseOver!=value)
1673                 {
1674                     m_MouseOver=value;
1675                     this.Invalidate(true);
1676                 }
1677             }
1678         }
1679 
1680         [System.ComponentModel.Editor(typeof(Endv.Editors.ComboItemsEditor), typeof(System.Drawing.Design.UITypeEditor)), Localizable(true)]
1681         public new ComboBox.ObjectCollection Items
1682         {
1683             get
1684             {
1685                 return base.Items;
1686             }
1687         }
1688 
1689         protected override void OnEnabledChanged(EventArgs e)
1690         {
1691             UpdateBackColor();
1692             base.OnEnabledChanged(e);
1693         }
1694 
1695         private void UpdateBackColor()
1696         {
1697             if (!m_UseCustomBackColor)
1698             {
1699                 Color c = GetComboColors().Background;
1700                 if (this.BackColor != c)
1701                     this.BackColor = c;
1702             }
1703         }
1704 
1705         protected override void OnMouseEnter(EventArgs e)
1706         {
1707             if(!m_MouseOver)
1708             {
1709                 m_MouseOver=true;
1710                 UpdateBackColor();
1711                 this.Invalidate(true);
1712             }
1713             SetMouseOverTimerEnabled(true);
1714             base.OnMouseEnter(e);
1715         }
1716         protected override void OnMouseLeave(EventArgs e)
1717         {
1718             //if(this.DroppedDown)
1719             //{
1720             //    m_MouseOver=false;
1721             //}
1722             //else if(this.DropDownStyle!=ComboBoxStyle.DropDownList && m_MouseOver)
1723             //{
1724             //    // Get the mouse position
1725             //    Point p=this.PointToClient(Control.MousePosition);
1726             //    if(!this.ClientRectangle.Contains(p))
1727             //    {
1728             //        m_MouseOver=false;
1729             //    }
1730             //}
1731             //else if(m_MouseOver)
1732             //{
1733             //    m_MouseOver=false;
1734             //}
1735             SetMouseOverTimerEnabled(true);
1736             //Color c = GetComboColors().Background;
1737             //if (this.BackColor != c)
1738             //    this.BackColor = c;
1739             //this.Refresh();
1740             base.OnMouseLeave(e);
1741         }
1742 
1743         protected override void OnMouseMove(MouseEventArgs e)
1744         {
1745             base.OnMouseMove(e);
1746             if (!m_MouseOver)
1747             {
1748                 //if (!m_Focused)
1749                 {
1750                     m_MouseOver = true;
1751                     this.Invalidate();
1752                     SetMouseOverTimerEnabled(true);
1753                 }
1754             }
1755         }
1756 
1757         private void SetMouseOverTimerEnabled(bool value)
1758         {
1759             if (m_MouseOverTimer != null) m_MouseOverTimer.Enabled = value;
1760         }
1761 
1762         private void SetupTextBoxMessageHandler()
1763         {
1764 #if FRAMEWORK20
1765             if (this.DropDownStyle != ComboBoxStyle.DropDownList && this.AutoCompleteMode == AutoCompleteMode.None)
1766 #else
1767             if (this.DropDownStyle != ComboBoxStyle.DropDownList)
1768 #endif
1769             {
1770                 if (m_TextWindowMsgHandler == null)
1771                 {
1772                     // Get hold of the text box
1773                     IntPtr hwnd = GetWindow(this.Handle, GW_CHILD);
1774                     // Subclass so we can track messages
1775                     if (hwnd != IntPtr.Zero)
1776                     {
1777                         m_TextWindowMsgHandler = new ComboTextBoxMsgHandler();
1778                         m_TextWindowMsgHandler.MouseLeave += new EventHandler(this.TextBoxMouseLeave);
1779                         m_TextWindowMsgHandler.Paint += new PaintEventHandler(TextBoxPaint);
1780                         m_TextWindowMsgHandler.AssignHandle(hwnd);
1781                     }
1782                 }
1783             }
1784             else if (m_TextWindowMsgHandler != null)
1785             {
1786                 m_TextWindowMsgHandler.ReleaseHandle();
1787                 m_TextWindowMsgHandler = null;
1788             }
1789         }
1790         
1791         protected override void OnDropDownStyleChanged(EventArgs e)
1792         {
1793             SetupTextBoxMessageHandler();
1794             base.OnDropDownStyleChanged(e);
1795         }
1796 
1797         private void TextBoxPaint(object sender, PaintEventArgs e)
1798         {
1799             if (ShouldDrawWatermark())
1800                 DrawWatermark(e.Graphics);
1801         }
1802 
1803         private void TextBoxMouseLeave(object sender, EventArgs e)
1804         {
1805             if(!m_MouseOver)
1806                 return;
1807             SetMouseOverTimerEnabled(true);
1808         }
1809 
1810         /// <summary>
1811         /// Gets or sets whether FocusHighlightColor is used as background color to highlight text box when it has input focus. Default value is false.
1812         /// </summary>
1813         [DefaultValue(false), Browsable(true), Category("Appearance"), Description("Indicates whether FocusHighlightColor is used as background color to highlight text box when it has input focus.")]
1814         public virtual bool FocusHighlightEnabled
1815         {
1816             get { return _FocusHighlightEnabled; }
1817             set
1818             {
1819                 if (_FocusHighlightEnabled != value)
1820                 {
1821                     _FocusHighlightEnabled = value;
1822                     if (this.Focused)
1823                         this.Invalidate();
1824                 }
1825             }
1826         }
1827 
1828         /// <summary>
1829         /// Gets or sets the color used as background color to highlight text box when it has input focus and focus highlight is enabled.
1830         /// </summary>
1831         [Browsable(true), Category("Appearance"), Description("Indicates color used as background color to highlight text box when it has input focus and focus highlight is enabled.")]
1832         public virtual Color FocusHighlightColor
1833         {
1834             get { return _FocusHighlightColor; }
1835             set
1836             {
1837                 if (_FocusHighlightColor != value)
1838                 {
1839                     _FocusHighlightColor = value;
1840                     if (this.Focused)
1841                         this.Invalidate();
1842                 }
1843             }
1844         }
1845 
1846         [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
1847         public bool ShouldSerializeFocusHighlightColor()
1848         {
1849             return !_FocusHighlightColor.Equals(_DefaultHighlightColor);
1850         }
1851 
1852         [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
1853         public void ResetFocusHighlightColor()
1854         {
1855             FocusHighlightColor = _DefaultHighlightColor;
1856         }
1857 
1858         #region ICommandSource Members
1859         protected virtual void ExecuteCommand()
1860         {
1861             if (_Command == null) return;
1862             CommandManager.ExecuteCommand(this);
1863         }
1864 
1865         /// <summary>
1866         /// Gets or sets the command assigned to the item. Default value is null.
1867         /// <remarks>Note that if this property is set to null Enabled property will be set to false automatically to disable the item.</remarks>
1868         /// </summary>
1869         [DefaultValue(null), Category("Commands"), Description("Indicates the command assigned to the item.")]
1870         public Command Command
1871         {
1872             get { return (Command)((ICommandSource)this).Command; }
1873             set
1874             {
1875                 ((ICommandSource)this).Command = value;
1876             }
1877         }
1878 
1879         private ICommand _Command = null;
1880         //[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
1881         ICommand ICommandSource.Command
1882         {
1883             get
1884             {
1885                 return _Command;
1886             }
1887             set
1888             {
1889                 bool changed = false;
1890                 if (_Command != value)
1891                     changed = true;
1892 
1893                 if (_Command != null)
1894                     CommandManager.UnRegisterCommandSource(this, _Command);
1895                 _Command = value;
1896                 if (value != null)
1897                     CommandManager.RegisterCommand(this, value);
1898                 if (changed)
1899                     OnCommandChanged();
1900             }
1901         }
1902 
1903         /// <summary>
1904         /// Called when Command property value changes.
1905         /// </summary>
1906         protected virtual void OnCommandChanged()
1907         {
1908         }
1909 
1910         private object _CommandParameter = null;
1911         /// <summary>
1912         /// Gets or sets user defined data value that can be passed to the command when it is executed.
1913         /// </summary>
1914         [Browsable(true), DefaultValue(null), Category("Commands"), Description("Indicates user defined data value that can be passed to the command when it is executed."), System.ComponentModel.TypeConverter(typeof(System.ComponentModel.StringConverter)), System.ComponentModel.Localizable(true)]
1915         public object CommandParameter
1916         {
1917             get
1918             {
1919                 return _CommandParameter;
1920             }
1921             set
1922             {
1923                 _CommandParameter = value;
1924             }
1925         }
1926 
1927         #endregion
1928         
1929 
1930         private class ComboTextBoxMsgHandler:NativeWindow
1931         {
1932             private const int WM_MOUSELEAVE=0x02A3;
1933             private const int WM_MOUSEMOVE=0x0200;
1934             private const int TME_LEAVE=0x02;
1935             [DllImport("user32",SetLastError=true, CharSet=CharSet.Auto)]
1936             private static extern bool TrackMouseEvent(ref TRACKMOUSEEVENT lpEventTrack);
1937 
1938             public event EventHandler MouseLeave;
1939             public event PaintEventHandler Paint;
1940 
1941             private struct TRACKMOUSEEVENT 
1942             {
1943                 public int cbSize;
1944                 public int dwFlags;
1945                 public int hwndTrack;
1946                 public int dwHoverTime;
1947             }
1948 
1949             private bool m_MouseTracking=false;
1950 
1951             protected override void WndProc(ref Message m)
1952             {
1953                 const int WM_PAINT = 0xF;
1954                 if(m.Msg==WM_MOUSEMOVE && !m_MouseTracking)
1955                 {
1956                     m_MouseTracking = true;
1957                     TRACKMOUSEEVENT tme = new TRACKMOUSEEVENT();
1958                     tme.dwFlags = TME_LEAVE;
1959                     tme.cbSize = Marshal.SizeOf(tme);
1960                     tme.hwndTrack = this.Handle.ToInt32();
1961                     tme.dwHoverTime = 0;
1962                     m_MouseTracking = TrackMouseEvent(ref tme);
1963                 }
1964                 else if(m.Msg==WM_MOUSELEAVE)
1965                 {
1966                     if(MouseLeave!=null)
1967                         MouseLeave(this,new EventArgs());
1968                     m_MouseTracking=false;
1969                 }
1970                 else if (m.Msg == WM_PAINT)
1971                 {
1972                     base.WndProc(ref m);
1973                     if (Paint != null)
1974                     {
1975                         using (Graphics g = Graphics.FromHwnd(m.HWnd))
1976                             Paint(this, new PaintEventArgs(g, Rectangle.Empty));
1977                     }
1978                     return;
1979                 }
1980                 base.WndProc(ref m);
1981             }
1982         }
1983     }
1984 }
原文地址:https://www.cnblogs.com/endv/p/4568532.html