Клик на форме

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Клик на форме

Сообщение vvs_adm » 29.07.2005 (Пт) 7:23

Как можно отследить клик мышью на форме в ЛЮБОМ месте? А то события Click, MouseDown, MouseUp происходят тока при клике по пустому месту.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 29.07.2005 (Пт) 7:29

Но ведь кликая не по пустому месту соответственно кликаешь не по форме...

Ты имел ввиду распознать клик в системе который производится где-то над твоей формой?
А я все практикую лечение травами...

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 29.07.2005 (Пт) 7:30

Ну я имею ввиду клик на объекте = форма + контролы на ней.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 29.07.2005 (Пт) 7:33

клик на объекте = форма + контролы на ней.

Теперь я вообще ничего не понял...

Тебе надо по клику на объекте узнать координаты мыши относительно формы, относительно экрана, в твипах, в пикселях или как?...
А я все практикую лечение травами...

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 29.07.2005 (Пт) 7:36

Мне неважны координаты, мне неважно даже знать, какая кнопка нажата... Мне нужно при клике на форме запустить определенную процедуру проверки.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 29.07.2005 (Пт) 7:42

Мне неважны координаты, мне неважно даже знать, какая кнопка нажата...


Как раз это и важно. Есть несколько способов:

1. Проверять нажатие на каждом контроле...
2. Ставить хук на клики и проверять где находится курсор (или не где находится, а окно родитель того окна, по которому был произведен щелчек - GetParent вернет 0 если родитель десктоп)
3. SetCapture - но это врядли подойдет...
А я все практикую лечение травами...

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 29.07.2005 (Пт) 7:51

Twister писал(а):1. Проверять нажатие на каждом контроле...
До этого я и сам догадаться могу, но это ведет к трудно отлавливаемым ошибкам в случае добавления нового контрола и забития добавления соответствующей проверки. Да и контролов на форме ... много ...

Twister писал(а):2. Ставить хук на клики и проверять где находится курсор (или не где находится, а окно родитель того окна, по которому был произведен щелчек - GetParent вернет 0 если родитель десктоп)
Слишком заморочено, хотелось бы попроще...

Twister писал(а):3. SetCapture - но это врядли подойдет...)
А вдруг как раз и подойдет?

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 29.07.2005 (Пт) 7:57

SetCapture захватывает обработку событий мыши в рамках своего приложения. И лишь если при утановки SetCapture кнопка мыши была в нажатом состоянии захват распространяется на всю систему.

При установленном SetCapture не всплывают подсказки, не "поднимаются" кнопки - т.е. пока он установлен нет нормальной работы приложения. Я использую его для того, чтоб пользователь мог выбрать мышкой нужное окно...
А я все практикую лечение травами...

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 29.07.2005 (Пт) 8:12

Не... это совсем не то. Почему разработчики VB не установили такого события :(

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 29.07.2005 (Пт) 8:16

Остается два варианта: первый и второй. Хук - геморойно, так что пользуй первый...
А я все практикую лечение травами...

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 29.07.2005 (Пт) 8:28

Нафик-нафик... Лучше я как и раньше по таймеру поживу... Потом как-нибудь перейдем на современный стиль :)

P.S.: У меня есть форма настроек, и кнопка "Применить", которую нужно раздисеблить при изменении настроек. Сейчас, стыдно сказать, проверка на изменение идет по таймеру. Вставку во все контролы обработку я точно не буду делать. Остальное погляжу. Если кто-то не посоветует что-нить простое.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 29.07.2005 (Пт) 8:33

Ну удачи...
А я все практикую лечение травами...

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 29.07.2005 (Пт) 8:49

Спасибо. На данный момент поставим Hook, которым в конце разработки заменим timer :) Но другие предложения приветствуются ... Хотя наверное других вариантов то и нет, но вдруг...

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 29.07.2005 (Пт) 12:16

4. Сабклассинг

Код: Выделить всё
'в форме
Private Sub Form_Load()
Dim c As Control
Dim h1 As Long
Dim h2 As Long
    On Error Resume Next
    For Each c In Me.Controls
        h1 = c.hwnd
        If Err.Number = 0 Then
            h2 = SetWindowLong(h1, GWL_WNDPROC, AddressOf TargetProc)
            PostMessage h1, WM_SETPREVPTR, h2, 0
        Else
            Err.Clear
        End If
    Next c
End Sub

Private Sub Form_Unload(Cancel As Integer)
Dim c As Control
Dim h1 As Long
    On Error Resume Next
    For Each c In Me.Controls
        h1 = c.hwnd
        If Err.Number = 0 Then
            PostMessage h1, WM_RESTOREFUNC, 0, 0
        Else
            Err.Clear
        End If
    Next c
End Sub

'в модуле
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public Const GWL_WNDPROC = -4
Public Const WM_USER = &H400
Public Const WM_LBUTTONUP = &H202
Public Const WM_SETPREVPTR = WM_USER + 1
Public Const WM_RESTOREFUNC = WM_USER + 2

Public Function TargetProc(ByVal hwnd As Long, ByVal message As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Static PrevFuncPointer As Long
    Select Case message
        Case WM_SETPREVPTR
            PrevFuncPointer = wParam
        Case WM_RESTOREFUNC
            SetWindowLong hwnd, GWL_WNDPROC, PrevFuncPointer
        Case WM_LBUTTONUP
            Debug.Print "mouseup" 'типа кликнули
        Case Else
            If PrevFuncPointer = 0 Then
                TargetProc = 0
                Exit Function
            End If
    End Select
    TargetProc = CallWindowProc(PrevFuncPointer, hwnd, message, wParam, lParam)
End Function

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 29.07.2005 (Пт) 12:18

Админам: Тег code что-то глючит немного. Почему весь код закомментен?

_Мика_
Гуру
Гуру
 
Сообщения: 1459
Зарегистрирован: 24.10.2003 (Пт) 15:05
Откуда: г. Москва, м.Речной вокзал

Сообщение _Мика_ » 29.07.2005 (Пт) 12:26

Antonariy писал(а):Админам: Тег code что-то глючит немного. Почему весь код закомментен?


Все правильно, если юзать кнопку "Code" тогда так и будет, а если юзать кнопку "VB" тогда будет как в VB :wink:
-Папа, а правда, что форумы делают людей дибилами?
-гы гы гы, сынок, лол!

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 29.07.2005 (Пт) 14:16

Что-то я не наблюдаю такой кнопки.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 29.07.2005 (Пт) 18:11

Посмотри кнопку тут:
http://bbs.vbstreets.ru/posting.php?mode=reply&t=18181 ;)

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 29.07.2005 (Пт) 22:15

Antonariy писал(а):4. Сабклассинг
А чем сабклассинг от хука отличается?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.07.2005 (Пт) 22:52

vvs_adm писал(а):
Antonariy писал(а):4. Сабклассинг
А чем сабклассинг от хука отличается?

"А чем отличается ворона от письменного стола?" (с) Л. Кэролл
Ничего общего нет.
Изображение

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 29.07.2005 (Пт) 23:27

tyomitch
для неграмотных (это для меня :) ) : сабклассинг - это механизм замены стандартной оконной процедуры класса на любую другую, которая будет принимать все сообщения, направляемые окну. После приема сообщения новая процедура должна передать его старой(стандартной) процедуре. Если новая процедура не передает сообщение старой процедуре, это называется блокировкой сообщения. Процесс замены и восстановления стандартной процедуры я буду называть установкой/снятием хука (хотя технически это не хук, но для удобства назовем его так).
Вот я в нескольких статьях читал, что "ставится хук", и они меня запутали, гады :)


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

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

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

    TopList