2008-09-27 10 views
7

ToolStripItems show Aktywne podświetlenie po najechaniu na nie myszą, nawet jeśli formularz, w którym się znajduje, nie jest ostry. Nie pokazują jednak swoich podpowiedzi, chyba że forma jest skupiona. Widziałem ToolStrip 'click-though' hack. Czy ktoś wie, w jaki sposób ToolStripButton wyświetla etykietę narzędzia, gdy jej formularz macierzysty nie jest ostry?Wyświetlanie etykiety narzędzia na nieostrym ToolStripItem

Dzięki!

+0

Dlaczego chcesz to zrobić? Błąd jest raczej aktywnym śledzeniem, gdy formularz nie jest skupiony. – OregonGhost

+0

@OregonGhost - utworzyłem pływający/zawsze na górze pasek narzędzi i chciałem, aby podpowiedzi były pokazywane po najechaniu myszą, nawet gdy inne aplikacje były aktywne. – foson

Odpowiedz

2

Być może jeden z tych dwóch podejść w tym kodzie będą kopać cię w dobrym kierunku ...

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

Problem z pierwsze nie można ustawić go do przycisku bezpośrednio, to nie robi Dziedziczy po Control, a etykieta narzędziowa nie pojawi się, dopóki nie znajdziesz się nad paskiem, ale nie nad przyciskiem.

Problem z drugim (skomentowany sposób) polega na tym, że wcale się nie wyświetla. Nie do końca pewny, dlaczego, ale może możesz go usunąć.

5

Problem polega na tym, że ToolStrip "steruje" tak, jak ToolStripButton lub ToolStripDropDownButton nie dziedziczą z Control. Na razie rozwiązałem problem, skupiając ToolStrip, gdy użytkownik unosi się nad przyciskiem. Zdarzenie MouseHover przycisku jest uruchamiane zbyt późno - po uruchomieniu kodu "show tooltip", więc rozszerzyłem klasę ToolStripDropDownButton i użyłem mojego nowego przycisku. Metoda ta powinna działać na którykolwiek z pozostałych klas guzików jak dziedziczenie z 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

starałem się zrobić to samo i ustalił, że to będzie bardzo trudne i nie warto. Powodem jest to, że wewnętrznie kod .NET jest specjalnie zaprojektowany tak, aby wyświetlał tylko etykietę narzędzia, jeśli okno jest aktywne - sprawdzają to na poziomie Win32, więc trudno będzie zmyślić kod.

Oto fragment kodu w ToolTip.cs, który sprawdza "GetActiveWindow()" i zwraca wartość false. Komentarz można zobaczyć w kodzie "Etykiety narzędzi powinny być wyświetlane tylko w aktywnym systemie Windows."

Nawiasem mówiąc, można zobaczyć cały kod źródłowy dla plc .NET z Visual Studio 2008, oto instrukcje użyłem:

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

Próbowałem kilka rzeczy i Okazało się, że najprostszym

gdy tworzę elementy toolstripbutton dodałem obsługi zdarzeń do jego zdarzenie najechania:

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 

następnie obsługi zdarzeń:

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 

ten działa bardzo ładnie, choć robię zauważyć niewielką początkowe opóźnienie po najechaniu na ToolStrip na 1 raz

Powiązane problemy