Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как отобразить примечания для кнопок в API-Toolbar / 17 сообщений из 17, страница 1 из 1
11.06.2010, 03:38
    #36681879
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобразить примечания для кнопок в API-Toolbar
Честно говоря уже задолбался из него их выбивать.
Делаю сабклассинг ребара, кот. родитель тулбара.
Код: 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
11.06.2010, 11:43
    #36682341
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобразить примечания для кнопок в API-Toolbar
Код: 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
11.06.2010, 11:44
    #36682346
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобразить примечания для кнопок в API-Toolbar
* Type NMTTDISPINFO_SHORT
...
Рейтинг: 0 / 0
11.06.2010, 13:46
    #36682774
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобразить примечания для кнопок в API-Toolbar
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
11.06.2010, 13:52
    #36682789
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобразить примечания для кнопок в API-Toolbar
Объявление CopyMemory покажите.
...
Рейтинг: 0 / 0
11.06.2010, 13:57
    #36682811
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобразить примечания для кнопок в API-Toolbar
В модуле ModuleWinProc вот так:
Код: plaintext
1.
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
    lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
...
Рейтинг: 0 / 0
11.06.2010, 14:23
    #36682919
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобразить примечания для кнопок в API-Toolbar
У меня все выводит.
...
Рейтинг: 0 / 0
11.06.2010, 14:23
    #36682920
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобразить примечания для кнопок в API-Toolbar
...
Рейтинг: 0 / 0
11.06.2010, 14:31
    #36682952
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобразить примечания для кнопок в API-Toolbar
Antonariy,

вот этот пример от Бенедикта (с вставленными таки мной Виста-стилями для Rebar) и его производные допиливаются, взгляньте сами.
Заодно сразу вопрос про Case TBN_HOTITEMCHANGE:
покидание мышью ToolBar
это Ваш код, когда-то я его проигнорировал, но сейчас вспомнил.
Если кнопка enabled то все четко,
но если кнопка disabled, то событие "покинули" из TBN_HOTITEMCHANGE не генерируется.
скажем так использую дополнительно
Код: plaintext
1.
        Case  512 
            Form1.Caption = "покинули"
но это "так" если без "резких движений"
...
Рейтинг: 0 / 0
11.06.2010, 14:37
    #36682967
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобразить примечания для кнопок в API-Toolbar
А вы почему нотификацию у ребара ловите? Нужно у формы или, как у меня, юзерконтрола.
...
Рейтинг: 0 / 0
11.06.2010, 14:44
    #36682996
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобразить примечания для кнопок в API-Toolbar
AntonariyА вы почему нотификацию у ребара ловите? Нужно у формы или, как у меня, юзерконтрола.
Да...м-м-м
дык он же родитель...
просто я на этом собаку съел с цветами строчек в Report-ListView
ладно...пошел пробовать с формой. С user-контролами не дружим-с...тупые-с..
пошел глядеть на все...
...
Рейтинг: 0 / 0
11.06.2010, 14:59
    #36683055
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобразить примечания для кнопок в API-Toolbar
Ух ты...
Код: 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
11.06.2010, 15:32
    #36683154
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобразить примечания для кнопок в API-Toolbar
Похоже, это глюки 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
11.06.2010, 16:30
    #36683334
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобразить примечания для кнопок в API-Toolbar
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
11.06.2010, 18:04
    #36683548
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобразить примечания для кнопок в API-Toolbar
Дмитрий77то при уходе с кнопки .idCommand = 2 вверх или вниз мы не получим событие "покинули"Таки а что ж вы хотели? В этом смысл TBSTATE_ENABLED — прекращение событий, по которым включенные элементы откличаются от выключенных.
...
Рейтинг: 0 / 0
11.06.2010, 18:35
    #36683591
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобразить примечания для кнопок в API-Toolbar
AntonariyТаки а что ж вы хотели?
Хотели понимать мышь находится над какой-то кнопкой или ни над какой кнопкой.
При этом не важно, включена кнопка или нет, подсказки в StatusBar всегда отображаются.
При переходе даже на выключенную кнопку код работает, а вот при уходе с выключенной кнопки не работает. Если не предпринимать доп. действий, типа "512" (хотя бы) + например тупое Mouse_Move по соседним габаритным контролам типа Form/ListView/Treeview, то подсказка в описанной ситуации "зависнет", что конечно не смерть проге, но не есть nice. Если юзер на даст мыши щелбана (с быстрым вылетом мыши за пределы формы), то описанных затычек в принципе хватает для соблюдения приличий.
...
Рейтинг: 0 / 0
11.06.2010, 19:00
    #36683616
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отобразить примечания для кнопок в API-Toolbar
Дмитрий77Хотели понимать мышь находится над какой-то кнопкой или ни над какой кнопкой.Понимать должен кто и для чего? Лично вы это и так понимаете по ее внешнему виду.

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


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