powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / System.Windows.Forms.ToolBar + Tooltips = Глюки
4 сообщений из 4, страница 1 из 1
System.Windows.Forms.ToolBar + Tooltips = Глюки
    #38884122
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Повелся я на Net - System.Windows.Forms.ToolBar чтоб ToolBar через API не рисовать (не путать со "стрипом").

С одной стороны у него есть одно хорошее свойство - TabIndex+Tabstop
Т.е. юзер может прийти в Toolbar через Tab, стрелочками ходить между кнопками и Enter-ом кнопки нажимать.

И есть большое подозрение что этот функционал с "фокусом" есть чисто .Net прибамбас,
потому как ходить с клавиатуры по кнопочкам тулбара созданного через CreateWindowEx фиг получится.

А с другой стороны это приводит к глюкам при использовании Tooltips на кнопках.

1) Когда ходишь по кнопкам с клавиатуры, тултипы появляются как если водить над кнопкой мышью. Не уверен что это вообще гуд.
2) Форма c Toolbar находится в фокусе -> Тыкаемся в рабочий стол -> Тыкаемся в шапку формы с Toolbar. Если Toolbar при этом в фокусе, всплывает примечание к первой кнопке
3) Просто ходим табом по элементам формы. Как только Toolbar получает фокус, всплывает примечание к первой кнопке.
4) Самое паршивое: примечание во всех этих 3-х случаях может всплывать не рядом с кнопкой а где попало, например в другом конце экрана далеко за пределами формы.

Сталкивался кто? Как лечить?

Воспроизвести просто: кинуть Toolbar на форму, добавить пару-тройку кнопок и задать для них свойство ToolTipText.

Можно конечно попробовать делать примечания через TTN_GETDISPINFO (как всегда и делал), не используя ToolTipText но не уверен что это спасет.
Подозреваю что .Net как то имитирует движение мыши над кнопкой ради реализации получения "фокуса" кнопками.
...
Рейтинг: 0 / 0
System.Windows.Forms.ToolBar + Tooltips = Глюки
    #38884532
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сколько не бился, не могу выловить ни TTN_GETDISPINFO ни TBN_GETINFOTIP, а без них свои ToolTip-ы не задашь.
При этом TBN_HOTITEMCHANGE генерится исправно.

Cюда глядел:
http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/ToolBar.cs,1674
Что-то они там мутят с тултипом.

Хоть целиком через API Toolbar делать (как и было у меня). Но тогда "фокуса" не будет.
А баг гнусный.
...
Рейтинг: 0 / 0
System.Windows.Forms.ToolBar + Tooltips = Глюки
    #38884590
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий772) Форма c Toolbar находится в фокусе -> Тыкаемся в рабочий стол -> Тыкаемся в шапку формы с Toolbar. Если Toolbar при этом в фокусе, всплывает примечание к первой кнопке
3) Просто ходим табом по элементам формы. Как только Toolbar получает фокус, всплывает примечание к первой кнопке..
Доперло. Надо чтоб он не делал Hover для первой кнопки при получении "фокуса".
Код: vbnet
1.
2.
3.
  Private Sub ToolBar1_GotFocus(sender As Object, e As EventArgs) Handles ToolBar1.GotFocus
    Call SendMessage(ToolBar1.Handle, TB_SETHOTITEM, -1, 0)
  End Sub


Дмитрий774) Самое паршивое: примечание во всех этих 3-х случаях может всплывать не рядом с кнопкой а где попало, например в другом конце экрана далеко за пределами формы...
При каких-то положениях формы (ближе к левому краю экрана) почему-то иногда всплывает в верхнем левом углу экрана а не рядом с кнопкой, если прийти на первую кнопку тулбара стрелками клавиатуры. Но с учетом исправления (2) и (3) уже не так паршиво и можно забить.
...
Рейтинг: 0 / 0
System.Windows.Forms.ToolBar + Tooltips = Глюки
    #38885143
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий771) Когда ходишь по кнопкам с клавиатуры, тултипы появляются как если водить над кнопкой мышью. Не уверен что это вообще гуд.
...
4) Самое паршивое: примечание во всех этих 3-х случаях может всплывать не рядом с кнопкой а где попало, например в другом конце экрана далеко за пределами формы.

