C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: ツールチップの表示時間について


(過去ログ 120 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■70034 / inTopicNo.1)  ツールチップの表示時間について
  
□投稿者/ Yoko (1回)-(2014/02/19(Wed) 17:09:18)

分類:[VB.NET/VB2005 以降] 

(開発環境)
・VS2012
・.NET Framework4.0
・Windowsアプリケーション


フォームに配置したテキストボックスに入力された内容を、
ツールチップを使用して表示させるようにしています。

この時に、ツールヒントが表示される時間を AutoPopDelay プロパティで指定していますが、
コントロール上にマウスポインターがある場合は、時間を指定せずに常に表示させておき、
マウスポインターがなくなったら非表示にするようにしたいです。

Showメソッドというのがあったので
ToolTip.Show(Me.TextBox1.Text, Me)
のようにしてみましたが、コントロール上にポインターがあっても、
一定時間経つと非表示になってしまいます。

デザインの関係で、どうしてもテキストボックスのサイズを広げたりラベル等を使用して
入力された内容を全て表示させておくという対応ができないので上記のようにしたいのですが、
ツールヒントを常に表示するというのはできないのでしょうか?

よろしくお願いします。

引用返信 編集キー/
■70076 / inTopicNo.2)  Re[1]: ツールチップの表示時間について
□投稿者/ tocs (1回)-(2014/02/23(Sun) 15:14:07)
tocs さんの Web サイト
showalwaysというプロパティがあります。
<http://msdn.microsoft.com/ja-jp/library/system.windows.forms.tooltip.showalways(v=vs.110).aspx>

このプロパティとご希望のタイミングが違う場合はHideを自分で呼ぶ必要もあるかと思います。
引用返信 編集キー/
■70147 / inTopicNo.3)  Re[2]: ツールチップの表示時間について
□投稿者/ Yoko (2回)-(2014/02/26(Wed) 14:35:59)
No70076 (tocs さん) に返信
回答ありがとうございます。

> showalwaysというプロパティがあります。
> <http://msdn.microsoft.com/ja-jp/library/system.windows.forms.tooltip.showalways(v=vs.110).aspx>
こちらのプロパティですが、概要を読んでみると親コントロールがアクティブでない場合もツールヒントを
表示するかどうか設定する項目のように見受けられます。

今回やりたいのは、ツールヒントの表示を「親コントロールがアクティブの場合」に
「表示時間の制限を設けず」にやりたいので、
申し訳ありませんが、教えていただいたプロパティでは実現できないと思います。
引用返信 編集キー/
■70155 / inTopicNo.4)  Re[3]: ツールチップの表示時間について
□投稿者/ an (29回)-(2014/02/26(Wed) 17:32:54)
No70147 (Yoko さん) に返信


> Showメソッドというのがあったので
> ToolTip.Show(Me.TextBox1.Text, Me)
> のようにしてみましたが、コントロール上にポインターがあっても、
> 一定時間経つと非表示になってしまいます。

とのことですので3パターンほど検証してみました。

環境
Win8.1
VB2008
.NET 3.5 SP

フォームに4つのテキストボックスとツールチップを設置し以下のソースを張り付けてみてください。
(各種コントロールのプロパティはデフォルトのままです。)
=============================================
Public Class Form1

    Private Sub TextBox1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.MouseEnter
        Me.ToolTip1.Show("あ", TextBox1)
    End Sub

    Private Sub TextBox1_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.MouseLeave
        Me.ToolTip1.Hide(TextBox1)
    End Sub

    Private Sub TextBox2_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox2.MouseEnter
        Me.ToolTip1.Show("いい", TextBox3)
    End Sub

    Private Sub TextBox2_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox2.MouseLeave
        Me.ToolTip1.Hide(TextBox3)
    End Sub

    Private Sub TextBox4_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox4.Enter
        Me.ToolTip1.Show("ううう", TextBox4)
    End Sub

    Private Sub TextBox4_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox4.Leave
        Me.ToolTip1.Hide(TextBox4)
    End Sub

End Class
=============================================

【パターン1】
質問者さんが行ったであろうパターンです。
→確かに自動で消えました。

【パターン2】
ものは試しで、パターン1とほぼ同じですが、
Showメソッドを呼び出す際の第2引数を自分自身じゃないコントロールを指定してみました。
→時間が経っても消えませんでした。

【パターン3】
ものは試しで、パターン1とほぼ同じですが、
呼び出すイベントをMouseEnterイベントではなく、Enterイベントにしてみました。
→Tabキーでフォーカスを当てると表示され、時間が経っても消えませんでした。

直接的な解決にはなりませんが、
逃げ道orヒントには使えないでしょうか?


ちなみにToolTipクラスにはProtectedのStopTimerなるメソッドがあったので、
ToolTipクラスを継承したToolTipExクラスというクラスを作成し、
StopTimerメソッドを呼び出してみたのですが、使い方(呼び出すタイミング等)を間違っているのかよくわかりませんが、
MSDNに載っている動作はしませんでした・・・。
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.tooltip.stoptimer(v=vs.90).aspx

参考まで。


引用返信 編集キー/
■70166 / inTopicNo.5)  Re[4]: ツールチップの表示時間について
□投稿者/ tocs (8回)-(2014/02/26(Wed) 21:31:01)
tocs さんの Web サイト
No70147 (Yoko さん) に返信

EnterからLeaveの間にWindowFormsのTimer回して、Show呼びまくれば特にちらつきもせず表示できるみたいです。
引用返信 編集キー/
■70332 / inTopicNo.6)  Re[5]: ツールチップの表示時間について
□投稿者/ Yoko (3回)-(2014/03/12(Wed) 17:52:58)
anさん、tocsさん、回答ありがとうございます。
返答が遅くなってしまい、申し訳ありません。

提示していただいた案から、下記のように作ってみました。

--------------------------------------------------------------------------------
TextBoxクラスを継承してTextBoxExというクラスを作成し、その中でツールチップの表示の処理を記述しました。

Public Class TextBoxEx
    Inherits TextBox
    
    Private isEnter As Boolean = False
    Private tooltip As New ToolTip
    Private WithEvents timer As New Timer

    Protected Overrides Sub OnEnter(e As EventArgs)

        tooltip.Hide(Me)
        tooltip.Active = False
        timer.Enabled = False

        isEnter = True

        MyBase.OnEnter(e)

    End Sub

    Protected Overrides Sub OnLeave(e As EventArgs)

        tooltip.Active = True

        isEnter = False

        MyBase.OnLeave(e)

    End Sub

    Protected Overrides Sub OnMouseEnter(e As EventArgs)

        If isEnter = False Then
            timer.Enabled = True
        Else
            timer.Enabled = False
        End If

        MyBase.OnMouseEnter(e)

    End Sub

    Protected Overrides Sub OnMouseLeave(e As EventArgs)

        timer.Enabled = False
        tooltip.RemoveAll()

        MyBase.OnMouseLeave(e)

    End Sub

    Private Sub timer_Tick(sender As Object, e As EventArgs) Handles timer.Tick
        Me.tooltip.Show(Me.Text, Me)
    End Sub

End Class

--------------------------------------------------------------------------------

今回はtocsさんから教えていただいた
> EnterからLeaveの間にWindowFormsのTimer回して、Show呼びまくれば特にちらつきもせず表示できるみたいです。
がまさに望んでいたことでしたので、そちらでやりました。

anさんが教えてくださった方法も、ツールチップについてよく理解していなかったので、
とても勉強になりました。

ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -