Есть вопрос по ListBox, помогите кто может
Заранее благодарен.
Как сделать, что бы правой кнопкой мыши можно было выделить (выбрать) необходимый элемент из списка в ListBox.
Заранее благодарен.
Немного не понял. Тоесть, ты хочешь, чтобы обрабатывался клик для левши?
Немного не понял. Тоесть, ты хочешь, чтобы обрабатывался клик для левши?
К сожелению, или кодом отлавливать координаты мыши и устанавливать фокус в элемент, или через API:{
Как сделать, что бы правой кнопкой мыши можно было выделить (выбрать) необходимый элемент из списка в ListBox.
Заранее благодарен.
Можно правой, можно двойным кликом или комбинацией клавиш и т.д неважно какой дрыг даст результат.
Может так - говорим волшебное слово (пока не знаю какое) и получаем:
With ListBox1
результат=.List(.ListIndex,i)
End With
Можно правой, можно двойным кликом или комбинацией клавиш и т.д неважно какой дрыг даст результат.
Может так - говорим волшебное слово (пока не знаю какое) и получаем:
With ListBox1
результат=.List(.ListIndex,i)
End With
Ты чего мудришь-то? Жми левую кнопку или делай двойной клик (опять хе левой) и получишь волшебный результат.
Ты чего мудришь-то? Жми левую кнопку или делай двойной клик (опять хе левой) и получишь волшебный результат.
Я имел ввиду обработку событий. Для ЛистБокс уже имеется встроенных 14. Можно выбрать любую. Если хочеться чего-то необычного то пишем свою процедуру.
Private Sub Волшебное_слово()
'код
End Sub
Успехов
Я имел ввиду обработку событий. Для ЛистБокс уже имеется встроенных 14. Можно выбрать любую. Если хочеться чего-то необычного то пишем свою процедуру.
Private Sub Волшебное_слово()
'код
End Sub
Успехов
Кстати, попробуй объявить Лист Бокс поздним связыванием. И с событиями.
Кстати, попробуй объявить Лист Бокс поздним связыванием. И с событиями.
1
Не буду пробовать, оно мне ненать, и не имеет ни какого отношения к заданному вопросу.
Wowan, думаю, что это то, что надо.
Private Sub ListBox1_Click()
Dim результат as String
Dim i As Integer
'i - инндекс колонки
With ListBox1
результат=.List(.ListIndex,i)
End With
'продолжение кода
End Sub
Повторюсь, что иимеется 14(приведеных ниже)встроенных событый.
Насчет любой, для данного случая, так это конечно -нет. Надо выбрать наиболее подходящее.
1. BeforeDragOver
2. BeforeDropOrPaste
3. Change
4. Click()
5. DblClick
6. Error
7. GotFocus
8. KeyDown
9. KeyPress
10.KeyUp
11.LostFocus
12.MouseDown
13.MouseMove
14.MouseUp
Успехов
Как сделать, что бы правой кнопкой мыши можно было выделить (выбрать) необходимый элемент из списка в ListBox.
Заранее благодарен.
Я думаю этот вопрос можно решить через API немного нагроможденно но зато вполне работоспособно.
В дальнейшем примере я подменяю правую клавишу при клике не листбокс левой и таким образом происходит выделение нужного элемента листбокса правой клавишей.
'''''''''
''ФОРМА''
'''''''''
Private Sub Form_Load()
Hook (List1.hwnd) 'Листбокс должен быть на форме
End Sub
Private Sub Form_Unload(Cancel As Integer)
UnHook (List1.hwnd) 'Это надо чтобы не глючило
End Sub
Private Sub List1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
MsgBox Button 'А тут все по прежнему
End Sub
''''''''''
''МОДУЛЬ''
''''''''''
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private 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
Private Const GWL_WNDPROC = (-4)
' События мыши
Private Const WM_LBUTTONDBLCLK = &H203
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Const WM_MBUTTONDBLCLK = &H209
Private Const WM_MBUTTONDOWN = &H207
Private Const WM_MBUTTONUP = &H208
Private Const WM_RBUTTONDBLCLK = &H206
Private Const WM_RBUTTONDOWN = &H204
Private Const WM_RBUTTONUP = &H205
Dim lpPrevWndProc As Long
Public Sub Hook(hwnd As Long)
'Ставим хук
lpPrevWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub UnHook(hwnd As Long)
'Возвращаем все назад
Dim lngReturnValue As Long
lngReturnValue = SetWindowLong(hwnd, GWL_WNDPROC, lpPrevWndProc)
End Sub
Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
On Error Resume Next 'Если Basic начинает отлаживать то что находится в этой поцедуре то он вылетает по этому и ставим Resume Next
Select Case uMsg
Case WM_RBUTTONDOWN
Call WindowProc(hwnd, WM_LBUTTONDOWN, wParam, lParam) ' Обманываем окно и говорим: "Нет это не правая клавиша была а левая"
Case WM_LBUTTONDOWN
' И делай с ним что хочеш ))))))
Case Else
WindowProc = CallWindowProc(lpPrevWndProc, hwnd, uMsg, wParam, lParam)
End Select
End Function
В приложеном файле тот-же текст но более читабельный
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long
Public Declare Function GetScrollPos Lib "user32" _
(ByVal hwnd As Long, ByVal nBar As Long) As Long
Public Const LB_GETITEMHEIGHT = &H1A1
Public Const SB_VERT = 1
Private Sub List1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim h As Long
Dim s As Long
Dim ind As Integer
On Error Resume Next
If Button = 2 Then
s = GetScrollPos(List1.hwnd, SB_VERT)
h=SendMessage(List1.hwnd,LB_GETITEMHEIGHT,0, 0)
ind = Y \ (h * 15) + s
List1.Selected(ind) = True
End If
End Sub
Private Sub List1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 2 Then
PopupMenu mnuqw, 8
End If
End Sub
С уважением.. Владимир.