powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
24 сообщений из 24, страница 1 из 1
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
    #38270277
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пложу опять новую тему из этой
Shell_NotifyIcon + Ballon(?) Tooltip

Картинка объяснит лучше.
Нужно (на вистообразных):
Как Ballon но не Ballon (без stem).

Хотя глядя на целевые примеры, подозреваю что шрифты (м.б.) делаются через CustomDraw (ToolTip).
Потому что на классике эти "образцы" выглядят без жирного шрифта в Title.
И размеры Tooltip тоже "ручками". На счет последнего сомнения, потому что
про TTM_SETMARGIN в MSDN написано:
Remarks
This message has no effect when the application runs on Windows Vista and visual styles are enabled for the tooltip. You can disable visual styles for the tooltip by using SetWindowTheme.
А они там (при виста-интерфейсе) явно не отключены.

Но если как-то убрать STEM в Ballon то меня бы это устроило.
Кстати что интересно TTM_GETBUBBLESIZE (вычисляет width и height) игнорирует область STEM (стрелка указатель в режиме ballon), именно поэтому на моих виста-картинках в режиме баллон tooltip задвигается под Taskbar (вычисляется его положение если бы STEM не было).

И еще. Я хотел поиграться с ToolTip в ControlSpy.
Я вообще там Tooltip в упор не вижу, т.е. раздел есть а не могу сделать чтоб он появился (Никак!!!)
...
Рейтинг: 0 / 0
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
    #38270484
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Хотя глядя на целевые примеры, подозреваю что шрифты (м.б.) делаются через CustomDraw (ToolTip).
Ага, не тут то было
Если делать
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    Case WM_NOTIFY
      'Debug.Print "WM_NOTIFY"
      CopyMemory uNMHDR, ByVal lParam, Len(uNMHDR)
      If uNMHDR.hwndFrom = TT.hwnd Then
        Select Case uNMHDR.code
          Case NM_CUSTOMDRAW
            Debug.Print "NM_CUSTOMDRAW"
            Static lvcd As NMTTCUSTOMDRAW
            CopyMemory lvcd, ByVal lParam, Len(lvcd)   ' every structs' member is a Long
            Select Case lvcd.nmcd.dwDrawStage
              ' ====================================================
              Case CDDS_PREPAINT
                Debug.Print "CDDS_PREPAINT"
                SelectObject lvcd.nmcd.hdc, fnt_TT.hFont
                Exit Function


то шрифт меняется только
на классике в IDE -и в Title, и в Text
на XP (с манифестом) -только в Title
на Висте - ничего не меняется - плевать ей на это
...
Рейтинг: 0 / 0
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
    #38270504
катастрофа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, ответа я конечно-же не знаю, сорри, просто интересно Ваши задачи, которые Вы решаете на всех ЯП так туго идут?
...
Рейтинг: 0 / 0
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
    #38270539
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
катастрофаДмитрий77, ответа я конечно-же не знаю, сорри, просто интересно Ваши задачи, которые Вы решаете на всех ЯП так туго идут?
Если делать нормально, то думаю ДА.
API везде одинаковые, а оболочки как правило кривые.
...
Рейтинг: 0 / 0
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
    #38271136
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это зелье готовится по-другому.

1. Выводим standard Tooltip (пустой размером как получится).
Чтоб был пустым и при этом выводился, надо использовать пробел.
На этом этапе примерное желаемое положение и размеры (желаемые) тултипа известны
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
        Case NIN_POPUPOPEN
          'Debug.Print "NIN_POPUPOPEN"
          Form1.Text1.Text = Form1.Text1.Text & vbCrLf & "NIN_POPUPOPEN" 'debug
          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 'debug
          TT.Style = TTStandard
          TT.TipText = " " 'пробел, а иначе не сумеем вывести на экран!!!
          TT.Xpos = GET_X_LPARAM
          TT.Ypos = GET_Y_LPARAM
          TT.Xwidth = 200 'в лоб
          TT.Yheight = 70 'в лоб
          TT.AttachToTaskbar = True
          TT.Create Form1.hwnd 'по идее HWND_SCREEN=0,но как тогда ловить CustomDraw и т.п.?


