質問
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
s には実際には 2 つの機能があります。1 つは通常のクリック ボタンで、もう 1 つはトグル ボタンで、 CheckBox
. 。のデフォルトのプロパティ CommandButton
実際には Value
ボタンが切り替わるかどうかを示すプロパティ。プロパティを設定することで、 Click
イベントが発生します。これは、ボタンがスタイルされていない場合でも行われます。 ToggleButton
したがって、その状態は変わりません。
他のヒント
OCX コードにアクセスできる場合は、関連するイベント ハンドラーを公開して、それを直接呼び出すことができます。
.Net Button の Click() メソッドと同等のメソッドが VB6 の時代に存在したかどうかはわかりません
キーを押す場合は、キーダウンとキーアップの両方を送信する 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
機能します。まったく直感的ではありません。ブール値は有効なコマンドボタンではないため、エラーがスローされることが予想されますが、これはデフォルトのプロパティによるものです。
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, ...)