문제

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, ...)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top