フォーム外のマウスイベントを取得するには?

解決


うただ  2004-02-19 08:03:16  No: 7227  IP: 192.*.*.*

PaintBox内で右ドラッグしたままフォーム外へ移動しマウスアップした時にもマウスアップイベントを発生させたいのですが、、、どうすればいいのでしょうか?簡単なサンプルなどありましたら教えてください。

編集 削除
にしの  2004-02-19 09:01:46  No: 7228  IP: 192.*.*.*

MouseDown時に、SetCaptureし、MouseUpでReleaseCaptureすれば出来ます。

編集 削除
うただ  2004-02-19 11:49:16  No: 7229  IP: 192.*.*.*

にしのさん  ありがとうございます。
MouseDown時に、SetCapture(PaintBox1.Canvas.Handle)としてMouseUpでReleaseCaptureしているのですがうまく作動しません。PaintBox1.Canvas.Handle  の部分が悪いのでしょうか?初歩的な質問で恐縮です。

編集 削除
たかみちえ  URL  2004-02-19 12:31:34  No: 7230  IP: 192.*.*.*

Canvas,Handleは、デバイスコンテキストのハンドルであり、ウィンドウハンドルではありません。
親ウィンドウ(HANDLEを持っているコントロール)の、ウィンドウハンドルを指定してください。

  おんぷむらのうら(http://TakamiChie.at.infoseek.co.jp/)のおんぷ村倉庫に、マウスキャプチャ用の継承専用クラスがあります。よければどうぞ。

編集 削除
jok  2004-02-19 13:32:58  No: 7231  IP: 192.*.*.*

こんな感じ

procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if ssRight in Shift then begin
    SetCaptureControl(PaintBox1);
    Label1.Caption := 'MouseDown';
  end;
end;

procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  Label1.Caption := 'MouseUp';
end;

編集 削除
うただ  2004-02-19 14:07:59  No: 7232  IP: 192.*.*.*

たかみちえさん、jokさんありがとうございます。
SetCaptureControl(PaintBox1);をMouseMoveイベントの中にも書いたので左右同時ドラッグが可能になりました。
助かりました。

編集 削除
jok  2004-02-19 14:12:10  No: 7233  IP: 192.*.*.*

>MouseMoveイベントの中にも書いたので

OnMouseMove イベントハンドラに書くのはまずいです。ただマウスが
横切っただけでも多数回発生しますので。OnMouseDown に書いてください。

編集 削除
うただ  2004-02-19 14:29:49  No: 7234  IP: 192.*.*.*

jokさん、助言ありがとうございます。
わたしも不具合に気が付きまして、ボタンが押されているかどうかのフラグを設けてフラグがONの場合は継続しOFFの場合は開放するようにしました。

編集 削除
うただ  2004-02-19 14:52:36  No: 7235  IP: 192.*.*.*

解決しました。

編集 削除