Question

J'ai un formulaire VB6 avec un contrôle ocx dessus.Le contrôle ocx comporte un bouton sur lequel je souhaite appuyer à partir du code.Comment puis-je faire cela?

J'ai:

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

mais cela ne semble pas fonctionner.

Était-ce utile?

La solution

Je pense que ce qui suit fonctionnera :

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

CommandButtons ont en fait deux fonctions.L'un est le bouton de clic habituel et l'autre est un bouton à bascule qui agit de la même manière qu'un CheckBox.La propriété par défaut du CommandButton est en fait le Value propriété qui indique si un bouton est activé.En définissant la propriété, le Click l'événement est généré.Ceci est effectué même si le bouton n'est pas conçu comme un ToggleButton et ne change donc pas d'état.

Autres conseils

Si vous avez accès au code OCX, vous pouvez exposer le gestionnaire d'événements associé et l'appeler directement.
Je ne sais pas si un équivalent de la méthode Click() de .Net Button existait à l'époque de VB6

Pour appuyer sur une touche, vous pouvez également utiliser sendmessage en envoyant à la fois keydown et 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

Ce:

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

ça marche.Complètement peu intuitif.Je m'attendrais à ce qu'il génère une erreur puisqu'un booléen n'est pas un CommandButton valide, mais c'est à cause de la propriété par défaut.

WM_LBUTTONDOWN serait un clic de souris, ce que je veux, c'est un clic de bouton (bouton comme dans un bouton hwnd, pas un bouton de souris).

Je n'ai pas accès à la source de l'ocx (c'est un contrôle tiers).Si je le faisais, j'exposerais la fonction que je voulais appeler (l'auteur original de l'ocx aurait dû l'exposer).

Avez-vous accès au code OCX ?Vous ne devriez pas vraiment invoquer directement le clic d'un bouton.Vous devez refactoriser le code pour que le code de clic du bouton OCX appelle une fonction, par ex.

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

Ensuite depuis votre application VB6, appelez directement la méthode FooBar.Si vous ne pouvez pas appeler directement des fonctions depuis VB6, vous pouvez envelopper la méthode FooBar() avec une fonction proc de message Windows, par exemple.

#define WM_FOOBAR WM_APP + 1

Utilisez ensuite SendMessage dans le VB6, comme SendMessage(WM_FOOBAR, ...)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top