TB_CHECKBUTTON и TB_PRESSBUTTON НЕ ПОЙМУ!!!

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

TB_CHECKBUTTON и TB_PRESSBUTTON НЕ ПОЙМУ!!!

Сообщение visualman » 24.04.2008 (Чт) 19:06

Из справки:

TB_CHECKBUTTON - переключает кнопку из отжатого состояния в нажатое и обратно.

TB_PRESSBUTTON - приложение может установить кнопку в нажатое или отжатое состояние.

Ведь одно и то же?

Два последовательных сообщения TB_PRESSBUTTON с lParam = True и lParam = False не дают эффекта клика на кнопке.

BM_CLICK тут не работает, если кто будет советовать ))

Мне нужен простой клик по кнопке тулбара. Перерыл все источники. Не нашёл ((( Подскажите константу
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 25.04.2008 (Пт) 16:27

WM_LBUTTONDOWN
WM_LBUTTONUP
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Сообщение visualman » 27.04.2008 (Вс) 17:21

Nord777 писал(а):WM_LBUTTONDOWN
WM_LBUTTONUP


Хитрый какой )) Не будет оно работать. Нет у кнопок тулбара собственных hWnd. Может и есть, но до них не добраться. Есть только ID кнопки, который посылается в lParam или в wParam через SendMessage окну тулбара. И я ни как не могу найти нужное сообщение, которое является кликом на кнопке с заданным ID
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 27.04.2008 (Вс) 18:09

Пример на VB.Net (различий с VB6 немного)

Код: Выделить всё
    Dim X As Integer = 3
    Dim Y As Integer = 3
    'Dim Coord As Integer = Y << 16 Or X
    Dim Coord As Integer = Y * 65536 + X
    SendMessage(ToolBar1.Handle, WM_LBUTTONDOWN, 0, Coord)
    SendMessage(ToolBar1.Handle, WM_LBUTTONUP, 0, Coord)


В этом примере мышка кликает в тулбар по координатам 3,3 (попадая при этом в первую кнопку)
Получить координаты всех кнопок можешь при помощи сообщения TB_GETITEMRECT
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Сообщение visualman » 27.04.2008 (Вс) 20:07

Nord777 писал(а):Пример на VB.Net (различий с VB6 немного)

Код: Выделить всё
    Dim X As Integer = 3
    Dim Y As Integer = 3
    'Dim Coord As Integer = Y << 16 Or X
    Dim Coord As Integer = Y * 65536 + X
    SendMessage(ToolBar1.Handle, WM_LBUTTONDOWN, 0, Coord)
    SendMessage(ToolBar1.Handle, WM_LBUTTONUP, 0, Coord)


В этом примере мышка кликает в тулбар по координатам 3,3 (попадая при этом в первую кнопку)
Получить координаты всех кнопок можешь при помощи сообщения TB_GETITEMRECT


НИКАКОЙ МЫШКИ!!! НИКАКИХ КООРДИНАТ!!! ЭТО 'Прошлый век' )))

Если не понятно, что мне нужно - почитай про BM_CLICK.

Идея как раз и состоит в том, чтобы избавиться от мыши вообще. Чтобы она стояла на месте
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 27.04.2008 (Вс) 20:40

visualman
НИКАКОЙ МЫШКИ!!! НИКАКИХ КООРДИНАТ!!!

Прекрати орать. Для элементов, принцип работы которых таков, что элементы взаимодействия с пользователем формальны, и не существуют с точки зрения ОС, никаких иных способов, кроме предложенного Nord777 не существует.

Если тулбар, о котором идёт речь, отрисовывает кнопки сам и хранит все структуру, связанные с кнопками где-то у себя, то ты ничего не сделаешь.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 27.04.2008 (Вс) 21:30

visualman
Идея как раз и состоит в том, чтобы избавиться от мыши вообще. Чтобы она стояла на месте
Она и так будет стоять на месте (если речь идет о мышином курсоре).
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Сорсы

Сообщение visualman » 28.04.2008 (Пн) 13:34

