powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как отобразить примечания для кнопок в API-Toolbar
17 сообщений из 17, страница 1 из 1
Как отобразить примечания для кнопок в API-Toolbar
    #36681879
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Честно говоря уже задолбался из него их выбивать.
Делаю сабклассинг ребара, кот. родитель тулбара.
Код: plaintext
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.
ToolbarStyle = WS_CHILD Or WS_VISIBLE Or _
                TBSTYLE_TOOLTIPS...

'ToolTip Notification
Private Type NMTTDISPINFO
    hdr As NMHDR
    lpszText As Long
    szText( 0  To  79 ) As Byte
    hinst As Long
    uFlags As Long
    lParam As Long
End Type


Public Function NewToolBarWindowProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim uNMHDR  As NMHDR
     Dim tT As NMTTDISPINFO
    Dim sToolTipBuffer As String
    Dim b() As Byte
    
    Select Case Msg
        Case WM_NOTIFY
            Call CopyMemory(uNMHDR, ByVal lParam, Len(uNMHDR))
            'Debug.Print uNMHDR.code
            Select Case uNMHDR.code
                Case TTN_GETDISPINFO
'                    Call CopyMemory(tT, ByVal lParam, Len(tT))
                    'Debug.Print "TTN_GETDISPINFO:" & tT.hdr.idFrom
                    sToolTipBuffer = "Test Tool Tip"
                    If (Len(sToolTipBuffer) >  0 ) Then
                        CopyMemory tT, ByVal lParam, Len(tT)
                        b = StrConv(sToolTipBuffer, vbFromUnicode)
                        ReDim b( 0  To UBound(b) +  1 ) As Byte
                        b(UBound(b)) =  0 
                        CopyMemory ByVal tT.lpszText, b( 0 ), UBound(b) +  1 
                        CopyMemory tT.szText( 0 ), b( 0 ), UBound(b) +  1 
                        tT.hinst =  0 
                        CopyMemory ByVal lParam, tT, Len(tT)
                        Debug.Print "TTN_GETDISPINFO:" & tT.hdr.idFrom
                        Exit Function
                    End If
'                    Select Case tT.hdr.idFrom
'                        Case 1
'                            tT.szText = MAKEINTRESOURCE(101)
'                        Case Else
'                    End Select
                Case Else
            End Select
TTN_GETDISPINFO отлавливается, tT.hdr.idFrom номер кнопки возвращает.
Примечание "Test Tool Tip" НЕ отображается.
...
Рейтинг: 0 / 0
Как отобразить примечания для кнопок в API-Toolbar
    #36682341
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Private Type NMTTDISPINFO
    hdr As NMHDR
    lpszText As Long
    szText( 0  To  79 ) As Byte
    hinst As Long
    uFlags As Long
End Type


Dim uNMTTDI As NMTTDISPINFO_SHORT

Case TTN_GETDISPINFO
    s = "test"
    If Len(s) Then
        Call CopyMemory(uNMTTDI, ByVal lParam, Len(uNMTTDI))
        uNMTTDI.lpszText = StrPtr(StrConv(s, vbFromUnicode))
        Call CopyMemory(ByVal lParam, uNMTTDI, Len(uNMTTDI))
    End If
...
Рейтинг: 0 / 0
Как отобразить примечания для кнопок в API-Toolbar
    #36682346
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
* Type NMTTDISPINFO_SHORT
...
Рейтинг: 0 / 0
Как отобразить примечания для кнопок в API-Toolbar
    #36682774
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Я вчера еще пробовал
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Private Type NMTTDISPINFO
    hdr As NMHDR
    lpszText As Long
    'szText(0 To 79) As Byte
    szText As String *  80 
    hinst As Long
    uFlags As Long
    lParam As Long
End Type
Примечание (с "моим" кодом) отображалось, но на "полную" длину 80.
Счас попробовал Ваш, в двух вариантах
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
'Private Type NMTTDISPINFO_SHORT
'    hdr      As NMHDR
'    lpszText As Long
'    szText   As String * 80
'    hinst    As Long
'    uFlags   As Long
'End Type

Private Type NMTTDISPINFO_SHORT
    hdr As NMHDR
    lpszText As Long
    szText( 0  To  79 ) As Byte
    hinst As Long
    uFlags As Long
End Type

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dim uNMTTDI As NMTTDISPINFO_SHORT
Dim s As String

Case TTN_GETDISPINFO
    s = "test"
    If Len(s) Then
        Call CopyMemory(uNMTTDI, ByVal lParam, Len(uNMTTDI))
        uNMTTDI.lpszText = StrPtr(StrConv(s, vbFromUnicode))
        Call CopyMemory(ByVal lParam, uNMTTDI, Len(uNMTTDI))
    End If