Сделал. По TBN_HOTITEMCHANGE отслеживаем кнопку которая стала Hover, проверяем через TB_HITTEST находится ли мышь над этой кнопкой, и только если ДА, то выводим тултип, текст которого копируем из .Tag кнопки. Если нет, то устанавливаем .ToolTipText = "". Таким образом показываем тултипы только при движении мыши над кнопками.
Проблема (4) автоматически уходит.
TB_SETHOTITEM -1 при получении фокуса тулбаром можно не делать, но не помешает, т.к. это подсвечивание первой кнопки не по делу ни к чему.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
Imports System.Runtime.InteropServices

Public Class Form1

  Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    'Debug.WriteLine(m.ToString())

    Dim uNMHDR As NMHDR
    Dim uNMTBHI As NMTBHOTITEM

    Select Case m.Msg
      Case WM_NOTIFY 'toolbar
        uNMHDR = CType(Marshal.PtrToStructure(m.LParam, GetType(NMHDR)), NMHDR)
        Select Case uNMHDR.code
          Case 64823 'TBN_HOTITEMCHANGE=(TBN_FIRST - 13)=-713
            If (uNMHDR.hwndFrom = ToolBar1.Handle) Then
              uNMTBHI = CType(Marshal.PtrToStructure(m.LParam, GetType(NMTBHOTITEM)), NMTBHOTITEM)
              If ((uNMTBHI.dwFlags And HICF_LEAVING) <> HICF_LEAVING) Then
                'Debug.Print("Button " & CStr(uNMTBHI.idNew) & " hotlited")
                Dim pt As POINTAPI
                pt.x = Control.MousePosition.X
                pt.y = Control.MousePosition.Y
                ScreenToClient(ToolBar1.Handle, pt)
                Dim idHitTest As Integer = SendMessage_POINTAPI(ToolBar1.Handle, TB_HITTEST, 0, pt)
                If idHitTest = uNMTBHI.idNew Then
                  'если мышь над HotItem, то отображаем ToolTip (храним в Tag кнопки)
                  ToolBar1.Buttons(uNMTBHI.idNew).ToolTipText = ToolBar1.Buttons(uNMTBHI.idNew).Tag
                Else
                  'если пришли в HotItem клавиатурой, то НЕ отображаем ToolTip
                  ToolBar1.Buttons(uNMTBHI.idNew).ToolTipText = ""
                End If
              Else
                'Debug.Print("No buttons hotlited")
              End If
            End If
        End Select
    End Select

    ' Forward message to base WndProc.
    MyBase.WndProc(m)
  End Sub

  Private Sub ToolBar1_GotFocus(sender As Object, e As EventArgs) Handles ToolBar1.GotFocus
    'если не хотим делать первую кнопку Hover при получении "фокуса"
    'по кнопкам достаточно ходить стрелками
    Call SendMessage(ToolBar1.Handle, TB_SETHOTITEM, -1, 0)
  End Sub

End Class



Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
Imports System.Runtime.InteropServices

Module Module1

  Public Const WM_NOTIFY As Integer = &H4E&

  <StructLayout(LayoutKind.Sequential)>
  Public Structure POINTAPI
    Dim x As Integer
    Dim y As Integer
  End Structure

  Public Declare Function ScreenToClient Lib "user32" _
   (ByVal hwnd As IntPtr, ByRef lpPoint As POINTAPI) As Boolean

  Public Declare Unicode Function SendMessage Lib "user32" Alias "SendMessageW" _
   (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As IntPtr) As Integer
  Public Declare Unicode Function SendMessage_POINTAPI Lib "user32" Alias "SendMessageW" _
   (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByRef lParam As POINTAPI) As Integer

  <StructLayout(LayoutKind.Sequential)>
  Public Structure NMHDR
    Dim hwndFrom As IntPtr   ' Window handle of control sending message
    Dim idFrom As UIntPtr    ' Identifier of control sending message
    Dim code As UInt16       ' Specifies the notification code
  End Structure

  'Toolbar Control Structures
  Public Const HICF_ENTERING = &H10 ' idOld is invalid 
  Public Const HICF_LEAVING = &H20 ' idNew is invalid 

  <StructLayout(LayoutKind.Sequential)>
  Public Structure NMTBHOTITEM
    Dim hdr As NMHDR
    Dim idOld As Integer
    Dim idNew As Integer
    Dim dwFlags As Integer
  End Structure

  'Toolbar Control Messages
  Private Const WM_USER = &H400
  Public Const TB_HITTEST = WM_USER + 69
  Public Const TB_SETHOTITEM = (WM_USER + 72)

  'Toolbar Control Notifications

  Public Const TBN_FIRST = -700
  Public Const TBN_HOTITEMCHANGE As Integer = (TBN_FIRST - 13)

End Module

...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / System.Windows.Forms.ToolBar + Tooltips = Глюки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]