powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Shell_NotifyIcon + Ballon(?) Tooltip
13 сообщений из 13, страница 1 из 1
Shell_NotifyIcon + Ballon(?) Tooltip
    #38267233
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иконка приложения когда в трее.
Хочу чтоб в примечании (Tooltip)
1) большая иконка слева 32х32 либо даже 48х48
2) текст крупным шрифтом сверху (отличается от цвета нижнего текста)
3) текст мелким шрифтом снизу

Подозреваю что на XP большая картинка точно не поддерживается,
насчет остального не уверен.

Такие Tooltip отдельно рисовать умею. Напр.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
      TT.Style = TTBalloon
      TT.Title = "Large font text"
      TT.TipText = "Small font text"
      If sys_WinVista Then 'vista,win7,8
        TT.Icon = lngIcon32
      Else
        TT.Icon = lngIcon16
      End If
      TT.Create ListView.hwnd



Но речь идет именно о Shell_NotifyIcon. Думаю там встроенный механизм.

Примеры чего хочу (глядя на висту, в трее):
примечание к иконке "сеть"
примечание к иконке "аудио/громкость..."
примечание к иконке "дата время"

Идеи, примеры?
...
Рейтинг: 0 / 0
Shell_NotifyIcon + Ballon(?) Tooltip
    #38267447
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Боюсь я неправильно сформулировал желания.
"Ballon Notification" я сделал,
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Private Sub Command1_Click()
  Dim nid As NOTIFYICONDATA
  With nid   'новый код вывода иконки в трей
    .cbSize = Len(nid) 'Size of structure
    .hwnd = Me.hwnd 'Handle to parent window
    .uId = vbNull 'Id of the icon
    .uFlags = NIF_INFO 'Options: show balloon
    .dwInfoFlags = NIIF_INFO
    .uTimeout = 1000 'Timeout when the balloon dissapear
    .szInfo = "Message small font" & Chr(0) 'Message
    .szInfoTitle = "Title large font" & Chr(0) 'Title
  End With
  Shell_NotifyIcon NIM_MODIFY, nid 'Show balloon


это интересно и нужно конечно но это не то:

Речь идет о статическом ToolTip когда возишь по иконке мышкой (без крестиков и "указателей")
Попробую пояснить картинкой.
Хотя бы понять что это такое.
...
Рейтинг: 0 / 0
Shell_NotifyIcon + Ballon(?) Tooltip
    #38267598
_Дмит_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нет win7, но с висты есть %NIIF_LARGE_ICON - не это?
...
Рейтинг: 0 / 0
Shell_NotifyIcon + Ballon(?) Tooltip
    #38267703
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Дмит_нет win7, но с висты есть %NIIF_LARGE_ICON - не это?
NIIF_LARGE_ICON -это для картинки "Ballon Notification"

Копать думаю надо в сторону
NOTIFYICON_VERSION_4

и
In addition to those messages, as of Windows Vista (Shell32.dll version 6.0.6), if a user passes the mouse pointer over an icon with which a balloon notification is associated, the Windows Vista Shell also adds the following messages:

•NIN_POPUPOPEN. Sent when the user hovers the cursor over an icon to indicate that the richer pop-up UI should be used in place of a standard textual tooltip.
•NIN_POPUPCLOSE. Sent when a cursor no longer hovers over an icon to indicate that the rich pop-up UI should be closed.

Shell_NotifyIcon function
Return value
Type: BOOL
Returns TRUE if successful, or FALSE otherwise. If dwMessage is set to NIM_SETVERSION, the function returns TRUE if the version was successfully changed, or FALSE if the requested version is not supported.

У меня пока Shell_NotifyIcon function
возвращает false, пытаюсь
высечь TRUE,
а затем
NIN_POPUPOPEN/NIN_POPUPCLOSE

Картинки внизу, это скорее всего
Normally, when uVersion is set to NOTIFYICON_VERSION_4, the standard tooltip is suppressed and can be replaced by the application-drawn, pop-up UI .
...
Рейтинг: 0 / 0
Shell_NotifyIcon + Ballon(?) Tooltip
    #38268560
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, немного продвинулся (в соответствии с вышеизложенными идеями).
Топтался потому что ошибся с константой NIM_SETVERSION.

