< ウインドウを一時的にアクティブにして最前面に持ってくる | C# プログラマーズ リファレンス >

February 23, 2005

非同期イベント発生コントロール

時間のかかる処理をイベントと非同期に処理したいことがあり、ウインドウメッセージを使って非同期にイベントを発生させるユーザコントロールを作成しました。マルチスレッドではないので並列処理はできませんが、以外に使えるのでおいておきます。VB6用。

VERSION 5.00
Begin VB.UserControl ctlAsyncEvent 
   ClientHeight    =   3600
   ClientLeft      =   0
   ClientTop       =   0
   ClientWidth     =   4800
   HasDC           =   0   'False
   InvisibleAtRuntime=   -1  'True
   ScaleHeight     =   3600
   ScaleWidth      =   4800
End
Attribute VB_Name = "ctlAsyncEvent"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
'-----------------------------------------------------------------------------
'
'   非同期イベント発生コントロール
'
'   ソース名: ctlAsyncEvent.ctl
'   作成日 : 2005.02.22
'
'-----------------------------------------------------------------------------
Option Explicit
Private Const CNST_MODULE_NAME  As String = "ctlAsyncEvent"
''========================================================================
''
''========================================================================
''
'' イベント定義
''
Public Event AsyncEvent(ByVal plngEventId As Long)

''========================================================================
''
''========================================================================
''
'' 型定義
''

Private Type POINTAPI
    x       As Long
    y       As Long
End Type

''========================================================================
''
''========================================================================
''
'' 外部DLLプロシージャ宣言
''

Private Const WM_MBUTTONDOWN                  As Long = &H207   '
Private Const WM_MBUTTONUP                    As Long = &H208   '
Private Const WM_MOUSEMOVE                    As Long = &H200   '
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

'******************************************************************
'プロシージャ名   :Raise
'説明             :非同期イベントを発生させる
'引数             :plngEventId          I   イベントの識別番号
'******************************************************************
Public Sub Raise(ByVal plngEventId As Long)
'============= Declare ==============
Dim lngRet      As Long

'============= Initiarize ===========
On Error GoTo ERR_HANDLER_00

'============= Main =================
    
    '' 中ボタンクリックをポストする
    lngRet = PostMessage(UserControl.hWnd, WM_MOUSEMOVE, 0&, plngEventId)
    Call DebugLog(CONT_STATE_NOTE, CNST_MODULE_NAME & ".Raise", "Succeed")

'============= Release ==============
RESUME_00:
    Exit Sub
'============= Error ================
ERR_HANDLER_00:
    Call Err.Raise(Err.Number, CNST_MODULE_NAME & ".Raise ← " & Err.Source, Err.Description, Err.HelpFile, Err.HelpContext)

End Sub

'------------------------------------------------------------------
'プロシージャ名   :UserControl_MouseMove
'説明             :マウス移動時処理
'引数             :Button               I   押下中のマウスボタン
'                 :Shift                I   シフト状態
'                 :X                    I   クライアント座標:X座標
'                 :Y                    I                   :Y座標
'------------------------------------------------------------------
Private Sub UserControl_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
'============= Declare ==============
Dim udtPoint        As POINTAPI
Dim lngOrglParam    As Long
Dim lngRet          As Long

'============= Initiarize ===========
On Error GoTo ERR_HANDLER_00

'============= Main =================
    
    Call DebugLog(CONT_STATE_NOTE, CNST_MODULE_NAME & ".UserControl_MouseMove", "Start")
    
    '' オリジナルの LPARAM を求める
    With UserControl
        udtPoint.x = .ScaleX(x, .ScaleMode, vbPixels)
        udtPoint.y = .ScaleY(y, .ScaleMode, vbPixels)
    End With
    Call CopyMemory(lngOrglParam, udtPoint, Len(lngOrglParam))
        
    '' 非同期イベントを発生させる
    RaiseEvent AsyncEvent(lngOrglParam)
    
    Call DebugLog(CONT_STATE_NOTE, CNST_MODULE_NAME & ".UserControl_MouseMove", "End")
    
'============= Release ==============
RESUME_00:
    Exit Sub
'============= Error ================
ERR_HANDLER_00:
    Call HandleWarn(Err.Number, Err.Source, Err.Description, CNST_MODULE_NAME & ".UserControl_MouseMove")

    Resume RESUME_00
End Sub

トラックバック

このエントリーにトラックバック:
http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/837

コメント

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?