изменить PopupMenu для ComboBox

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

изменить PopupMenu для ComboBox

Сообщение 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
Повелитель 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

    TopList  
cron