Вот этот код
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Public Const NOTIFYICON_VERSION_4 As Long = &H4 'Use Windows Vista behavior
Public Const NIM_SETVERSION = &H4
Private Const WM_USER = &H400
Public Const WM_MySysTrayNotify = WM_USER + &H1

Private Sub Form_Load()

...
  Dim nid As NOTIFYICONDATA
...
  With nid   'код вывода иконки в трей
    .cbSize = Len(nid)
    .hwnd = Me.hwnd
    .uID = vbNull
    .uFlags = NIF_ICON Or NIF_MESSAGE Or NIF_TIP
    .uCallbackMessage = WM_MySysTrayNotify 'WM_MOUSEMOVE
    .hIcon = lngIconTray
    .szTip = "Simple Tray Tooltip" & vbNullChar
    .uTimeoutAndVersion = NOTIFYICON_VERSION_4
  End With
  MsgBox Shell_NotifyIcon(NIM_ADD, nid)
  MsgBox Shell_NotifyIcon(NIM_SETVERSION, nid)


Возвращает на Висте TRUE для NIM_SETVERSION
При этом
1) Стандартный Tooltip (который .szTip) не отображается
2) Активируются
Код: vbnet
1.
2.
Public Const NIN_POPUPOPEN = (WM_USER + &H6)
Public Const NIN_POPUPCLOSE = (WM_USER + &H7)


3) И начинает работать след. код:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
   Case WM_MySysTrayNotify
      Dim lw_lparam
      lw_lparam = LOWORD(lParam)
      Select Case lw_lparam
        ...
        Case NIN_POPUPOPEN
          'Debug.Print "NIN_POPUPOPEN"
          Form1.Text1.Text = Form1.Text1.Text & vbCrLf & "NIN_POPUPOPEN"
          Dim GET_X_LPARAM As Long
          Dim GET_Y_LPARAM As Long
          GET_X_LPARAM = LOWORD(wParam)
          GET_Y_LPARAM = HIWORD(wParam)
          Form1.Text1.Text = Form1.Text1.Text & vbCrLf & "x=" & GET_X_LPARAM & "y=" & GET_Y_LPARAM
          'to indicate that the richer pop-up UI should be used in place of a standard textual tooltip
        Case NIN_POPUPCLOSE
          'Debug.Print "NIN_POPUPCLOSE"
          Form1.Text1.Text = Form1.Text1.Text & vbCrLf & "NIN_POPUPCLOSE"
          'to indicate that the rich pop-up UI should be closed



Дело осталось за "малым".
richer pop-up UI should be
Судя по внешнему виду (образцы чего хочу на картинке внизу), можно использовать Tooltip -независимый.
С картинкой, титлом и текстом. При этом он должен быть без ballon-указателя.
Выводить его видимо надо прямо на Screen,
Вопрос "КУДА" -ответ использовать GET_X_LPARAM и GET_Y_LPARAM,
ну или в зависимости от WhereTaskbar (не обязательно внизу) пихать его в угол.
Я пока не могу такой тултип вывести (никакой пока).
...
Рейтинг: 0 / 0
Shell_NotifyIcon + Ballon(?) Tooltip
    #38269162
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То чего я хочу, называется
Rich tooltips
Описания немного есть здесь:
Notification Area
Еще это называется
Cool Tray Icon Tooltip

С другой стороны, я сейчас взглянул как обстоят дела на Win7 и Win8
и понял, что там такие Rich tooltips не практикуются,
т.е. штатные иконки в трее используют обычные Tooltip, а то что я пытаюсь достичь характерно только для Висты.
Ну, некот. в 2-3 строчки.
Но этого как раз достичь несложно
Код: vbnet
1.
.szTip = "Simple Tray Tooltip" & vbCrLf & "The string number 2" & vbNullChar



Вообще конечно обидно бросить потому что половину работы я сделал.
NIN_POPUPOPEN/CLOSE на Win7/8 также работать будет.

