2009-11-13 28 views
17

無効なコントロールの上にマウスが移動したときにツールチップを表示しようとしています。無効なコントロールはイベントを処理しないので、親フォームでそれを行う必要があります。私は親フォームで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秒ごとに更新されます。また、ツールチップが上記のフォームをリフレッシュすると、テキストだけが短いフラッシュで更新されます。しかし、無効なコントロールの上でツールチップが更新されると、マウスが有効なコントロールに移動し、ツールチップが閉じられているように、ツールチップウィンドウが閉じます。ツールチップがすぐに再表示されます。

誰かが私にこの理由を教えてもらえますか?ありがとう。

答えて

6

についての答えは少し単純であることが判明しかし、常に適用される必要があった。ここで

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

マウスが消したコントロールに当たったときにツールチップを一度だけ表示し、マウスが離れるとツールチップを非表示にすることができます。 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; 
    } 
} 

はこれが役に立てば幸いフォーム上のすべての無効なコントロールのツールヒントメッセージを表示しなければならない、

+0

これはほとんど動作するようです。一部のコントロールは正しく動作していますが、他のコントロールはまだ点滅しています。 –

+2

私のためにDJの答えより優れています。私はcontrol.Visibleチェックを追加したので、目に見えないコントロールのツールヒントをポップアップしませんでした。私はまた、showブロックの前にhideブロックを移動し、if(_currentToolTipControl!= null && _currentToolTipControl!= control){... Hide();をチェックしました。 _currentToolTipControl = null; }(これがなければ、別の無効なコントロールへの素早い移動はツールチップの更新に失敗します)。 – mheyman

0

は私がPIC32MX用のコードを自動的に生成するアプリケーションを持ってこの問題

を解決する方法です。

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

周辺はRPA0を使用する場合、私は1つのチェックボックスのテキスト= 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; 
    } 
} 
2

ためのコードとデザイナーである私は多くを試してみましたが、私はそれがより効果的だと思う。この単純なトリックを使用して終了しました。

代わりに、全体ではなくCustomControlのそれにちょうどbasecontrolを無効にする方法を作成してfalseに「有効」プロパティを設定するのでは、その後のUserControl

を拡張し、サブクラス(これでちょうどベースコントロールと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 
} 
0

私はボタンのみを含む新しいユーザーコントロールを作成しました。

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); 
    } 
} 
関連する問題