- PR -

Mouse Downイベントの無いOCXコントロールにMouse Downイベントを追加したい

1
投稿者投稿内容
ぽち
常連さん
会議室デビュー日: 2006/05/31
投稿数: 21
投稿日時: 2007-09-07 19:36


お世話になります。
PictureBoxのような外観をもつOCXコントロールを使用しています。
画像の編集等が出来て便利なコントロールなのですがMouse Down etcのイベントがありません。

AddHandler ocx.MouseDown, AddressOf ocx_MouseDown

などとしても元々コントロール自体がMouseDownをサポートしていないとダメなようで
無効な追加である旨が表示されてエラーになります。

何とかしてMouse Down etcのイベントと追加したいのですがいい方法はないでしょうか?

OCXと同じ大きさのPanelなどを作成しそのイベントでなどとも考えたのですが
一番上にないとMouseDownイベントも取得できないようです。
YAS
ベテラン
会議室デビュー日: 2006/02/15
投稿数: 59
投稿日時: 2007-09-08 02:39
NativeWindowクラスでサブクラス化したらどうでしょうか。
例えばMouseDownであれば下のようになると思います。
○○○○のところをocxのインスタンスにしてください。
コード:
Public Class Form1

    Dim WithEvents nw As ExOCX

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        nw = New ExOCX(me.Ax○○○○○)
    End Sub

    Private Sub nw_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles nw.MouseDown
        Debug.Print("マウスが押された x={0},y={1}", e.X, e.Y)
    End Sub

End Class

Class ExOCX
    Inherits NativeWindow

    Private WithEvents _OCX As AxHost

    Sub New(ByVal ocx As Object)
        Me._OCX = ocx
        Me.AssignHandle(Me._OCX.Handle)
    End Sub

    Private Sub _OCX_HandleCreated(ByVal sender As Object, ByVal e As System.EventArgs) Handles _OCX.HandleCreated
        Me.AssignHandle(Me._OCX.Handle)
    End Sub

    Private Sub _OCX_HandleDestroyed(ByVal sender As Object, ByVal e As System.EventArgs) Handles _OCX.HandleDestroyed
        Me.ReleaseHandle()
    End Sub

    Event MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)

    Public Sub OnMouseDown()
        Dim p As Point = Me._OCX.PointToClient(Control.MousePosition)
        Dim e As New MouseEventArgs(MouseButtons.Left, 1, p.X, p.Y, 0)
        RaiseEvent MouseDown(Me, e)
    End Sub

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Const WM_LBUTTONDOWN = &H201
        Select Case m.Msg
            Case WM_LBUTTONDOWN
                OnMouseDown()
        End Select
        MyBase.WndProc(m)
    End Sub

End Class

ぽち
常連さん
会議室デビュー日: 2006/05/31
投稿数: 21
投稿日時: 2007-09-10 12:00
完全に意図するように動作しました。
サンプルまで作成して頂き有難うございます。

NativeWindowクラスなど知りませんでしたし見つけていても
私の見識でこれは違うと読み飛ばしていたような気がします。
本当に助かりました。

1

スキルアップ/キャリアアップ(JOB@IT)