2. Теперь задаем размеры.
Делается это в TTN_SHOW
Первый вызов SetWindowPos обязательно без SWP_NOSIZE -иначе увеличить размеры не получится
Второй вызов SetWindowPos с SWP_NOSIZE - он обеспечивает непотопляемость - чтоб не дай бог куда не задвинулся под другие окна.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    Case WM_NOTIFY
      'Debug.Print "WM_NOTIFY"
      CopyMemory uNMHDR, ByVal lParam, Len(uNMHDR)
      If uNMHDR.hwndFrom = TT.hwnd Then
        Select Case uNMHDR.code
          Case TTN_SHOW
            'Debug.Print "TTN_SHOW"
            'задаем размеры Tooltip в лоб как хотим
            SetWindowPos TT.hwnd, 0, TT.Xpos, TT.Ypos, TT.Xwidth, TT.Yheight, SWP_NOZORDER Or SWP_NOACTIVATE
            'делаем окно тултипа непотопляемым
            SetWindowPos TT.hwnd, HWND_TOPMOST, TT.Xpos, TT.Ypos, TT.Xwidth, TT.Yheight, SWP_NOSIZE Or SWP_NOMOVE Or SWP_NOACTIVATE
            NewFormMeWindowProc = 1 'TRUE
            Exit Function



3. Потом через NM_CUSTOMDRAW в CDDS_PREPAINT возвращаем CDRF_NOTIFYPOSTPAINT и когда система все дорисует (что смогла)- т.е. тематическую рамку Tooltip нужных размеров, получаем CDDS_POSTPAINT.
И уже можем рисовать и писать любых размеров картинки и любых цветов/размеров тексты где и как угодно в любой комбинации.
И самое приятное, что на этом этапе уже никакая сволочь не помешает.
Код: 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.
          Case NM_CUSTOMDRAW
            'Debug.Print "NM_CUSTOMDRAW"
            Static lvcd As NMTTCUSTOMDRAW
            CopyMemory lvcd, ByVal lParam, Len(lvcd)   ' every structs' member is a Long
            Select Case lvcd.nmcd.dwDrawStage
              ' ====================================================
              Case CDDS_PREPAINT
                'Debug.Print "CDDS_PREPAINT"
                NewFormMeWindowProc = CDRF_NOTIFYPOSTPAINT 'когда система дорисует пустой,пусть сообщит
                Exit Function
              Case CDDS_POSTPAINT 'теперь можно тупо рисовать содержимое
                'Debug.Print "CDDS_POSTPAINT"
                'картинка (какая хочешь)
                DrawIconEx lvcd.nmcd.hdc, _
                 10, _
                 10, _
                 Form1.lngIconTIP48, 48, 48, _
                 0, 0, DI_NORMAL
                 '"TipText" -системным шрифтом
                 Dim sPrintText As String
                 sPrintText = "Small Tooltip Text"
                 TextOut lvcd.nmcd.hdc, 68, 30, sPrintText, Len(sPrintText)
                 sPrintText = "This is line number #2"
                 TextOut lvcd.nmcd.hdc, 68, 45, sPrintText, Len(sPrintText)
                 '"Title"
                 If IsWinVista And ThemesEnabled(TT.hwnd) Then
                   'меняем шрифт и его цвет на крупный Segoe UI 12
                   SetTextColor lvcd.nmcd.hdc, Form1.LabelTTFont.ForeColor
                   Dim oldFont As Long
                   oldFont = SelectObject(lvcd.nmcd.hdc, fnt_TT.hFont)
                   sPrintText = "Large Title Text"
                   TextOut lvcd.nmcd.hdc, 68, 7, sPrintText, Len(sPrintText)
                   SelectObject lvcd.nmcd.hdc, oldFont
                 Else
                   'в принципе здесь можно жирным, но не будем
                   sPrintText = "Large Title Text"
                   TextOut lvcd.nmcd.hdc, 68, 7, sPrintText, Len(sPrintText)
                 End If
              Case Else
            End Select
          Case Else
        End Select
      End If
    Case Else
  End Select



Короче проект прилагается.
...
Рейтинг: 0 / 0
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
    #38271143
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вроде как похоже намазюкал.
Надо еще посмотреть, насколько к 7-ке и 8-ке это применимо, работать точно должно.
...
Рейтинг: 0 / 0
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
    #38271169
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маньяк :)
...
Рейтинг: 0 / 0
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
    #38272352
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyМаньяк :)
Ето почему ето?

