Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Toolbar номер кнопки через subclass? / 8 сообщений из 8, страница 1 из 1
04.11.2009, 15:03
    #36290341
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Toolbar номер кнопки через subclass?
Для ListView.headers.item
Call SendMessage(hwnd, HDM_HITTEST, 0&, HTI)
HTI.iItem - номер колонки

А для Toolbar номер кнопки как получить?
Код: plaintext
1.
2.
3.
4.
5.
6.
   Call GetCursorPos(pt)
    Call ScreenToClient(hwnd, pt)
    'try...to get the toolbar hit-test info
    With HTI
        .pt = pt
    End With
    Call SendMessage(hwnd, HDM_HITTEST,  0 &, HTI)
....
так не работает, надо что-то аналогичное, пока не нашел...
...
Рейтинг: 0 / 0
05.11.2009, 04:38
    #36291109
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Toolbar номер кнопки через subclass?
Не, аналогичного не нашел. Задача в общем простая-выводить подсказки при перемещении мыши по кнопкам toolbar. Встроенный mousemove вполне годится, но есть одно но:
Код: plaintext
понять что мышь покинула тулбар
.
В общем получилась некая каша из API и обычных методов.
Не оч.красиво, но работает.

Код: 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.
Public Function NewToolBarWindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Const WM_ERASEBKGND = &H14
    Const WM_LBUTTONUP = &H202
    Const WM_LBUTTONDOWN = &H201
    Const WM_RBUTTONDOWN = &H204
    Const WM_RBUTTONUP = &H205

    Static pt As POINTAPI
    Dim i As Integer
    Dim XX As Long, YY As Long 'координаты в точках отн. формы

    If (Msg = WM_ERASEBKGND) Then 'WM_ERASEBKGND
        If NotDoMove Then
            NotDoMove = False
            GoTo Dalshe
        End If
        Form1.StatusBar1.Panels( 1 ).Text = "Basic text" 'кнопка не выбрана
    ElseIf (Msg = WM_LBUTTONUP) Or (Msg = WM_RBUTTONUP) Then 'WM_LBUTTONUP WM_RBUTTONUP
        Form1.StatusBar1.Panels( 1 ).Text = "Basic text"
        NotDoMove = True
        GoTo Dalshe
    ElseIf (Msg = &H200) Then 'WM_MOUSEFIRST/WM_MOUSEMOVE
        Call GetCursorPos(pt)
        Call ScreenToClient(Form1.hwnd, pt)
        XX = pt.X * Screen.TwipsPerPixelX
        YY = pt.Y * Screen.TwipsPerPixelY
        For i =  1  To Form1.Toolbar1.Buttons.Count
            If (XX > Form1.Toolbar1.Buttons(i).Left) And _
              (XX < Form1.Toolbar1.Buttons(i).Left + Form1.Toolbar1.Buttons(i).Width) And _
            (YY > Form1.Toolbar1.Buttons(i).Top) And _
              (YY < Form1.Toolbar1.Buttons(i).Top + Form1.Toolbar1.Buttons(i).Height) Then
                Form1.StatusBar1.Panels( 1 ).Text = GetHelpToolbarStr(Form1.Toolbar1.Buttons(i).Key)
                GoTo Dalshe
            End If
        Next
        Form1.StatusBar1.Panels( 1 ).Text = "Basic text" 'кнопка не выбрана
    ElseIf (Msg = WM_LBUTTONDOWN) Or (Msg = WM_RBUTTONDOWN) Then 'WM_LBUTTONDOWN &H201
        NotDoMove = True
    Else
        GoTo Dalshe
    End If
Dalshe:
    NewToolBarWindowProc = CallWindowProc( _
        OldToolBarWindowProc, hwnd, Msg, wParam, _
        lParam)
End Function

NotDoMove нужен чтобы гасить WM_ERASEBKGND если WM_ERASEBKGND не связано с покиданием toolbar, другого способа не нашел.
...
Рейтинг: 0 / 0
05.11.2009, 10:47
    #36291425
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Toolbar номер кнопки через subclass?
TB_HITTEST

Найдите себе уже MSDN версии 2003 или старше, там все это описано. Во вложении библиотека типов, где декларированы почти все константы, типы и функции, используемые коммон контролами.

Jah loves you.
...
Рейтинг: 0 / 0
05.11.2009, 13:24
    #36292047
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Toolbar номер кнопки через subclass?
Боюсь что эта красота в данном случае не прокатит в VB:

lResult = SendMessage( // returns LRESULT in lResult
hWndControl, // (HWND) handle to destination control
TB_HITTEST, // (UINT) message ID
wParam, // = 0; not used, must be zero
lParam // = (LPARAM)(LPPOINT) pptHitTest;

'SendMessage function
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long

Public Type POINTAPI
X As Long
Y As Long
End Type

Даже если сделать вот так:

'SendMessage function
Public Declare Function SendMessage2 Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
lParam As POINTAPI ) As Long

то код:
Код: plaintext
1.
2.
3.
    ElseIf (Msg = &H200) Then 'WM_MOUSEFIRST/WM_MOUSEMOVE
        Call GetCursorPos(pt)
        Call ScreenToClient(hwnd, pt)
        Form1.Caption = SendMessage2(hwnd, TB_HITTEST,  0 , pt)

ничего не рисует. И немногочисленные рез-ты поиска V..B...+TB_HITTEST
сводятся похоже к мысли о том что именно в vb не работает.
Это как при случае с вложенными структурами...???

А по поводу MSDN: а смысл есть ее иметь на диске,если она доступна в Интернете.
А плюс поиск по google дает гораздо больше.
Другое дело что я не совсем умею с ней работать м.б., но это другое дело...
...
Рейтинг: 0 / 0
05.11.2009, 14:00
    #36292171
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Toolbar номер кнопки через subclass?
Можно и без TB_HITTEST (лень его проверять) — WM_NOTIFY + TBN_HOTITEMCHANGE

Дмитрий77Задача в общем простая-выводить подсказки при перемещении мыши по кнопкам toolbarА чем стандартные тултипы не устраивают?

Дмитрий77А по поводу MSDN: а смысл есть ее иметь на диске,если она доступна в Интернете.
Смысл есть, потому что в интернете нет поиска по указателю. В локальной версии достаточно ввести, к примеру, tb_, и она сразу переходит с тулбарным сообщениям, среди которых можно выбрать подходящее, а для поиска в онлайновой версии нужно заранее знать, что ищем.
...
Рейтинг: 0 / 0
05.11.2009, 15:22
    #36292490
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Toolbar номер кнопки через subclass?
я ж описал основную проблему, почему плохо ограничиться стандартным mousemove
Надо еще понять что мышь покинула тулбар .
mousemove процедуру можно было бы конечно и в Toolbar_MouseMove ф-цию засунуть в том же виде, но какая разница, если я и так windowproc запускаю. Координаты пересчитывать только надо, но зато научился хоть этому.

Ну тогда получается что мой гибридный код вполне сгодится и можно его оставить и не придумывать проблем.
...
Рейтинг: 0 / 0
05.11.2009, 16:26
    #36292698
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Toolbar номер кнопки через subclass?
Дмитрий77понять что мышь покинула тулбарВот кусок, который это позволяет:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Public Function TBProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim uNMHDR  As NMHDR
Dim uNMTBHI As NMTBHOTITEM

        Select Case uMsg
            Case WM_NOTIFY
                Call CopyMemory(uNMHDR, ByVal lParam, Len(uNMHDR))
                Select Case uNMHDR.code
                    Case TBN_HOTITEMCHANGE
                        If (uNMHDR.hWndFrom = Ctl.mhToolbar) Then
                            Call CopyMemory(uNMTBHI, ByVal lParam, Len(uNMTBHI))
                            If (uNMTBHI.idOld) Then
                                Call Ctl.FireButtonLeave(uNMTBHI.idOld)
                            Else
                                If (Ctl.pvGetState(uNMTBHI.idNew, TBSTATE_ENABLED)) Then Call Ctl.FireToolbarEnter
                            End If
                            If (uNMTBHI.idNew) Then
                                If (Ctl.pvGetState(uNMTBHI.idNew, TBSTATE_ENABLED)) Then Call Ctl.FireButtonEnter(uNMTBHI.idNew)
                            Else
                                Call Ctl.FireToolbarLeave
                            End If
                        End If


Jah loves you.
...
Рейтинг: 0 / 0
05.11.2009, 17:59
    #36293050
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Toolbar номер кнопки через subclass?
Спасибо, Antonariy.
Как нибудь потом попробую.
Честно, уже устал от всего этого, оставлю здесь пока свой вариант.
...Написание проги превратилось в какие-то эксперименты над сабклассами, мышками и окнами.
А еще эту Add/remove columns писать куча рутины.
Плюс всю эту фигню запоминать в реестр при закрытии, и доставать при открытии.
Эдак можно забыть об чем прога...пора включать тормоза.
Но ...много нового узнал.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Toolbar номер кнопки через subclass? / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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