web-dev-qa-db-ja.com

無効なコントロールの上にツールチップを表示する

無効なコントロールの上にマウスを置いたときにツールチップを表示しようとしています。無効化されたコントロールはイベントを処理しないため、親フォームで処理する必要があります。親フォームでMouseMoveイベントを処理することでこれを行うことを選択しました。これが仕事をするコードです:

    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秒ごとに更新されます。また、ツールチップがフォームの上で更新されると、テキストのみが短いフラッシュで更新されます。ただし、無効にされたコントロールの上でツールチップが更新されると、マウスが有効なコントロールに移動しているかのようにツールチップウィンドウが閉じ、ツールチップは閉じられるはずです。ツールチップはすぐに再表示されます。

なぜ誰かがこれを教えてくれますか?ありがとう。

25
DJ.

答えは少し単純であることがわかりましたが、常に適用する必要がありました。

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);
      }
}
8
DJ.

マウスを無効にしたコントロールにヒットしたときにツールチップを1回だけ表示し、マウスを離したときにツールチップを非表示にすることができます。 Pls、以下のコードを見てください。フォーム上の無効になっているすべてのコントロールのツールチップメッセージが表示されているはずです。

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;
    }
}

よろしくお願いします

14
serge_gubenko

TextBoxコントロールの場合、それを読み取り専用にすると問題が解決しました。

2
Sanjay Sharma

たくさん試してみましたが、この簡単なトリックを使った方が効果的だと思います。

UserControlを拡張するサブクラス(ベースコントロールのみを含むCustomControl)を作成します。

次に、「Enabled」プロパティをfalseに設定する代わりに、CustomControl全体ではなく、baseControlだけを無効にするメソッドを作成します。

CustomControlにツールチップを設定しても、basecontrolを無効に設定してイベントハンドラーを起動できます。これは、使用するすべてのフォームでコーディングするのではなく、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
}
2
Rakesh

ボタンのみを含む新しいUserControlを作成しました。

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);
    }
}
0
MeJ

これが私がこの問題を解決した方法です

PIC32MXのコードを自動的に生成するアプリケーションがあります。

アプリケーションには、3つのタブページテキスト= PWM、ADC、およびUARTがあります。

各タブページに1つのチェックボックステキストがあります= RPA0

目的は、周辺機器がRPA0を使用する場合、他のページで無効にすることにより、他の周辺機器がそのピンを使用できないようにし、無効になっているチェックボックスにツールチップのテキストをポップアップする必要があることです(「PWMで使用」の例)。周辺機器はそのピンを使用しています。

問題は、ツールチップテキストが無効なチェックボックスにポップアップしないことです。

この問題を解決するために、チェックボックスのテキストを削除し、チェックボックスのテキストを含むラベルを挿入しました。

チェックボックスをオンにすると、他のチェックボックスが無効になり、その横のラベルにツールヒントのテキストが表示されます。

ラベルが有効になっていると、無効になっているチェックボックスでもツールヒントのテキストがポップアップします。

作業量が2倍になり、複雑さが半分になります。

これが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.</param>
        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.UseVisualStyleBackColor = 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;
    }
}
0
Antonio Leite