Отображение всплывающей подсказки над отключенным элементом управления

я пытаюсь отобразить всплывающую подсказку, когда курсор мыши находится над отключенным элементом управления. Поскольку отключенный элемент управления не обрабатывает какие-либо события, я должен сделать это в родительской форме. Я решил сделать это, обрабатываяMouseMove событие в родительской форме. Вот's код, который делает работу:

    void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        m_toolTips.SetToolTip(this, "testing tooltip on " + DateTime.Now.ToString());
        string tipText = this.m_toolTips.GetToolTip(this);
        if ((tipText != null) && (tipText.Length > 0))
        {
            Point clientLoc = this.PointToClient(Cursor.Position);
            Control child = this.GetChildAtPoint(clientLoc);
            if (child != null && child.Enabled == false)
            {
                m_toolTips.ToolTipTitle = "MouseHover On Disabled Control";
                m_toolTips.Show(tipText, this, 10000);
            }
            else
            {
                m_toolTips.ToolTipTitle = "MouseHover Triggerd";
                m_toolTips.Show(tipText, this, 3000);
            }
        }
    }

Код обрабатывает отображение всплывающей подсказки для отключенного элемента управления. Проблема заключается в том, что когда курсор мыши находится над отключенным элементом управления, всплывающая подсказка закрывается и снова отображается. Из времени отображения, которое я добавил во всплывающей подсказке, когда мышь находится над родительской формой,MouseMove Событие вызывается примерно каждые 3 секунды, поэтому всплывающая подсказка обновляется каждые 3 секунды. Но когда мышь находится над отключенным элементом управления, всплывающая подсказка обновляется каждую 1 секунду. Кроме того, когда всплывающая подсказка обновляется над формой, только текст обновляется с короткой вспышкой. Но когда всплывающая подсказка обновляется над отключенным элементом управления, окна всплывающей подсказки закрываются, как будто мышь перемещается во включенный элемент управления, и подсказка должна быть закрыта. но затем всплывающая подсказка появляется сразу же.

Может кто-нибудь сказать мне, почему это? Благодарю.

Ответы на вопрос(6)

но в итоге использовал этот простой трюк, который, на мой взгляд, более эффективен.

Создайте подкласс (CustomControl с базовым контролем в нем), который расширяет UserControl

тогда вместо настройкиВключено» Свойство false создает метод, который отключает только базовый контроль вместо целого CustomControl.

Установите всплывающую подсказку на CustomControl, все равно сможете запускать обработчики событий, отключив базовый контроль. Это работает везде, где используется CustomControl, а не кодирование в каждой форме, с которой вы используете.

Вот подсказка .. :)

public partial class MyTextBox : UserControl
{
   ...
   ...
   ...


   public void DisableMyTextBox()
    {
        this.txt.Enabled = false;  //txt is the name of Winform-Textbox from my designer
        this.Enabled = true;
    }

    public void EnableMyTextBox()
    {
        this.txt.Enabled = true;
        this.Enabled = true;
    }

    //set the tooltip from properties tab in designer or wherever
}

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

private ToolTip     _toolTip = new ToolTip();
private Control     _currentToolTipControl = null; 

public Form1()
{
    InitializeComponent();

    _toolTip.SetToolTip(this.button1, "My button1");
    _toolTip.SetToolTip(this.button2, "My button2");
    _toolTip.SetToolTip(this.textBox1, "My text box");
}

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    Control control = GetChildAtPoint(e.Location);
    if (control != null)
    {
        if (!control.Enabled && _currentToolTipControl == null)
        {
            string toolTipString = _toolTip.GetToolTip(control);
            // trigger the tooltip with no delay and some basic positioning just to give you an idea
            _toolTip.Show(toolTipString, control, control.Width/2, control.Height/2);
            _currentToolTipControl = control;
        }
    }
    else
    {
        if (_currentToolTipControl != null) _toolTip.Hide(_currentToolTipControl);
        _currentToolTipControl = null;
    }
}

надеюсь, что это помогает, привет

 DJ.17 нояб. 2009 г., 17:28
Кажется, это почти работает. Некоторые элементы управления работают правильно, в то время как другие все еще мигают.
 mheyman21 мар. 2013 г., 21:18
