File: System\Windows\Forms\Design\ToolStripItemGlyph.cs
Web Access
Project: src\src\System.Windows.Forms.Design\src\System.Windows.Forms.Design.csproj (System.Windows.Forms.Design)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Drawing;
using System.Windows.Forms.Design.Behavior;
 
namespace System.Windows.Forms.Design;
 
/// <summary>
///  The glyph we put over the items. Basically this sets the hit-testable area of the item itself.
/// </summary>
internal class ToolStripItemGlyph : ControlBodyGlyph
{
    public ToolStripItemGlyph(ToolStripItem item, ToolStripItemDesigner itemDesigner, Rectangle bounds, Behavior.Behavior? b) : base(bounds, Cursors.Default, item, b)
    {
        Item = item;
        ItemDesigner = itemDesigner;
    }
 
    public ToolStripItem Item { get; }
 
    public ToolStripItemDesigner ItemDesigner { get; }
 
    /// <summary>
    ///  Abstract method that forces Glyph implementations to provide hit test logic. Given any point
    ///  - if the Glyph has decided to be involved with that location, the Glyph will need to return a valid Cursor.
    ///  Otherwise, returning null will cause the the BehaviorService to simply ignore it.
    /// </summary>
    public override Cursor? GetHitTest(Point p)
    {
        if (Item.Visible && Bounds.Contains(p))
        {
            return Cursors.Default;
        }
 
        return null;
    }
 
    /// <summary>
    ///  Control host don't draw on Invalidation...
    /// </summary>
    public override void Paint(PaintEventArgs pe)
    {
        if (Item is ToolStripControlHost && Item.IsOnDropDown)
        {
            if (Item is ToolStripComboBox && VisualStyles.VisualStyleRenderer.IsSupported)
            {
                // When processing WM_PAINT and the OS has a theme enabled, the native ComboBox
                // sends a WM_PAINT message to its parent when a theme is enabled in the OS forcing
                // a repaint in the AdornerWindow generating an infinite WM_PAINT message processing loop.
                // We guard against this here.
                return;
            }
 
            Item.Invalidate();
        }
    }
}