Это маршалинг, выложеный на VBS. Моего кода 4 строки в Command1_Click
Вложения
ToolBar.rar
(3.53 Кб) Скачиваний: 82
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

IvanTheTerrible
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 94
Зарегистрирован: 20.07.2005 (Ср) 11:47
Откуда: Moscow

Re: Сорсы

Сообщение IvanTheTerrible » 28.04.2008 (Пн) 15:43

visualman писал(а):Это маршалинг, выложеный на VBS. Моего кода 4 строки в Command1_Click


В первой же строке ошибка.
Код: Выделить всё
hWndTray = CLng(txthWnd)

Всегда будет возвращать 0, т.к. по умолчению txthWnd есть txthWnd.Text
Надо:
Код: Выделить всё
hWndTray = CLng(txthWnd.hWnd)
[/quote]

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Re: Сорсы

Сообщение visualman » 28.04.2008 (Пн) 15:51

IvanTheTerrible писал(а):
visualman писал(а):Это маршалинг, выложеный на VBS. Моего кода 4 строки в Command1_Click


В первой же строке ошибка.
Код: Выделить всё
hWndTray = CLng(txthWnd)

Всегда будет возвращать 0, т.к. по умолчению txthWnd есть txthWnd.Text
Надо:
Код: Выделить всё
hWndTray = CLng(txthWnd.hWnd)
[/quote]
Не разобрался - не пиши
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 28.04.2008 (Пн) 18:13

visualman в frmDemo писал(а): 'ВОТ РЕКОМЕНДАЦИЯ Nord777 =============================
SendMessage hWndTray, WM_LBUTTONDOWN, tb.idCommand, 0
SendMessage hWndTray, WM_LBUTTONUP, tb.idCommand, 0
'======================================================

Ты просто невнимателен ))
более того, вот готовый код, который прекрасно нажимает кнопки.

Код: Выделить всё
  Sub TBClick(ByVal idButton As Integer)
    Dim R As New apiRECT
    Dim Coord As Integer

    SendMessage(ToolBar1.Handle, TB_GETITEMRECT, idButton, R)
    Coord = R.top * 65536 + R.left
    SendMessage(ToolBar1.Handle, WM_LBUTTONDOWN, 0, Coord)
    SendMessage(ToolBar1.Handle, WM_LBUTTONUP, 0, Coord)
  End Sub
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Сообщение visualman » 28.04.2008 (Пн) 19:07

Nord777 писал(а):
visualman в frmDemo писал(а): 'ВОТ РЕКОМЕНДАЦИЯ Nord777 =============================
SendMessage hWndTray, WM_LBUTTONDOWN, tb.idCommand, 0
SendMessage hWndTray, WM_LBUTTONUP, tb.idCommand, 0
'======================================================

Ты просто невнимателен ))
более того, вот готовый код, который прекрасно нажимает кнопки.

Код: Выделить всё
  Sub TBClick(ByVal idButton As Integer)
    Dim R As New apiRECT
    Dim Coord As Integer

    SendMessage(ToolBar1.Handle, TB_GETITEMRECT, idButton, R)
    Coord = R.top * 65536 + R.left
    SendMessage(ToolBar1.Handle, WM_LBUTTONDOWN, 0, Coord)
    SendMessage(ToolBar1.Handle, WM_LBUTTONUP, 0, Coord)
  End Sub


Ну не совсем так )) Вот рабочий вариант:
Код: Выделить всё
Dim RC As RECT
Dim Coord As Integer
With Marshal
    .MarshalInto VarPtr(RC), Len(RC)
    SendMessage hWndTray, TB_GETRECT, tb.idCommand, .rpMarshal
    .MarshalFrom VarPtr(RC), Len(RC)
End With
Coord = RC.Top * 65536 + RC.Left
SendMessage hWndTray, WM_LBUTTONDOWN, 0, Coord
SendMessage hWndTray, WM_LBUTTONUP, 0, Coord


Так оно работает!!!! Хакер! Больше кричать не буду!

Nord777, пасибо тебе БОЛЬШОЕ!!!! Читай личку)
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 21

    TopList