2011-01-11 33 views
5

私は動的に塗りつぶしたContextMenuStripを持っていますが、各ToolStripMenuItemにはツールチップの書式付きテキストがあります。また、このテキストをユーザーに理解させるためには、「Courier New」などの固定幅フォントを使用する必要があります。デフォルトのフォントは、標準の非固定幅フォントです。 ToolTipオブジェクトのゲッターやDrawイベントをオーバーライドする方法、スタイルを設定する方法が見つかりませんでした。ToolStripMenuItemツールチップフォントを変更することはできますか?

ToolStripMenuItemのツールチップフォントを変更することは可能ですか?

ToolTipから継承するCustomToolTipを実装しても、新しいツールチップをToolStripMenuItemに渡すことはできません。

+0

私はあなたがそのようなhttp://www.telerik.comなど、多くのサードパーティのツールチップコンポーネントのいずれかを使用する必要があるかもしれない疑いがある – Lazarus

+0

残念ながら、私は、任意のサードパーティ製のコンポーネントを使用することはできません。 – ElyaSh

+0

ここでは何かが意味をなさない。あなたはWPFという質問にタグを付けましたが、あなたは 'ToolStripMenuItem'コントロールについて話しています。これはWinFormsコントロールです。あなたはどちらを使っていますか?私はそれが大きな違いをもたらすと思う。 –

答えて

2

ToolTipを継承するカスタムのToolTipクラス(CustomToolTip)を作成できます。その後、OnDrawイベントを処理する必要があります。そのイベントの中でフォントを変更することができます。

Look here(例としてvbとc#があります)。

EDIT

あなたがあなた自身のカスタムツールチップのレンダリングを処理しなければならない(IE:ONMOUSEOVER toolstripmenuitemの、OnMouseLeaveイベント)。カスタムツールチップを使用するcustomtoolstripmenuitemを作成できるかもしれませんが、toolstripmenuitemがツールチップのpropety/objectを公開しているかどうかはわかりません。次のように

+0

問題はToolTipから継承するのではなく、ToolStripMenuItemに渡すことで問題になります。 – ElyaSh

+0

あなた自身のカスタムツールチップのレンダリングを処理する必要があります(IE:toolstripmenuitemのOnMouseOver、OnMouseLeaveイベント)。カスタムツールチップを使用するcustomtoolstripmenuitemを作成できるかもしれませんが、toolstripmenuitemがツールチップのpropety/objectを公開しているかどうかはわかりません。 –

+0

toolstripmenuitem tooltip propety/objectを公開していないことが私がここで質問することを決めた主な理由です。 – ElyaSh

10

OK、Tony AbramsWilliam Andrusのおかげで、溶液である:

  • 初期化ツールヒントの静的インスタンス。

    toolTip = new ToolTip(); 
    toolTip.OwnerDraw = true; 
    toolTip.Draw += new DrawToolTipEventHandler(tooltip_Draw); 
    toolTip.Popup += new PopupEventHandler(tooltip_Popup);  
    toolTip.UseAnimation = true; 
    toolTip.AutoPopDelay = 500; 
    toolTip.AutomaticDelay = 500; 
    
  • サイズを設定するためのToolTipのポップアップイベント。

    void tooltip_Popup(object sender, PopupEventArgs e) 
    { 
        e.ToolTipSize = TextRenderer.MeasureText(toolTipText, new Font("Courier New", 10.0f, FontStyle.Bold)); 
        e.ToolTipSize = new Size(e.ToolTipSize.Width + TOOLTIP_XOFFSET, e.ToolTipSize.Height + TOOLTIP_YOFFSET); 
    } 
    
  • 実際の描画のためのツールヒントの描画イベントです。

    void tooltip_Draw(object sender, DrawToolTipEventArgs e) 
    { 
    Rectangle bounds = e.Bounds; 
    bounds.Offset(TOOLTIP_XOFFSET, TOOLTIP_YOFFSET); 
    DrawToolTipEventArgs newArgs = new DrawToolTipEventArgs(e.Graphics, e.AssociatedWindow, e.AssociatedControl, bounds, e.ToolTipText, toolTip.BackColor, toolTip.ForeColor, new Font("Courier New", 10.0f, FontStyle.Bold)); 
        newArgs.DrawBackground(); 
        newArgs.DrawBorder(); 
        newArgs.DrawText(TextFormatFlags.TextBoxControl); 
    } 
    
  • ToolStripMenuItemのMouseEnterイベントは、ツールチップを表示します。

    System.Windows.Forms.ToolStripMenuItem item = (sender as System.Windows.Forms.ToolStripMenuItem); 
    toolTip.Show("ToolTipText", item.Owner); 
    
  • ToolStripMenuItemのツールヒントを非表示にするMouseLeaveイベント。

    System.Windows.Forms.ToolStripMenuItem item = (sender as System.Windows.Forms.ToolStripMenuItem); 
    toolTip.Hide(item.Owner); 
    
+1

+1最終的な解決策を投稿していただきありがとうございます!そうすれば、他の誰かが同じ質問でここに到着すれば、あなたはそれをどのように解決したかを知ることができます。私もあなたのためのコードをフォーマットしました。箇条書きの中で書式設定をするのは、通常の4行ではなく、8つの空白をインデントすることです。 –

+0

私はわずかに関連する問題の解決策を探していました。ツールストリップの一部のボタンにカスタムテキストのツールチップを表示しますそれらのすべてに。カスタム図面は必要ありませんでしたが、ツールストリップのビルトインツールチップを無効にして、ToolStripMenuItemのMouseEnterとMouseLeaveを処理してnullまたは空でなければアイテムのツールチップテキストを表示して、うまくいきました。 – neminem

+0

いくつかの状況では、追加の(空白の)ツールチップが表示されましたが、これは私のウィンドウがツールチップを使用したボタンコントロールを再描画したときのようでした。これを解決するため、私はMouseLeaveがツールチップを破棄し、MouseHoverでツールチップを再作成したことを確認しました。明らかに、両方のリスナーの外にある参照が必要です。 –

0

私は、私はこの1つ上の相手に少し遅れだけど、あなたがツールチップを描画するために使用されるツールヒントのインスタンスを設定するためにリフレクションを使用することができます知っています。そのようにした後、通常どおりDrawメソッドを使うことができます。

public void SetToolTipInstance(ToolStrip ts, ToolTip tt) 
{ 
    Type type = ts.GetType.BaseType; 
    int propToolTip = Convert.ToInt32(type.GetField("PropToolTip", BindingFlags.NonPublic | BindingFlags.Static).GetValue(ts)); 
    dynamic ps = type.BaseType.GetProperty("Properties", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(ts); 
    ps.GetType.GetMethod("SetObject", BindingFlags.Instance | BindingFlags.Public).Invoke(ps, {propToolTip,tt}); 
} 
関連する問題