Domanda

Ho un modulo vb6 con un controllo ocx su di esso.Il controllo ocx ha un pulsante che voglio premere dal codice.Come faccio a fare questo?

Io ho:

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

ma non sembra funzionare.

È stato utile?

Soluzione

Credo che quanto segue funzionerà:

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

CommandButtonIn realtà hanno due funzioni.Uno è il solito pulsante di clic e l'altro è un pulsante di attivazione/disattivazione che funziona in modo simile a un CheckBox.La proprietà predefinita di CommandButton è in realtà il Value proprietà che indica se un pulsante è attivato/disattivato.Impostando la proprietà, il Click viene generato l'evento.Ciò avviene anche se il pulsante non ha lo stile a ToggleButton e quindi non cambia il suo stato.

Altri suggerimenti

Se hai accesso al codice OCX, potresti esporre il gestore eventi associato e invocarlo direttamente.
Non so se un equivalente del metodo Click() di .Net Button esistesse ai tempi di VB6

Per la pressione dei tasti puoi anche utilizzare sendmessage inviando sia keydown che 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

Questo:

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

funziona.Completamente non intuitivo.Mi aspetto che generi un errore poiché un bool non è un CommandButton valido, ma è a causa della proprietà predefinita.

WM_LBUTTONDOWN sarebbe un clic del mouse, quello che voglio è un clic sul pulsante (pulsante come in un pulsante hwnd, non un pulsante del mouse).

Non ho accesso al sorgente dell'ocx (è un controllo di terze parti).Se lo facessi, esporrei la funzione che volevo chiamare (lo scrittore originale dell'ocx avrebbe dovuto esporla).

Hai accesso al codice OCX?Non dovresti davvero invocare direttamente il clic di un pulsante.Dovresti rifattorizzare il codice in modo che il codice di clic del pulsante OCX richiami una funzione, ad es.

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

Quindi dalla tua app VB6, chiama direttamente il metodo FooBar.Se non puoi chiamare direttamente le funzioni da VB6 puoi racchiudere il metodo FooBar() con una funzione di proc dei messaggi di Windows, ad es.

#define WM_FOOBAR WM_APP + 1

Quindi utilizzare SendMessage nel VB6, come SendMessage(WM_FOOBAR, ...)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top