Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут
закрыты.
Читайте
требования к создаваемым темам.
-
pronto
-
- Постоялец
-
-
- Сообщения: 597
- Зарегистрирован: 04.12.2005 (Вс) 6:20
- Откуда: Владивосток
pronto » 28.07.2008 (Пн) 7:44
Прехватом получилось это сделать, но только для стиля '0 - Dropdown Combo'. Как заставить работать для стилей 1 и/или
2?
Вот мои действия:
- Код: Выделить всё
Public Sub Hook(hwnd As Long)
If defWndProc = 0 Then
defWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
End If
End Sub
Public Sub UnHook(hwnd As Long)
If defWndProc > 0 Then
Call SetWindowLong(hwnd, GWL_WNDPROC, defWndProc)
defWndProc = 0
End If
End Sub
Public Function WindowProc(ByVal hwnd As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
If hwnd = hwndEdit Then
Select Case uMsg
Case WM_CONTEXTMENU
' WindowProc = 0
' показать контекстное меню
mainF.PopupMenu mainF.mnItem
WindowProc = 0
Case Else
'оставить без изменений
WindowProc = CallWindowProc(defWndProc, _
hwnd, _
uMsg, _
wParam, _
lParam)
End Select
End If
End Function
Private Sub Form_Load()
' получение манипулятора текстового поля в комобокс'е
hwndEdit = FindWindowEx(Combo1.hwnd, 0&, vbNullString, vbNullString)
If hwndEdit <> 0 Then
Call Hook(hwndEdit)
'Call Hook(cmbSettlements.hwnd)
End If
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If hwndEdit <> 0 Then
Call UnHook(hwndEdit)
End If
Unload mainF
End Sub
O, sancta simplicitas!
-
Antonariy
-
- Повелитель Internet Explorer
-
-
- Сообщения: 4824
- Зарегистрирован: 28.04.2005 (Чт) 14:33
- Откуда: Мимо проходил
-
Antonariy » 28.07.2008 (Пн) 9:04
Для DropDownList WM_CONTEXTMENU не ходит, отлавливай правую кнопку мыши.
Лучший способ понять что-то самому — объяснить это другому.
-
pronto
-
- Постоялец
-
-
- Сообщения: 597
- Зарегистрирован: 04.12.2005 (Вс) 6:20
- Откуда: Владивосток
pronto » 28.07.2008 (Пн) 9:07
WM_RBUTTONDOWN ?
Пробовал, не реагирует...
O, sancta simplicitas!
-
pronto
-
- Постоялец
-
-
- Сообщения: 597
- Зарегистрирован: 04.12.2005 (Вс) 6:20
- Откуда: Владивосток
pronto » 28.07.2008 (Пн) 9:23
Извиняюсь за суету. Получилось самому разобраться.
строку
- Код: Выделить всё
hwndEdit = FindWindowEx(Combo1.hwnd, 0&, vbNullString, vbNullString)
нужно заменить на
- Код: Выделить всё
hwndEdit = ChildWindowFromPoint(Combo1.hwnd, 5, 5)
Такой вариант реагирует и на WM_RBUTTONDOWN, и на WM_CONTEXTMENU. У себя оставил WM_CONTEXTMENU для наглядности.
O, sancta simplicitas!
-
Twister
-
- Теоретик
-
-
- Сообщения: 2251
- Зарегистрирован: 28.06.2005 (Вт) 12:32
- Откуда: Алматы
-
Twister » 28.07.2008 (Пн) 13:40
- Код: Выделить всё
hwndEdit = ChildWindowFromPoint(Combo1.hwnd, 5, 5)
Достаточно заменить на GetWindow с GW_CHILD. А то вдруг комбо будет меньше, чем 5 пикселей в ширину...
А я все практикую лечение травами...
Вернуться в Visual Basic 1–6
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 72