Работает лучше, чем диджей, отвечай за меня. Я добавил элемент управления. Визуальная проверка, поэтому я невсплывающие подсказки невидимых элементов управления. Я также переместил блок скрытия перед блоком show и проверил if (_currentToolTipControl! = Null && _currentToolTipControl! = control) {... Hide (); _currentToolTipControl = null; } (без этого быстрый переход к другому отключенному элементу управления не может обновить всплывающую подсказку).
Решение Вопроса

но его нужно было применять постоянно.

void OrderSummaryDetails_MouseMove(object sender, MouseEventArgs e)
{
      Control control = GetChildAtPoint(e.Location);
      if (control != null)
      {
          string toolTipString = mFormTips.GetToolTip(control);
          this.mFormTips.ShowAlways = true;
          // trigger the tooltip with no delay and some basic positioning just to give you an idea
          mFormTips.Show(toolTipString, control, control.Width / 2, control.Height / 2);
      }
}

который содержит только кнопку.

public partial class TooltipButton : UserControl
{
    public TooltipButton()
    {
        InitializeComponent();
    }

    public new bool Enabled
    {
        get { return button.Enabled; }
        set { button.Enabled = value; }
    }

    [Category("Appearance")]
    [Description("The text displayed by the button.")]
    [EditorBrowsable(EditorBrowsableState.Always)]
    [Browsable(true)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    [Bindable(true)]
    public override string Text
    {
        get { return button.Text; }
        set { button.Text = value; }
    }

    [Category("Action")]
    [Description("Occurs when the button is clicked.")]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    public new event EventHandler Click;

    private void button_Click(object sender, EventArgs e)
    {
        // Bubble event up to parent
        Click?.Invoke(this, e);
    }
}

решение проблемы было решено только для чтения.

У меня есть приложение, которое генерирует код автоматически для PIC32MX.

В приложении есть 3 вкладки Text text = PWM, ADC и UART.

На каждой вкладке у меня есть один текст флажка = RPA0

Предполагается, что когда периферийное устройство использует RPA0, другое периферийное устройство не может использовать этот вывод, отключив его на других страницах, и текст всплывающей подсказки должен появиться в отключенных флажках с надписью (пример)Используется ШИМ ") какое периферийное устройство использует этот контакт.

Проблема в том, что текст всплывающей подсказки выигралвсплывающее окно с отключенным флажком.

Чтобы решить эту проблему, я просто удалил текст флажков и вставил метки с текстом, который должен иметь флажок.

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

Когда метка включена, всплывающая подсказка всплывает даже при отключенном флажке.

Двойная работа, половина сложности.

Вот код и дизайнер для C # 2010

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void cb_ADC_RPA0_CheckedChanged(object sender, EventArgs e)
        {
            /* Disable pin on other peripherals */
            cb_UART_RPA0.Enabled = !((CheckBox)sender).Checked;
            cb_PWM_RPA0.Enabled = !((CheckBox)sender).Checked;

            SetTootTip((CheckBox)sender, lbl_PWM_RPA0, lbl_UART_RPA0, "ADC");

        }



        private void cb_PWM_RPA0_CheckedChanged(object sender, EventArgs e)
        {
            /* Disable pin on other peripherals */
            cb_UART_RPA0.Enabled = !((CheckBox)sender).Checked;
            cb_ADC_RPA0.Enabled = !((CheckBox)sender).Checked;

            SetTootTip((CheckBox)sender, lbl_ADC_RPA0, lbl_UART_RPA0, "PWM");
        }

        private void cb_UART_RPA0_CheckedChanged(object sender, EventArgs e)
        {
            /* Disable pin on other peripherals */
            cb_ADC_RPA0.Enabled = !((CheckBox)sender).Checked;
            cb_PWM_RPA0.Enabled = !((CheckBox)sender).Checked;
            SetTootTip((CheckBox)sender, lbl_ADC_RPA0, lbl_PWM_RPA0, "UART");

        }