Осталось то собственно только нарисовать этот
the application-drawn, pop-up UI (предполагаю независимый Tooltip).
Только вот никто не подсказывает как,
Вывести Tooltip на Screen (X,Y -известны) из кода.
обидно.
...
Рейтинг: 0 / 0
Shell_NotifyIcon + Ballon(?) Tooltip
    #38269236
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А еще тут эту проблему решали и вроде решили: 3336970
...
Рейтинг: 0 / 0
Shell_NotifyIcon + Ballon(?) Tooltip
    #38269238
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyА еще тут эту проблему решали и вроде решили: 3336970 Ошибся темой, это сюда ответ: 14334116
...
Рейтинг: 0 / 0
Shell_NotifyIcon + Ballon(?) Tooltip
    #38269247
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyОшибся темой, это сюда ответ: 14334116
Ничего страшного. Та тема создана ради этой, чтоб быстрее заметили подвопрос.
Я пока копаю в сторону
How to Implement Tracking Tooltips
Showing a tooltip at any time
Т.е. хочу решить подзадачу #1:
нажали кнопку и тултип сразу появился в заданном (да хоть в любом для начала) месте родительского hwnd (без мышиной возни).
Приложенный класс cTooltip явно под это не заточен.

Второй подзадачей будет.
Как вывести его на SCREEN а не в textbox.hwnd или listview.hwnd - (если я конечно правильно понимаю что родителем должен быть screen.hwnd(?) -см. на нижние картинки на рисунке).
...
Рейтинг: 0 / 0
Shell_NotifyIcon + Ballon(?) Tooltip
    #38269295
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77 нажали кнопку и тултип сразу появился ...(да хоть в любом для начала) месте... (без мышиной возни).
Как вывести его на SCREEN а не в textbox.hwnd или listview.hwnd - (если я конечно правильно понимаю что родителем должен быть screen.hwnd(?) -см. на нижние картинки на рисунке).
Кажись убил еще двух зайцев:
Если чуть испохабить код класса:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Public Function Create(ByVal ParentHwnd As Long) As Boolean
...
   'now set our tooltip info structure
   With ti
      .lFlags = TTF_IDISHWND Or TTF_TRACK Or TTF_ABSOLUTE
      'set the hwnd prop to our parent control's hwnd
      .hwnd = m_lParentHwnd 'screen==0
      .lId = m_lParentHwnd 'screen==0
      .hInstance = App.hInstance
      '.lpRect = lpRect '????????
      .lSize = Len(ti)
   End With
   
   'add the tooltip structure
   SendMessage m_lTTHwnd, TTM_ADDTOOLA, 0&, ti
...
   SendMessage m_lTTHwnd, TTM_TRACKACTIVATE, True, ti


то код
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Private Sub Command2_Click()
    TT.Style = TTStandard
    TT.Title = "Large title Text"
    TT.TipText = "Small tooltip text"
    TT.Icon = lngIconTIP
    TT.Create 0
End Sub

выводит неубираемый Tooltip аккурат в верхний левый угол ЭКРАНА

Код
Код: vbnet
1.
2.
3.
Private Sub Command3_Click()
  TT.Destroy
End Sub


Убивает Tooltip
Результат прилагаю на картинке.
Нетрудно понять, что этот тултип - то же самое что на моих нижних "вистовских картинках" (размер иконки, цвет и размер шрифтов на висте причешутся).