Ерунда какая-то. То он выводит букву P, то он ее через секунду заменяет на 'text' или на 'te'.
Очень странно.

Плюс ко всему в любых вариантах моем-вашем "чегой-то непотребное" отображается только в IDE, а в exe как удалось выяснить Case TTN_GETDISPINFO из этого кода вообще не генерируется/отлавливается, т.е. никаких намеков.

М.б. другим каким путем пойти?
Тамо описано несколько способов как это делать, но все какие-то очень хитрые.

Вот тут на "левую" идею набрел еще:
http://www.mofeel.net/950-microsoft-public-vb-winapi/4258.aspx
но пока воспроизвести не сумел.
Код: plaintext
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.
I find it
much simpler just to add static tip strings to the tooltip control and
let it manage the strings rather than deal with TTN_GETDISPINFO. Note
you need the individual button rect since they're not separate
windows. If it helps, here's a snip from a class that wraps a
ToolbarWindow32:

Private Sub GetBtnRect(ByVal idBtn As Long, ByRef rcBtn As RECT)
SendMessage m_hWnd, TB_GETRECT, idBtn, rcBtn
End Sub

Private Sub AddTip(ByVal ID As Long, sText As String)
'called by AddButton
Dim TI As TOOLINFO

GetBtnRect ID, TI.R

With TI
.cbSize = CLng(LenB(TI))
.uFlags = TTF_SUBCLASS
.hWnd = m_hWnd
.uId = ID
.lpszText = sText
End With
SendMessage m_hTips, TTM_ADDTOOL,  0 &, TI
End Sub
...
Рейтинг: 0 / 0
Как отобразить примечания для кнопок в API-Toolbar
    #36682789
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объявление CopyMemory покажите.
...
Рейтинг: 0 / 0
Как отобразить примечания для кнопок в API-Toolbar
    #36682811
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В модуле ModuleWinProc вот так:
Код: plaintext
1.
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
    lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
...
Рейтинг: 0 / 0
Как отобразить примечания для кнопок в API-Toolbar
    #36682919
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня все выводит.
...
Рейтинг: 0 / 0
Как отобразить примечания для кнопок в API-Toolbar
    #36682920
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как отобразить примечания для кнопок в API-Toolbar
    #36682952
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

вот этот пример от Бенедикта (с вставленными таки мной Виста-стилями для Rebar) и его производные допиливаются, взгляньте сами.
Заодно сразу вопрос про Case TBN_HOTITEMCHANGE:
покидание мышью ToolBar
это Ваш код, когда-то я его проигнорировал, но сейчас вспомнил.
Если кнопка enabled то все четко,
но если кнопка disabled, то событие "покинули" из TBN_HOTITEMCHANGE не генерируется.
скажем так использую дополнительно
Код: plaintext
1.
        Case  512 
            Form1.Caption = "покинули"
но это "так" если без "резких движений"
...
Рейтинг: 0 / 0
Как отобразить примечания для кнопок в API-Toolbar
    #36682967
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вы почему нотификацию у ребара ловите? Нужно у формы или, как у меня, юзерконтрола.
...
Рейтинг: 0 / 0
Как отобразить примечания для кнопок в API-Toolbar
    #36682996
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyА вы почему нотификацию у ребара ловите? Нужно у формы или, как у меня, юзерконтрола.
Да...м-м-м
дык он же родитель...
просто я на этом собаку съел с цветами строчек в Report-ListView
ладно...пошел пробовать с формой. С user-контролами не дружим-с...тупые-с..
пошел глядеть на все...
...
Рейтинг: 0 / 0
Как отобразить примечания для кнопок в API-Toolbar
    #36683055
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ух ты...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 ' 'загрузка событий Toolbar
 OldReBarWindowProc = SetWindowLong(Me.hWnd, GWL_WNDPROC, _
    AddressOf NewReBarWindowProc)

                Case TTN_GETDISPINFO
                    s = "test"
                    If Len(s) Then
                        Call CopyMemory(uNMTTDI, ByVal lParam, Len(uNMTTDI))
                        s = "test" & uNMTTDI.hdr.idFrom
                        uNMTTDI.lpszText = StrPtr(StrConv(s, vbFromUnicode))
                        Call CopyMemory(ByVal lParam, uNMTTDI, Len(uNMTTDI))
                    End If
