Как отобразить подсказку над прозрачным изображением, размещенным на кнопке Winform - PullRequest
0 голосов
/ 11 апреля 2019

Я отображаю прозрачный значок (32x32) красного треугольника в правом верхнем углу кнопки, которая означает, что существует ошибка.Кроме того, когда пользователь наводит курсор на значок, отображается подсказка.

Мне удалось отобразить значок и связанную подсказку.Проблема в прозрачном значке 32x32 с красным треугольником размером всего 12x12.Подсказка инструмента должна срабатывать только при наведении курсора на красный треугольник, а не на прозрачное пространство.

Предприняты попытки отобразить треугольник как кнопку, а также окно с изображением, однако подсказка инструмента все еще срабатывает впрозрачное пространство.Кроме того, провайдер ошибок был впервые использован в качестве цели того, что я пытаюсь выполнить.

Элементы пользовательского интерфейса:

  • Кнопочное управление: "btnAttachments"

  • Элемент управления провайдера ошибок: "errManager"

    public class StackTest
    {
        private static Dictionary<string, Control> _errorMessages = new Dictionary<string, Control>();
    
        public StackTest()
        {
            InitializeComponent();
            InitErrors();
        }
        private void InitErrors()
        {
            _errorMessages.Clear();
            AddErrorControl(btnAttachments, "Missing file attachment(s).");
            //errManager.SetError(btnAttachments, "Missing file attachment(s)."); errManager.SetIconPadding(btnAttachments, -32);
        }
    
        private void AddErrorControl(Control control, string message = null, Enum selectedImage = null, EventHandler handler = null)
        {
            string name = "errFor" + control.Name;
            if (_errorMessages.ContainsKey(name)) { return; }
    
            Button errorIcon = CreateErrorControl(name, control);
            errorIcon.BackgroundImage = Theme.GetImage(selectedImage ?? eImages_OtherIcons.Error_TopRight_Small);
    
            //PictureBox errorIcon = CreateErrorControl2(name);
            //errorIcon.Image = Theme.GetImage(selectedImage ?? eImages_OtherIcons.Error_TopRight_Small);
            //errorIcon.Image = Bitmap.FromHicon((Theme.GetIcon(selectedImage ?? eImages_OtherIcons.Error_TopRight_Small)).Handle);
    
            if (null != handler) { errorIcon.Click += handler; }
            new ToolTip().SetToolTip(errorIcon, message);
            errorIcon.Tag = message;
    
            control.Controls.Add(errorIcon);
            control.Controls[name].Location = new Point(control.Width - errorIcon.Width +20 , 0 );
            _errorMessages.Add(name, errorIcon);
        }
    
        private Button CreateErrorControl(string name, Control control)
        {
            var errorIcon = new Button();
            errorIcon.Name = name;
            errorIcon.Size = new Size(32, 32);
            //errorIcon.Location = new Point(control.Width - errorIcon.Width, 0);
            errorIcon.Cursor = Cursors.Hand;
            errorIcon.FlatStyle = FlatStyle.Flat;
            errorIcon.BackColor = Color.Fuchsia;
            errorIcon.FlatAppearance.MouseDownBackColor = Color.Transparent;
            errorIcon.FlatAppearance.MouseOverBackColor = Color.Transparent;
            errorIcon.FlatAppearance.BorderSize = 0;
            errorIcon.Visible = false;
    
            return errorIcon;
        }
    
        private PictureBox CreateErrorControl2(string name) 
        {
            var errorIcon = new PictureBox();
            errorIcon.Name = name;
            errorIcon.Size = new Size(32, 32);
            errorIcon.Cursor = Cursors.Hand;
            errorIcon.BackColor = Color.Transparent;
            errorIcon.Visible = false;
    
            return errorIcon;
        }
    }
    

Встроенный элемент управления провайдером ошибок достигает желаемых результатов, которые я хотел бы воспроизвести.Это позволит создать более надежное приложение с более настраиваемыми функциями, чем предлагает поставщик ошибок.

1 Ответ

0 голосов
/ 11 апреля 2019

Основываясь на предложении GetPixel от @TaW, я провел дальнейшие исследования и разработки, и теперь у меня есть кое-что функциональное.Поле тега с изображением содержит подсказку для отображения.Поскольку окно рисунка было «отправителем» движения мыши, было легко извлечь изображение обратно в растровое изображение.

Спасибо всем за обратную связь.

Сначала я переключилтестирование использования CreateErrorControl2 с PictureBox и добавление в MouseMove.

    private PictureBox CreateErrorControl2(string name) //, Control control)
    {
        var errorIcon = new PictureBox();
        errorIcon.Name = name;
        errorIcon.Size = new Size(32, 32);
        errorIcon.Cursor = Cursors.Default;
        errorIcon.BackColor = Color.Transparent;
        errorIcon.Visible = false;
        errorIcon.MouseMove += new MouseEventHandler(DisplayToolTip);

        return errorIcon;
    }

Следующий код также был добавлен в поддержку метода DisplayToolTip.

    private bool _toolTipShown = false;

    private bool IsTransparent(PictureBox pb, MouseEventArgs e)
    {
        Color pixel = ((Bitmap)pb.Image).GetPixel(e.X, e.Y);
        return (0 == pixel.A && 0 == pixel.R && 0 == pixel.G && 0 == pixel.B);
    }

    private void DisplayToolTip(object sender, MouseEventArgs e)
    {
        Control control = (Control)sender;
        IsTransparent((PictureBox)control, e);
        if (IsTransparent((PictureBox)control, e))
        {
            _toolTip.Hide(control);
            _toolTipShown = false;
        }
        else
        {
            if (!_toolTipShown)
            {
                _toolTip.Show(control.Tag.ToString(), control);
                _toolTipShown = true;
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...