2009-05-15 15 views
2

私はいくつかの項目が列の幅に収まるよりも多くのテキストを持っているListViewを持っています。 ShowItemToolTipsは、私が列の上にカーソルを置くことができ、偉大な全文を見ることを意味する。c#ShowItemToolTips sticky

しかし、本当に長いテキストの場合は、すべてを読む時間がなくなる前に消えてしまいますので、長くしておきたいと思います(手動で解除するまで、たとえばマウスを離したりクリックするなど)。これを行う?

答えて

6

をあなたが知っている、もちろん、.NETのリストビュークラスの下のWindowsリストビューであることこのリストビューコントロールは、Windowsのツールヒントコントロールを使用して切り捨てられた文字列を表示します。

LVM_GETTOOLTIPSメッセージを使用して、この基礎となるツールチップコントロールを保持することができます。

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
public static extern IntPtr SendMessage(IntPtr hWnd, int msg, 
             int wParam, int lParam); 

public IntPtr GetTooltipControl(ListView lv) { 
    const int LVM_GETTOOLTIPS = 0x1000 + 78; 
    return SendMessage(lv.handle, LVM_GETTOOLTIPS, 0, 0); 
} 

ツールチップコントロールのハンドルがあれば、メッセージを送信できます。

public void SetTooltipDelay(ListView lv, int showTime) { 
    const int TTM_SETDELAYTIME = 0x400 + 3; 
    const int TTDT_AUTOPOP = 2; 

    IntPtr tooltip = this.GetTooltipControl(lv); 
    if (tooltip != IntPtr.Zero) { 
     SendMessage(tooltip, TTM_SETDELAYTIME, TTDT_AUTOPOP, showTime); 
    } 
} 

showTimeは、コントロールを表示したままにするミリ秒数です。

+0

@Grammarian:ありがとう - 私はこの回答を見つけて何か他のものを探していました。 5分前と比べてやや良いです。素晴らしい! – RichieHindle

0

がツールヒントクラスをチェックしてください。AutoPopupDelay方法は、あなたがツールチップが表示されたままの時間の長さを設定することができます。

+0

確かに、インスタンスを変更するにはどうすればよいですか? (あまりにも多くのテキストを含むサブアイテムに対して自動的に生成されたサブアイテム)サブアイテムはツールチッププロパティを持っていないようです... – second

2

user32.dll P/Invoke呼び出しの代わりに純粋な.NETコードがあります。 ToolTipコントロールを作成し、すべての遅延プロパティを設定します。次に、ListView MouseMoveイベントを使用して、現在選択されているリストビューコントロールに基づいてツールヒントテキストを切り替えます。

ToolTip toolTip = new ToolTip(); 
    toolTip.AutoPopDelay = 7000; 
    toolTip.InitialDelay = 450; 
    toolTip.ReshowDelay = 450; 

    listView.MouseMove += new MouseEventHandler(listView_MouseMove); 

以下に2つのオプションを示しました。オプション1は、ツールチップのテキストをサブアイテムのTextプロパティに設定します。オプション#2は、ツールヒントを親のListViewItemのToolTipTextプロパティに設定します。

void listView_MouseMove(object sender, MouseEventArgs e) 
    { 
     ListViewItem item = listView.GetItemAt(e.X, e.Y); 
     ListViewHitTestInfo info = listView.HitTest(e.X, e.Y); 

     if ((item != null) && (info.SubItem != null)) 
     { 
      // Option #1 - Set it to the sub-item text 
      // toolTip.SetToolTip(listView, info.SubItem.Text); 

      // Option #2 - Sets it to the tool tip text of the sub-item 
      toolTip.SetToolTip(listView, info.Item.ToolTipText); 
     } 
     else 
     { 
      toolTip.SetToolTip(listView, null); 
     } 
    } 
関連する問題