забоботало, однака
Но нормально только с exe, в смысле в IDE глючит буквой 'P'.
Думаю, на этом можно остановиться без дальнейших выяснений.
...
Рейтинг: 0 / 0
Как отобразить примечания для кнопок в API-Toolbar
    #36683154
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже, это глюки IDE. Заработало так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
                    s = "тест"
                    If Len(s) Then
                        Call CopyMemory(uNMTTDI, ByVal lParam, Len(uNMTTDI))
                        Dim ss As String
                        ss = StrConv(s, vbFromUnicode)
                        Debug.Print uNMTTDI.lpszText
                        uNMTTDI.lpszText = StrPtr(ss)
                        Call CopyMemory(ByVal lParam, uNMTTDI, Len(uNMTTDI))
                    End If
Debug.Print нужно обязательно, иначе магия не сработает. Причем не важно в каком месте оно будет.
...
Рейтинг: 0 / 0
Как отобразить примечания для кнопок в API-Toolbar
    #36683334
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,
да действительно, так работает и в IDE.
Насчет "не важно в каком месте" ну не соглашусь, но не суть
Глючит случайным образом, правда удалось узнать что
\'P\' это "Project1", гы..
А вставил в большой проект, вроде все с ходу и в IDE заработало, а присмотрелся, в какие-то кнопки вставляет какие-то случайные слова из кода программы.
Как говорится, "что-то с памятью моей стало".
Но главное, что exe работает четко.
=========================
А с покиданием кнопки ничего простого на ум не приходит?
Тема начинала обсуждаться давно и была заморожена.
/topic/709313&hl=
Т.е.если
1. Уберем TBSTATE_ENABLED
Код: plaintext
 With tbButtonsCreate( 1 )\n    .iBitmap = IDB_FORWARD\n    .idCommand =  2  \'IDM_GOFORWARD\n    \'.fsState = TBSTATE_ENABLED\n    .fsStyle = BTNS_BUTTON\n End With
2. Уберем сомнительную подстраховку
Код: plaintext
        Case  512 \n            Form1.Caption = "покинули"
то при уходе с кнопки .idCommand = 2 вверх или вниз мы не получим событие "покинули"
==========================
Ну, раз уж Вы ознакомились с примером, не взглянете ли сюда?
http://sql.ru/forum/actualthread.aspx?tid=754298&pg=2
Там есть в конце вопрос про вид API-тулбара на XP-стиле (чтоб пухлым не был + разделитель сверху).
И до этого 3 вопроса по поводу Vista-стилей.
Про тематику-классы самого тулбар, думаю бог с ним.
А вот про мутно-зеленый аля-Explorer градиент тулбара (ребара?) вопроc конечно интересный.
Вот нашел постановку вопроса поиском (не решен):
http://www.eggheadcafe.com/software/aspnet/30608170/greenishblue-vista-rebar.aspxGreenish-blue Vista rebar/toolbar
Ни один класс засунутый в комбобокс не дает этого вида для тулбара.
Эх, как говорится, "аппетит растет во время еды"...
...
Рейтинг: 0 / 0
Как отобразить примечания для кнопок в API-Toolbar
    #36683548
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77то при уходе с кнопки .idCommand = 2 вверх или вниз мы не получим событие "покинули"Таки а что ж вы хотели? В этом смысл TBSTATE_ENABLED — прекращение событий, по которым включенные элементы откличаются от выключенных.
...
Рейтинг: 0 / 0
Как отобразить примечания для кнопок в API-Toolbar
    #36683591
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyТаки а что ж вы хотели?
Хотели понимать мышь находится над какой-то кнопкой или ни над какой кнопкой.
При этом не важно, включена кнопка или нет, подсказки в StatusBar всегда отображаются.
При переходе даже на выключенную кнопку код работает, а вот при уходе с выключенной кнопки не работает. Если не предпринимать доп. действий, типа "512" (хотя бы) + например тупое Mouse_Move по соседним габаритным контролам типа Form/ListView/Treeview, то подсказка в описанной ситуации "зависнет", что конечно не смерть проге, но не есть nice. Если юзер на даст мыши щелбана (с быстрым вылетом мыши за пределы формы), то описанных затычек в принципе хватает для соблюдения приличий.
...
Рейтинг: 0 / 0
Как отобразить примечания для кнопок в API-Toolbar
    #36683616
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Хотели понимать мышь находится над какой-то кнопкой или ни над какой кнопкой.Понимать должен кто и для чего? Лично вы это и так понимаете по ее внешнему виду.

Дмитрий77При этом не важно, включена кнопка или нет, подсказки в StatusBar всегда отображаются.Посказки подсказками, а активность активностью. Подсказки являются пассивной частью тулбара, сами по себе они с пользователем не взаимодействуют. А события ухода являются следствием фичи HotItem. Смысл HotItem в выделении элемента, готового взаимодействовать с юзером. Задизейбленая кнопка не готова взаимодействовать с юзером => незачем ее подсвечивать => нет события.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как отобразить примечания для кнопок в API-Toolbar
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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