Покритиковал бы результат что ли. Что не так делаю?
Кроме общих замечаний, типа что WPF надо использовать. Кстати на WPF постоянно натыкаюсь в поисках, много там проблем у народа.

Лучше ответь на 3 неотвеченных вопроса, может вдруг знаешь ответ хотя б на первые 2:
1) Control Spy (v.5 или v.6)
Tooltip живой там когда нибудь видел? Высечь его там и не удалось (никакой). 2 темы накросспостил, никто не ответил.

2) Как у Tooltip убрать тень? По не-русски Shadow. Отображается внизу и справа.
Если Tooltip примыкает к Taskbar (который "ВНИЗУ") , то она там явно лишняя. Если внимательно посмотришь на мои "маньячные" картинки, то поймешь что на "оригиналах" она отсутствует.

3) Если
(1)Windows 7 и (2) иконка находится на на Taskbar а в доп.области уведомлений, то иногда(не всегда! условия возникновения не понял).
Симптомы:
При наведении мышки сообщения NIN_POPUPOPEN и NIN_POPUPCLOSE начинают генерироваться с высокой частотой (мышка на иконке и неподвижна) , что естественно приводит к "миганию" Tooltip.
NIN_POPUPCLOSE (если нормально) срабатывает либо когда убираем мышку с иконки, либо по системному таймеру по умолчанию 10 сек(таймер кот. связан не с Tooltip а с SetNotifyIcon).

Если иконка в Win7 отображается в Taskbar (как на более ранних Win)-то поведение всегда нормальное.
Также проверил на Win8 - глюк НЕ наблюдается.

М.б. конечно "эффект нотебучной мышки" (Win7 счас у меня только на Notebook, а Win8 на стационаре).
Кстати, м.б. какой добрый человек с Win7 проверит? (проект приложен). Надо в системе для иконки выбрать "Не показывать значки в области уведомлений", нажать на стрелку рядом и навести мышку на иконку.
...
Рейтинг: 0 / 0
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
    #38272419
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Покритиковал бы результат что ли. Что не так делаю?Не могу. Результат прекрасный, делаешь все правильно. Ставишь себе цели и с упорством трактора их достигаешь. Просто цели высокие (по моим меркам), а пути и средства достижения на редкость неудобные. Многие другие уже давно сдались бы.
...
Рейтинг: 0 / 0
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
    #38272513
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

ну а на вопрос

Как в Control Spy увидеть ToolTip???

ответить можешь?
В принципе ответ "У меня тоже не получилось. Не знаю." тоже ответ, но никто и этого не говорит.
...
Рейтинг: 0 / 0
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
    #38272525
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В control spy никак. Я писал программку с клавиатурным хуком (не знал про GetAsyncKeyState), которая при нажатии на f9 выводила характеристики окошка под курсором мыши.
...
Рейтинг: 0 / 0
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
    #38272537
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyВ control spy никак.
Т.е. подтверждаешь глюк-недоделку в control spy?

Смысл остальной части ответа не уловил.
...
Рейтинг: 0 / 0
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
    #38272560
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не глюк а естественные границы его возможностей, обусловленные особенностями интерфейса. Одни окна прячутся при изменении фокуса, другие от мышиных событий, а control spy при выборе окна делает и то и другое.
...
Рейтинг: 0 / 0
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
    #38272567
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Смысл остальной части ответа не уловил.GetCursorPos + WindowFromPoint, так понятнее?
...
Рейтинг: 0 / 0
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
    #38272686
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Абсолютно непонятно. Это отностится к ответу про Control Spy?
Я что-то должен сделать внешней программой применительно к Control Spy чтоб увидеть ToolTip?
Я должен изобрести какой-то свой паравоз? (не относящийся к Control Spy).
На пальцах можешь объяснить?
...
Рейтинг: 0 / 0
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
    #38272701
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или это просто объяснение почему не вижу без инструкций к действию?
Смысл Control Spy в основном в том чтоб сразу увидеть результат так понимаю?
А выписывать константы и изобретать как их всунуть в код я и по MSDN+Google могу только время/умо затраты другие.
Особенно с учетом того что ControlSpy можно сразу запустить на "Висте", а VB6 я по определению держу только на рабочем XP.
...
Рейтинг: 0 / 0
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
    #38272735
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Antonariy,

