- PR -

つまんで移動するコントロール

1
投稿者投稿内容
やました
会議室デビュー日: 2003/06/27
投稿数: 3
投稿日時: 2003-07-18 19:09
お世話になっております。

コントロールにつまんで移動できる機能を加えているのですが、OnMouseMove
中でLocationプロパティを変更すると続けてOnMouseMoveが呼ばれ続けて
非常に見苦しい状態になってしまいます。再帰的に呼ばれるわけでもなければ、
次の呼び出しを無視すればいいというわけでもなく困っております。どなかた
回避方法を教えていただけないでしょうか。

よろしくお願いいたします。
ZEBRA
常連さん
会議室デビュー日: 2003/04/14
投稿数: 38
投稿日時: 2003-07-19 23:52
マウスではなくD&D(ドラッグアンドドロップ)の機能を使ってはどうでしょうか?
マウスは移動中、常にイベントが発生しますが、D&Dの場合、イベントは、ドラッグ開始とドロップ時のみしか発生しないので、解決できると思います。
やました
会議室デビュー日: 2003/06/27
投稿数: 3
投稿日時: 2003-07-23 11:47
お返事ありがとうございます。

ドラッグ中の座標に描画しなければならないので残念ながらD&Dは使うことができま
せんでした。(もしかしたら、私の知らない関数があるのかもしれませんが)

なんとかなった、、、だけではあれですので、原因を書いておきたいと思います。

原因は座標の計算の部分で、Locationプロパティを変更すれば続けてOnMouseMove
が呼ばれてしまいますが、2度目のOnMouseMove内でLocationプロパティと同じ値が
セットされるようにOnMouseMove中を記述すれば無限に関数が呼ばれつづけることは
避けられるようです。

bool isDrag;
Point dragPoint;

protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown (e);
isDrag = true;
this.Capture = true;
dragPoint = new Point(e.X, e.Y);
}

protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove (e);
if (isDrag)
{
++moveCount;
this.Location = new Point(this.Location.X + e.X + -dragPoint.X, this.Location.Y + e.Y + -dragPoint.Y);
this.Parent.Text = moveCount.ToString();
this.Invalidate();
}
}

protected override void OnMouseUp(MouseEventArgs e)
{
base.OnMouseLeave (e);
this.Capture = false;
isDrag = false;
}


[ メッセージ編集済み 編集者: やました 編集日時 2003-07-23 11:48 ]

[ メッセージ編集済み 編集者: やました 編集日時 2003-07-23 11:54 ]
1

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