VB2005で開発を行っています。
ボタンをクリックして更新や、印刷の処理を実行する場合に、フォームとその子コントロールのイベントを無効にする方法はないでしょうか?
フォームの Enabled を False にするとコントロールの表示がグレーになるのを避けたいのですが...
また、印刷プレビューなどでモードレスの別ウィンドウを表示するので表示されている間は操作させたくないのです。(別ウィンドウは VB 以外で作成された DLL で作成されるのでモーダルで開けないのです...)
Application.AddMessageFilter なども試したのですが対象フォーム以外のイベントも無効になってしまうのでダメでした。
よろしくお願いします。
WndProcメソッドのオーバーライドして、クリック等の処理を
処理の間は無効にすればいいかもね。
WndProcメソッドのオーバーライドの例
http://jeanne.wankuma.com/tips/form/moveable.html
ありがとうございます。
WndProc も試したのですが、子コントロールのイベントはコントロール側でオーバーライドしないといけないですよね?
コントロールの数が多い場合を考えるとフォーム出の対応で制御できないかと思ったのですが...
そんな便利な方法はないのでしょうか?
>WndProc も試したのですが、子コントロールのイベントはコントロール側で>オーバーライドしないといけないですよね?
そうなんですかね?
親がメッセージを受け取ってから子にメッセージを送るから
親側で制御可能かと思っているのですが・・・
もう一度以下のコードで確認してみました。
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Const WM_KEYDOWN As Integer = &H100
Const WM_LBUTTONDOWN As Integer = &H201
Const WM_LBUTTONDBLCLK As Integer = &H203
Const WM_RBUTTONDOWN As Integer = &H204
Const WM_RBUTTONDBLCLK As Integer = &H206
Select Case m.Msg
Case WM_KEYDOWN, WM_LBUTTONDOWN, WM_LBUTTONDBLCLK, WM_RBUTTONDOWN, WM_RBUTTONDBLCLK
Return
End Select
MyBase.WndProc(m)
End Sub
フォームの Click イベントは発生しなくなりますがコントロールの Click イベントは発生します。KeyDown イベントについても同様でした。
Windows Messageは対象のウィンドウプロシージャが直接処理します。
そのため,フォームのウィンドウプロシージャでどうこうしようと,ボタンの処理に影響を与えることはありません。
手っ取り早いのはボタンをカスタムコントロールにしてしまうことでしょう。
誤) Windows Message
正) Window Message
SetWindowLong API で GWL_STYLE に WS_DISABLED を指定するとこで対応できました。
編集 削除