Pergunta

Eu tenho um vb6 formulário com um controle ocx sobre ele.O controle ocx tem um botão que eu quero prima de código.Como eu faço isso?

Eu tenho:

Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
SendMessage ocx.hwnd, WM_COMMAND, GetWindowLong(b.hwnd, GWL_ID), b.hwnd

mas ele parece não funcionar.

Foi útil?

Solução

Eu acredito o seguinte funcionará:

Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
b = True

CommandButtons, na verdade, tem duas funções.Um deles é o de costume, clique em botão e o outro é um botão de alternância que funciona semelhante a um CheckBox.A propriedade padrão do CommandButton na verdade, é o Value propriedade que indica se o botão é alternada.Definindo a propriedade, o Click evento é gerado.Isso é feito mesmo se o botão não está desenhado como um ToggleButton e, portanto, não altera seu estado.

Outras dicas

Se você tiver acesso a OCX código, você pode expor o associado manipulador de eventos e invocá-lo diretamente.
Não sei se um equivalente .Net Clique do Botão() método existia de volta em VB6 dias

Para keypress você também pode usar sendmessage o envio de keydown e 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

Este:

Dim b As CommandButton
Set b = ocx.GetButton("btnPrint")
b = True

não funciona.Completamente intuitivo.Eu esperaria para lançar um erro, pois um bool não é válido CommandButton, mas é porque a propriedade padrão coisa.

WM_LBUTTONDOWN seria um clique do mouse, o que eu quero é o clique de um botão (botão em um hwnd botão, e não a um botão do rato).

Eu não tiver acesso à fonte da ocx (é a 3ª festa de controle).Se eu fiz, eu gostaria de expor a função que eu queria chamar (o escritor original da ocx deve ter exposta).

Você tem acesso a OCX código?Você realmente não deve ser diretamente invocando o clique de um botão.Você deve refatorar o código para que o OCX clique no botão de chamadas de código de uma função, por exemplo,

CMyWindow::OnLButtonDown()
{
  this->FooBar();
}

Em seguida, a partir do seu aplicativo VB6, chamar diretamente o FooBar método.Se você não pode chamar diretamente funções de VB6 você pode quebrar o FooBar() método com uma mensagem do windows proc função, ex:

#define WM_FOOBAR WM_APP + 1

Em seguida, use SendMessage no VB6, como SendMessage(WM_FOOBAR, ...)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top