        void SetTootTip(CheckBox sender, Label lbl1, Label lbl2, string text)
        {
            /* Update tooltip on the other labels */
            if (sender.Checked)
            {
                toolTip1.SetToolTip(lbl1, "Used by " + text);
                toolTip1.SetToolTip(lbl2, "Used by " + text);
            }
            else
            {
                toolTip1.SetToolTip(lbl1, "");
                toolTip1.SetToolTip(lbl2, "");
            }
        }
    }
}


namespace WindowsFormsApplication1
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.tabControl1 = new System.Windows.Forms.TabControl();
            this.tpPWM = new System.Windows.Forms.TabPage();
            this.tpUART = new System.Windows.Forms.TabPage();
            this.tpADC = new System.Windows.Forms.TabPage();
            this.cb_PWM_RPA0 = new System.Windows.Forms.CheckBox();
            this.cb_ADC_RPA0 = new System.Windows.Forms.CheckBox();
            this.lbl_PWM_RPA0 = new System.Windows.Forms.Label();
            this.lbl_ADC_RPA0 = new System.Windows.Forms.Label();
            this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
            this.lbl_UART_RPA0 = new System.Windows.Forms.Label();
            this.cb_UART_RPA0 = new System.Windows.Forms.CheckBox();
            this.tabControl1.SuspendLayout();
            this.tpPWM.SuspendLayout();
            this.tpUART.SuspendLayout();
            this.tpADC.SuspendLayout();
            this.SuspendLayout();
            // 
            // tabControl1
            // 
            this.tabControl1.Controls.Add(this.tpPWM);
            this.tabControl1.Controls.Add(this.tpUART);
            this.tabControl1.Controls.Add(this.tpADC);
            this.tabControl1.Location = new System.Drawing.Point(12, 12);
            this.tabControl1.Name = "tabControl1";
            this.tabControl1.SelectedIndex = 0;
            this.tabControl1.Size = new System.Drawing.Size(629, 296);
            this.tabControl1.TabIndex = 0;
            // 
            // tpPWM
            // 
            this.tpPWM.Controls.Add(this.lbl_PWM_RPA0);
            this.tpPWM.Controls.Add(this.cb_PWM_RPA0);
            this.tpPWM.Location = new System.Drawing.Point(4, 22);
            this.tpPWM.Name = "tpPWM";
            this.tpPWM.Padding = new System.Windows.Forms.Padding(3);
            this.tpPWM.Size = new System.Drawing.Size(621, 270);
            this.tpPWM.TabIndex = 0;
            this.tpPWM.Text = "PWM";
            this.tpPWM.UseVisualStyleBackColor = true;
            // 
            // tpUART
            // 
            this.tpUART.Controls.Add(this.cb_UART_RPA0);
            this.tpUART.Controls.Add(this.lbl_UART_RPA0);
            this.tpUART.Location = new System.Drawing.Point(4, 22);
            this.tpUART.Name = "tpUART";
            this.tpUART.Padding = new System.Windows.Forms.Padding(3);
            this.tpUART.Size = new System.Drawing.Size(621, 270);
            this.tpUART.TabIndex = 1;
            this.tpUART.Text = "UART";
            this.tpUART.UseVisualStyleBackColor = true;
            // 
            // tpADC
            // 
            this.tpADC.Controls.Add(this.lbl_ADC_RPA0);
            this.tpADC.Controls.Add(this.cb_ADC_RPA0);
            this.tpADC.Location = new System.Drawing.Point(4, 22);
            this.tpADC.Name = "tpADC";
            this.tpADC.Padding = new System.Windows.Forms.Padding(3);
            this.tpADC.Size = new System.Drawing.Size(621, 270);
            this.tpADC.TabIndex = 2;
            this.tpADC.Text = "ADC";
            this.tpADC.UseVisualStyleBackColor = true;
            // 
            // cb_PWM_RPA0
            // 
            this.cb_PWM_RPA0.AutoSize = true;
            this.cb_PWM_RPA0.Location = new System.Drawing.Point(17, 65);
            this.cb_PWM_RPA0.Name = "cb_PWM_RPA0";
            this.cb_PWM_RPA0.Size = new System.Drawing.Size(15, 14);
            this.cb_PWM_RPA0.TabIndex = 0;
            this.cb_PWM_RPA0.UseVisualStyleBackColor = true;
            this.cb_PWM_RPA0.CheckedChanged += new System.EventHandler(this.cb_PWM_RPA0_CheckedChanged);
            // 
            // cb_ADC_RPA0
            // 
            this.cb_ADC_RPA0.AutoSize = true;
            this.cb_ADC_RPA0.Location = new System.Drawing.Point(17, 65);
            this.cb_ADC_RPA0.Name = "cb_ADC_RPA0";
            this.cb_ADC_RPA0.Size = new System.Drawing.Size(15, 14);
            this.cb_ADC_RPA0.TabIndex = 1;
            this.cb_ADC_RPA0.UseVisualStyleBackColor = true;
            this.cb_ADC_RPA0.CheckedChanged += new System.EventHandler(this.cb_ADC_RPA0_CheckedChanged);
            // 
            // lbl_PWM_RPA0
            // 
            this.lbl_PWM_RPA0.AutoSize = true;
            this.lbl_PWM_RPA0.Location = new System.Drawing.Point(38, 65);
            this.lbl_PWM_RPA0.Name = "lbl_PWM_RPA0";
            this.lbl_PWM_RPA0.Size = new System.Drawing.Size(35, 13);
            this.lbl_PWM_RPA0.TabIndex = 1;
            this.lbl_PWM_RPA0.Text = "RPA0";
            // 
            // lbl_ADC_RPA0
            // 
            this.lbl_ADC_RPA0.AutoSize = true;
            this.lbl_ADC_RPA0.Location = new System.Drawing.Point(38, 66);
            this.lbl_ADC_RPA0.Name = "lbl_ADC_RPA0";
            this.lbl_ADC_RPA0.Size = new System.Drawing.Size(35, 13);
            this.lbl_ADC_RPA0.TabIndex = 2;
            this.lbl_ADC_RPA0.Text = "RPA0";
            // 
            // lbl_UART_RPA0
            // 
            this.lbl_UART_RPA0.AutoSize = true;
            this.lbl_UART_RPA0.Location = new System.Drawing.Point(37, 65);
            this.lbl_UART_RPA0.Name = "lbl_UART_RPA0";
            this.lbl_UART_RPA0.Size = new System.Drawing.Size(35, 13);
            this.lbl_UART_RPA0.TabIndex = 4;
            this.lbl_UART_RPA0.Text = "RPA0";
            // 
            // cb_UART_RPA0
            // 
            this.cb_UART_RPA0.AutoSize = true;
            this.cb_UART_RPA0.Location = new System.Drawing.Point(16, 65);
            this.cb_UART_RPA0.Name = "cb_UART_RPA0";
            this.cb_UART_RPA0.Size = new System.Drawing.Size(15, 14);
            this.cb_UART_RPA0.TabIndex = 5;
            this.cb_UART_RPA0.Us,eVisualStyleBackColor = true;
            this.cb_UART_RPA0.CheckedChanged += new System.EventHandler(this.cb_UART_RPA0_CheckedChanged);
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(758, 429);
            this.Controls.Add(this.tabControl1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.tabControl1.ResumeLayout(false);
            this.tpPWM.ResumeLayout(false);
            this.tpPWM.PerformLayout();
            this.tpUART.ResumeLayout(false);
            this.tpUART.PerformLayout();
            this.tpADC.ResumeLayout(false);
            this.tpADC.PerformLayout();
            this.ResumeLayout(false);

        }

        #endregion

        private System.Windows.Forms.TabControl tabControl1;
        private System.Windows.Forms.TabPage tpPWM;
        private System.Windows.Forms.Label lbl_PWM_RPA0;
        private System.Windows.Forms.CheckBox cb_PWM_RPA0;
        private System.Windows.Forms.TabPage tpUART;
        private System.Windows.Forms.TabPage tpADC;
        private System.Windows.Forms.Label lbl_ADC_RPA0;
        private System.Windows.Forms.CheckBox cb_ADC_RPA0;
        private System.Windows.Forms.ToolTip toolTip1;
        private System.Windows.Forms.CheckBox cb_UART_RPA0;
        private System.Windows.Forms.Label lbl_UART_RPA0;
    }
}

Ваш ответ на вопрос