Абсолютно непонятно. Это отностится к ответу про Control Spy?
Я что-то должен сделать внешней программой применительно к Control Spy чтоб увидеть ToolTip?
Я должен изобрести какой-то свой паравоз? (не относящийся к Control Spy).
На пальцах можешь объяснить?>_<
Antonariy Я писал программку с клавиатурным хуком (не знал про GetAsyncKeyState), которая при нажатии на f9 выводила характеристики окошка под курсором мыши.У меня кончились пальцы.
...
Рейтинг: 0 / 0
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
    #38272842
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

я понял так: ты писал программку, кот. делала ХУК, находила hwnd тултипа сгенеренного Control Spy и выводила его напоказ.
Если нет, то я ничего не понял.
===
Кстати (конечно надо уже с этим тултип завязывать - про себя подумал).

>а пути и средства достижения на редкость неудобные

Глядючи на финальную часть возникла идея что в данном случае можно сделать проще.
1) Не использовать NOTIFYICON_VERSION_4 в Shell_NotifyIcon.
2) делать .szTip = " " & vbNullChar
3) ловить TTN_SHOW от встроенного Tooltip , там задавать его позицию и размеры (конечно у меня нет GET_X_LPARAM и GET_Y_LPARAM, но все равно ж я их корректирую, да и позицию где он хочет появиться думаю узнать легко). Правда надо будет понять что ЭТО ИМЕННО ОН Вот этого козыря:
Код: vbnet
1.
  If uNMHDR.hwndFrom = TT.hwnd Then

не будет.
4) ну и через CustomDraw рисовать на нем "свистелки" как и в первом варианте.

Если быстро получится, то сделаю. Выигрыш будет "независимость от Вистообразности", не надо создавать ToolTip "с нуля" в track стиле и отлавливать специфические уведомления ну и случайные глюки типа описанных "в вопросе 3" автоматом уйдут.
Как идея?
...
Рейтинг: 0 / 0
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
    #38272845
катастрофа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,
Если быстро получится, то сделаю - господя, главное оконечный результат выложите пжл, чтоб приобщится к прекрасному
...
Рейтинг: 0 / 0
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
    #38272870
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
катастрофаглавное оконечный результат выложите пжлА сам не хочешь попробовать?

Чем текущий оконечный результат не устраивает?
Он по любому "круче", т.к. там реализован механизм вывода[/закрытия] любых окон при наведении на трей-иконку, а не только Tooltip. Т.е. можешь например сделать
Код: vbnet
1.
2.
3.
        Case NIN_POPUPOPEN
          'Debug.Print "NIN_POPUPOPEN"
          Form2.show
...
Рейтинг: 0 / 0
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
    #38272881
катастрофа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,
не то что не устраивает, просто у Вас мысли мол - думаю, думаю может ещё улучшу, а так пока не смотрел, но посмотрю то что есть
...
Рейтинг: 0 / 0
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
    #38272882
катастрофа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот уже и смотрю
Чем текущий оконечный результат не устраивает? - а проект можете прикрепить?
...
Рейтинг: 0 / 0
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
    #38272898
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
катастрофа,

ты как всегда в своем репертуаре.
А внизу там ЧТО? приложено?

===
Так, похоже надо завязывать.
Дмитрий773) ловить TTN_SHOW от встроенного Tooltip , ...Правда надо будет понять что ЭТО ИМЕННО ОН...
Фиг с маслом. Там свои заморочки.
Сначала надо понять, чего надо сабклассить чтобы это словить (WM_NOTIFY -> TTN_SHOW ).
Form1.hwnd - не ловит.
GetDesktopWindow -не ловит (вообще ничего не ловит)
FindWindow("Shell_TrayWnd", vbNullString) - не ловит(вообще ничего не ловит)
Тот механизм кот. посылает уведомления через "CallBack" в NotifyIcon тоже к делу не относится.
Короче это делать ни фига не легче, и не факт что получится.
...
Рейтинг: 0 / 0
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
    #38280031
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77GetDesktopWindow -не ловит (вообще ничего не ловит)
FindWindow("Shell_TrayWnd", vbNullString) - не ловит(вообще ничего не ловит)Для справки.
Сабклассить можно только окна своего процесса, а эти окна принадлежат explorer'у. Перехватывать сообщения, посылаемые чужим окнам, тоже можно, но каким-то другим способом.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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