zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    简述虚拟打印功能的实现方法。
    什么是spool系统,什么是预输入,什么是缓输出?
    什么是虚拟设备技术,什么是虚拟设备,如何进行虚拟设备分配?
    什么是共享设备,对共享设备如何分配?
    什么是独占设备,对独占设备如何分配?
    对I/O设备分配的一般策略是什么?
    maven+nexus setting.xml配置(收藏)
    MySQL自动化安装(双主多从读写分离)
    Shell常用操作
    shell中的比较语句
  • 原文地址:https://www.cnblogs.com/endv/p/4568532.html
Copyright © 2011-2022 走看看