문제
ocx 컨트롤이 포함된 vb6 양식이 있습니다.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 코드에 액세스할 수 있는 경우 관련 이벤트 핸들러를 노출하고 직접 호출할 수 있습니다.
VB6 시절에 .Net Button의 Click() 메서드에 해당하는 것이 존재했는지 알 수 없습니다.
키 누르기의 경우 keydown과 keyup을 모두 보내는 sendmessage를 사용할 수도 있습니다.
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은 유효한 CommandButton이 아니기 때문에 오류가 발생할 것으로 예상하지만 이는 기본 속성 때문입니다.
WM_LBUTTONDOWN
내가 원하는 것은 버튼 클릭(마우스 버튼이 아닌 hwnd 버튼과 같은 버튼)입니다.
ocx 소스(타사 컨트롤)에 액세스할 수 없습니다.그렇게 한다면 내가 호출하고 싶은 함수를 노출하게 될 것입니다(ocx의 원래 작성자가 이를 노출했어야 했습니다).
OCX 코드에 액세스할 수 있나요?실제로 버튼 클릭을 직접 호출해서는 안 됩니다.OCX 버튼 클릭 코드가 함수를 호출하도록 코드를 리팩터링해야 합니다.
CMyWindow::OnLButtonDown()
{
this->FooBar();
}
그런 다음 VB6 앱에서 FooBar 메서드를 직접 호출하세요.VB6에서 함수를 직접 호출할 수 없는 경우 FooBar() 메서드를 Windows 메시지 proc 함수로 래핑할 수 있습니다.
#define WM_FOOBAR WM_APP + 1
그런 다음 사용 SendMessage
VB6에서는 SendMessage(WM_FOOBAR, ...)