| File: System\ComponentModel\Design\DesignerActionPanel.EditorPropertyLine.EditorButton.cs | Web Access |
| Project: src\winforms\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.Drawing.Imaging; using System.Windows.Forms; using System.Windows.Forms.VisualStyles; namespace System.ComponentModel.Design; internal sealed partial class DesignerActionPanel { private sealed partial class EditorPropertyLine { // Class that renders either the ellipsis or dropdown button internal sealed class EditorButton : Button { private bool _mouseOver; private bool _mouseDown; protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); if (e.Button == MouseButtons.Left) { _mouseDown = true; } } protected override void OnMouseEnter(EventArgs e) { base.OnMouseEnter(e); _mouseOver = true; } protected override void OnMouseLeave(EventArgs e) { base.OnMouseLeave(e); _mouseOver = false; } protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); if (e.Button == MouseButtons.Left) { _mouseDown = false; } } public bool Ellipsis { get; set; } protected override void OnPaint(PaintEventArgs e) { Graphics g = e.Graphics; if (Ellipsis) { PushButtonState buttonState = PushButtonState.Normal; if (_mouseDown) { buttonState = PushButtonState.Pressed; } else if (_mouseOver) { buttonState = PushButtonState.Hot; } ButtonRenderer.DrawButton(g, new Rectangle(-1, -1, Width + 2, Height + 2), "…", Font, Focused, buttonState); return; } if (ComboBoxRenderer.IsSupported) { ComboBoxState state = ComboBoxState.Normal; if (Enabled) { if (_mouseDown) { state = ComboBoxState.Pressed; } else if (_mouseOver) { state = ComboBoxState.Hot; } } else { state = ComboBoxState.Disabled; } ComboBoxRenderer.DrawDropDownButton(g, new Rectangle(0, 0, Width, Height), state); } else { PushButtonState buttonState = PushButtonState.Normal; if (Enabled) { if (_mouseDown) { buttonState = PushButtonState.Pressed; } else if (_mouseOver) { buttonState = PushButtonState.Hot; } } else { buttonState = PushButtonState.Disabled; } ButtonRenderer.DrawButton( g, new Rectangle(-1, -1, Width + 2, Height + 2), string.Empty, Font, Focused, buttonState); // Draw the arrow icon try { using Icon icon = new(typeof(DesignerActionPanel), "Arrow.ico"); using Bitmap arrowBitmap = icon.ToBitmap(); // Make sure we draw properly under high contrast by re-mapping // the arrow color to the WindowText color using ImageAttributes attributes = new(); (Color OldColor, Color NewColor) map = new(Color.Black, SystemColors.WindowText); attributes.SetRemapTable(ColorAdjustType.Bitmap, new ReadOnlySpan<(Color OldColor, Color NewColor)>(ref map)); int imageWidth = arrowBitmap.Width; int imageHeight = arrowBitmap.Height; g.DrawImage( arrowBitmap, new Rectangle( (Width - imageWidth + 1) / 2, (Height - imageHeight + 1) / 2, imageWidth, imageHeight), 0, 0, imageWidth, imageWidth, GraphicsUnit.Pixel, attributes, callback: null, 0); } catch { } } if (Focused) { ControlPaint.DrawFocusRectangle(g, new Rectangle(2, 2, Width - 5, Height - 5)); } } public void ResetMouseStates() { _mouseDown = false; _mouseOver = false; Invalidate(); } } } }