Вопрос
У меня есть форма vb6 с элементом управления ocx в ней.На элементе управления ocx есть кнопка, которую я хочу нажать из кода.Как мне это сделать?
У меня есть:
Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
SendMessage ocx.hwnd, WM_COMMAND, GetWindowLong(b.hwnd, GWL_ID), b.hwnd
но, похоже, это не работает.
Решение
Я считаю, что будет работать следующее:
Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
b = True
CommandButton
на самом деле имеют две функции. Одна - это обычная кнопка щелчка, а другая - кнопка переключения, которая действует подобно CheckBox
. Свойство по умолчанию для CommandButton
на самом деле является свойством Value
, которое указывает, переключается ли кнопка. При установке свойства генерируется событие Click
. Это делается, даже если кнопка не оформлена как ToggleButton
и поэтому не меняет своего состояния.
Другие советы
Если у вас есть доступ к коду OCX, вы можете открыть связанный обработчик событий и вызвать его напрямую.
Не знаю, существовал ли эквивалент метода .Net Button Click () в VB6 дней
Для нажатия клавиш вы также можете использовать sendmessage, отправляющий как keydown, так и keyup:
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
Const WM_KEYDOWN As Integer = &H100
Const WM_KEYUP As Integer = &H101
Const VK_SPACE = &H20
Private Sub cmdCommand1_Click()
Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
SendMessage b.hWnd, WM_KEYDOWN, VK_SPACE, 0&
SendMessage b.hWnd, WM_KEYUP, VK_SPACE, 0&
End Sub
Это:
Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
b = True
действительно работает.Совершенно неинтуитивно.Я бы ожидал, что это выдаст ошибку, поскольку bool не является допустимой командной кнопкой, но это из-за свойства по умолчанию.
WM_LBUTTONDOWN
был бы щелчок мыши, то, что я хочу, это нажатие кнопки (кнопка, как в кнопке hwnd, а не кнопка мыши).
У меня нет доступа к исходному коду ocx (это сторонний элемент управления).Если бы я это сделал, я бы предоставил функцию, которую я хотел вызвать (первоначальный автор ocx должен был предоставить ее).
У вас есть доступ к коду OCX? Вы не должны прямо вызывать нажатие кнопки. Вы должны реорганизовать код так, чтобы код щелчка кнопки OCX вызывал функцию, например.
CMyWindow::OnLButtonDown()
{
this->FooBar();
}
Затем из вашего приложения VB6 напрямую вызовите метод FooBar. Если вы не можете напрямую вызывать функции из VB6, вы можете заключить метод FooBar () в функцию обработки сообщений Windows, например.
#define WM_FOOBAR WM_APP + 1
Затем используйте SendMessage
в VB6, например SendMessage (WM_FOOBAR, ...)