2008-09-27 3 views
7

ToolStripItems показывает активное выделение, когда вы наводите на них курсор, даже если форма, в которой они находятся, не находится в фокусе. Однако они не показывают свои всплывающие подсказки, если форма не сфокусирована. Я видел ToolStrip 'click-though' hack. Кто-нибудь знает, как заставить ToolStripButton показывать свою подсказку, когда ее родительская форма не находится в фокусе?Показывать всплывающую подсказку на не сфокусированном ToolStripItem

Спасибо!

+0

Почему вы хотите это сделать? Ошибка скорее является активным отслеживанием, когда форма не сфокусирована. – OregonGhost 2008-09-27 13:44:46

ответ

2

Возможно, один из двух подходов в этом коде будет пинать вас в правильном направлении ...

public Form1() 
{ 
    InitializeComponent(); 

    tooltip = new ToolTip(); 
    tooltip.ShowAlways = true; 
} 

private ToolTip tooltip; 
private void toolStripButton_MouseHover(object sender, EventArgs e) 
{ 
    if (!this.Focused) 
    { 
     ToolStripItem tsi = (ToolStripItem)sender; 
     tooltip.SetToolTip(toolStrip1, tsi.AutoToolTip ? tsi.ToolTipText : tsi.Text); 
     /*tooltip.Show(tsi.AutoToolTip ? tsi.ToolTipText : tsi.Text, this, 
      new Point(toolStrip1.Left, toolStrip1.Bottom));*/ 
    } 
} 

private void toolStripButton_MouseLeave(object sender, EventArgs e) 
{ 
    tooltip.RemoveAll(); 
} 

Проблема с первым вы не можете установить его на кнопку непосредственно, это Безразлично 't наследуется от Control, и всплывающая подсказка не появится, пока вы не перейдете через полосу, но не над кнопкой.

Проблема со вторым (прокомментированным способом) заключается в том, что он вообще не отображается. Не совсем понятно, почему, но, возможно, вы можете отладить его.

5

Проблема в том, что элементы управления ToolStrip, такие как ToolStripButton или ToolStripDropDownButton, не наследуются от элемента управления. На данный момент я обратился к проблеме, сосредоточив ToolStrip всякий раз, когда пользователь наводил кнопку над кнопкой. Событие MouseHover кнопки запускается слишком поздно - после того, как будет запущен код «show tooltip», поэтому я расширил класс ToolStripDropDownButton и использовал свою новую кнопку. Этот метод должен работать на любой другой кнопки, как классы наследования от ToolStripItem

public class ToolStripDropDownEx : ToolStripDropDownButton 
{ 
    public ToolStripDropDownEx(string text) 
    { 
    } 

    protected override void OnMouseHover(EventArgs e) 
    { 
     if (this.Parent != null) 
      Parent.Focus(); 
     base.OnMouseHover(e); 
    } 
} 
1

Я пытался сделать то же самое, и решили, что она собирается быть довольно сложным и не стоит. Причина в том, что внутри .NET-код специально разработан, чтобы отображать всплывающую подсказку только в том случае, если окно активно - они проверяют это на уровне Win32, поэтому будет сложно подделать код.

Вот фрагмент кода в ToolTip.cs, который проверяет «GetActiveWindow()» и возвращает false. Вы можете увидеть комментарий в коде «ToolTips должны отображаться только в активной Windows».

Кстати, вы можете увидеть весь исходный код для BCL .NET с Visual Studio 2008, вот инструкции, которые я использовал:

http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx

// refer VsWhidbey 498263: ToolTips should be shown only on active Windows. 
private bool IsWindowActive(IWin32Window window) 
{ 
    Control windowControl = window as Control; 
    // We want to enter in the IF block only if ShowParams does not return SW_SHOWNOACTIVATE. 
    // for ToolStripDropDown ShowParams returns SW_SHOWNOACTIVATE, in which case we DONT want to check IsWindowActive and hence return true. 
    if ((windowControl.ShowParams & 0xF) != NativeMethods.SW_SHOWNOACTIVATE) 
    { 
     IntPtr hWnd = UnsafeNativeMethods.GetActiveWindow(); 
     IntPtr rootHwnd =UnsafeNativeMethods.GetAncestor(new HandleRef(window, window.Handle), NativeMethods.GA_ROOT); 
     if (hWnd != rootHwnd) 
     { 
      TipInfo tt = (TipInfo)tools[windowControl]; 
      if (tt != null && (tt.TipType & TipInfo.Type.SemiAbsolute) != 0) 
      { 
       tools.Remove(windowControl); 
       DestroyRegion(windowControl); 
      } 
      return false; 
     } 
    } 
    return true; 
} 
2

я попробовал несколько вещей, и нашел, что это самый простой

когда я создаю элементы ToolStripButton я добавил обработчик события к его парения событие:

private sub SomeCodeSnippet() 

    Me.tooltipMain.ShowAlways = True 

    Dim tsi As New ToolStripButton(String.Empty, myImage) 
    tsi.ToolTipText = "my tool tip text" 
    toolstripMain.Add(tsi) 

    AddHandler tsi.MouseHover, AddressOf ToolStripItem_MouseHover 

end sub 

, то обработчик события:

Private Sub ToolStripItem_MouseHover(ByVal sender As Object, ByVal e As System.EventArgs) 

    If TypeOf sender Is ToolStripButton Then 
     Me.tooltipMain.SetToolTip(Me.toolstripMain, CType(sender, ToolStripButton).ToolTipText) 
    End If 

End Sub 

это работает очень хорошо, хотя я замечаю маленькую начальную задержку при наведении курсора мыши на ToolStrip за 1 раз

Смежные вопросы