Т.е. по сути осталось присунуть эту штуку ПО МЕСТУ (GET_X_LPARAM, GET_Y_LPARAM) и подвязать Create/Destroy к NIN_POPUPOPEN/NIN_POPUPCLOSE
...
Рейтинг: 0 / 0
Shell_NotifyIcon + Ballon(?) Tooltip
    #38269358
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Т.е. по сути осталось присунуть эту штуку ПО МЕСТУ (GET_X_LPARAM, GET_Y_LPARAM) ...
Муторно, но сделал (были коды про TaskBar), с TaskBar надо играться
Код: 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.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
...
   Dim res As Long
   If mvarAttachToTaskbar = False Then 'куда заказали, туда и рисуем
     With pt
       .x = mvarXpos
       .y = mvarYpos
     End With
   
     'ClientToScreen m_lTTHwnd, pt
     ptTip = pt.y * &H10000
     ptTip = ptTip + pt.x
   
     SendMessage m_lTTHwnd, TTM_TRACKPOSITION, 0, ByVal ptTip
     SendMessage m_lTTHwnd, TTM_TRACKACTIVATE, True, ti
     'Calculate tooltip width and height
     res = SendMessage(m_lTTHwnd, TTM_GETBUBBLESIZE, 0, ti)
     mvarXwidth = LOWORD(res)
     mvarYheight = HIWORD(res)
   Else
     'если пытаться TTM_GETBUBBLESIZE без TTM_TRACKACTIVATE то на XP будет crash
     'по сути на XP код не нужен, а на висте crash-а нет но от греха подальше
     'workaround - первоначально убираем за пределы экрана, чтоб узнать размер и правильно расположить
     SendMessage m_lTTHwnd, TTM_TRACKPOSITION, 0, ByVal ((-1000) * &H10000 - 1000)
   
     SendMessage m_lTTHwnd, TTM_TRACKACTIVATE, True, ti
   
     'Calculate tooltip width and height
     res = SendMessage(m_lTTHwnd, TTM_GETBUBBLESIZE, 0, ti)
     mvarXwidth = LOWORD(res)
     mvarYheight = HIWORD(res)
     
     Dim TBxy As RECT
     Dim TBpos As String
     TBxy = TaskBarPX
     TBpos = WhereTaskbarFULL
     'коррекция положения на экране
     If TBpos = "UP" Then
       If mvarYpos < TBxy.Bottom Then mvarYpos = TBxy.Bottom
     Else
       If mvarYpos < 0 Then mvarYpos = 0
     End If
     If TBpos = "LEFT" Then
       If mvarXpos < TBxy.Right Then mvarXpos = TBxy.Right
       mvarYpos = mvarYpos - mvarYheight 'по нижнему краю
     Else
       If mvarXpos < 0 Then mvarXpos = 0
     End If
     If TBpos = "RIGHT" Then
       If ((mvarXpos + mvarXwidth) > TBxy.Left) Then 'но это только если taskbar справа
         mvarXpos = TBxy.Left - mvarXwidth
       End If
       mvarYpos = mvarYpos - mvarYheight 'по нижнему краю
     Else
       If ((mvarXpos + mvarXwidth) > (Screen.Width / Screen.TwipsPerPixelX)) Then
         mvarXpos = (Screen.Width / Screen.TwipsPerPixelX) - mvarXwidth
       End If
     End If
     If TBpos = "DOWN" Then
       If ((mvarYpos + mvarYheight) > TBxy.Top) Then 'но это только если taskbar внизу
         mvarYpos = TBxy.Top - mvarYheight
       End If
     Else
       If ((mvarYpos + mvarYheight) > (Screen.Height / Screen.TwipsPerPixelY)) Then
         mvarYpos = (Screen.Height / Screen.TwipsPerPixelY) - mvarYheight
       End If
     End If
    
    With pt
      .x = mvarXpos
      .y = mvarYpos
    End With
    'ClientToScreen m_lTTHwnd, pt
    
    ptTip = pt.y * &H10000
    ptTip = ptTip + pt.x
     
    SendMessage m_lTTHwnd, TTM_TRACKPOSITION, 0, ByVal ptTip
...
Рейтинг: 0 / 0
Shell_NotifyIcon + Ballon(?) Tooltip
    #38269361
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, собственно все почти получилось.
Осталось 2 вопроса:

1.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
    lngIconTIP48 = LoadImage(App.hInstance, MAKEINTRESOURCE(201), IMAGE_ICON, 48, 48, LR_DEFAULTCOLOR)
...
    If IsWinVista Then
      TT.Icon = lngIconTIP48
...

  If mvarTitle <> vbNullString Or mvarIcon <> TTNoIcon Then
      SendMessage m_lTTHwnd, TTM_SETTITLE, CLng(mvarIcon), ByVal mvarTitle
   End If


Не хочет делать иконку 48х48 , форматирует ее под 32х32 максимум.
Что-то где-то упустил? На картинке "Volume" иконка явно больше чем 32.

2. Проблема проиллюстрирована на картинке ниже.
Если делаю "standard" (верхние картинки), то что-то он стиль не соблюдает.
Шрифт не тот и лепит в кучу.
Если делаю
OR TTS_BALLON
(это единственное отличие)
то стиль как надо (шрифты и размеры), но самого BALLON (то бишь указывающая стрелка)
мне как раз и не надо.
Как-то стилями выправить можно?
Не занимаясь установкой шрифтов и геометрией окна вручную?
...
Рейтинг: 0 / 0
Shell_NotifyIcon + Ballon(?) Tooltip
    #38271145
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все, решил эту задачу.
14342056
Хотя конечно времени потратил.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Shell_NotifyIcon + Ballon(?) Tooltip
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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