C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: MouseMoveが連続発生


(過去ログ 19 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■8028 / inTopicNo.1)  MouseMoveが連続発生
  
□投稿者/ y4yama (26回)-(2007/09/21(Fri) 13:03:49)

分類:[VB.NET/VB2005] 

2007/09/21(Fri) 13:04:53 編集(投稿者)
質問させていただきます VB2005 Express Editin, windows XP

Public Class Form1
    Private Pflg As Boolean = False
    Private cnt As Integer = 0
    Private x As Integer = 10
    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
        Pflg = True
    End Sub

    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        If Pflg Then
            Label1.Text = cnt
            cnt += 1
            x += 1 : If 200 < x Then x = 10
            ' Label1.Left = x   '<---AA
        End If
    End Sub

    Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
        Pflg = False
    End Sub
End Class

MouseMoveが発生したら、Label1.Text = cnt で、発生回数を表示します。
このソースは思ったように動きます。で、<---AAのコメントを外したら、マウスを押したまま、マウスを少し
動かしてから次に動かさないでもCPU100%となり、離すまでMouseMoveが連続発生するのです。
つまり、Label1.Left = x とコントロールを操作したら、マウスの位置は変わらないのにMouseMoveが連続発生です。

(実際は、control Classを作り、TextBoxのようなことをしたいとテストしているのですが、そこでマウスで文字列を
選択するのにドラッグしたらCPU100%となったのですが、再現する最小コードとして上のようにしました)
対策としてはe.Locationで変わったことを判断すればいいです。が、
質問といたしまして、どうして、マウスの位置は変わらないのにMouseMoveが連続発生するのでしょうか?
何かきつねにつままれたような・・オバカな疑問かも知れないのですが先輩諸氏のご教授をお願いいたします。

引用返信 編集キー/
■8034 / inTopicNo.2)  Re[1]: MouseMoveが連続発生
□投稿者/ 囚人 (176回)-(2007/09/21(Fri) 15:08:03)
ついこの間、「The Old New Things」の翻訳本を読んで知ったんですが、偽の WM_MOUSEMOVE が発生するとか。
http://blogs.msdn.com/oldnewthing/archive/2003/10/01/55108.aspx

あくまで推測なんですが、今回の場合、Label を移動させた事によって画面全体のリフレッシュが必要になり(WM_PAINT)、それが偽の WM_MOUSEMOVE を発生させる原因になっているのではないかなと。
引用返信 編集キー/
■8047 / inTopicNo.3)  Re[2]: MouseMoveが連続発生
□投稿者/ y4yama (27回)-(2007/09/21(Fri) 16:41:43)
No8034 (囚人 さん) に返信
> ついこの間、「The Old New Things」の翻訳本を読んで知ったんですが、偽の WM_MOUSEMOVE が発生するとか。
> http://blogs.msdn.com/oldnewthing/archive/2003/10/01/55108.aspx

返信をありがとうございます
上のリンクでは、秒毎に2回とか書いてあるのでCPU100%ではないのでしょうね
でも
you need to add a check in your WM_MOUSEMOVE that the mouse position is different from the position reported by the previous WM_MOUSEMOVE message.
という対策は私がやったのと同じで、そうか〜と思いました。
偽の WM_MOUSEMOVE が発生する考察も興味深いものでした。
>Label を移動させた事によって画面全体のリフレッシュが必要になり
みたいなことも書いてありますよね。囚人さん、ありがとうございました

それで、すこし追加として、マウスを押すというのは除外してやって、Private Sub Form1_MouseMove()の中を
' If Pflg Then
Label1.Text = cnt
cnt += 1
' x += 10 : If 200 < x Then x = 10
Label1.Left = e.X
' End If
としたら、まったく普通にOKとなりました。(Label を移動させたのに、ですよ)
でも!
' If Pflg Then
Label1.Text = cnt
cnt += 1
x += 10 : If 200 < x Then x = 10
Label1.Left = x '<---**
' End If
では、マウスをForm1から外に出すまでは、100%回ります。秒毎に500回くらいです
やっぱり、きつねにつままれたような・・なんか、スッキリしないです・・・(泣
引用返信 編集キー/
■8048 / inTopicNo.4)  Re[3]: MouseMoveが連続発生
□投稿者/ 囚人 (179回)-(2007/09/21(Fri) 16:49:24)
>Label1.Left = e.X

マウスがフォームの上ではなくラベルの上にあるからでは?
引用返信 編集キー/
■8051 / inTopicNo.5)  Re[4]: MouseMoveが連続発生
□投稿者/ y4yama (28回)-(2007/09/21(Fri) 16:57:59)
No8048 (囚人 さん) に返信
> >Label1.Left = e.X
>
> マウスがフォームの上ではなくラベルの上にあるからでは?

ありがとうございます。
Top(y方向)は指定していないので、マウスはフォームの上です。
引用返信 編集キー/
■8053 / inTopicNo.6)  Re[5]: MouseMoveが連続発生
□投稿者/ 囚人 (181回)-(2007/09/21(Fri) 17:06:03)
2007/09/21(Fri) 17:31:43 編集(投稿者)
2007/09/21(Fri) 17:31:39 編集(投稿者)

>Top(y方向)は指定していないので、マウスはフォームの上です。

あ、そうですね。失礼しました。


1.CPU に負荷がかかってるパターン

マウスが動く

WM_MOUSEMOVE発生

ラベルが動く

画面がリフレッシュされる

偽のWM_MOUSEMOVE発生

ラベルが動く

画面がリフレッシュされる

WM_MOUSEMOVE発生

…以下無限


2.CPU に負荷がかかっていないパターン

マウスが動く

WM_MOUSEMOVE発生

ラベルが動く

画面がリフレッシュされる

偽のWM_MOUSEMOVE発生

ラベルは動かない(既にマウス x の位置にいるため)

終わり



てとこでしょうか。

引用返信 編集キー/
■8091 / inTopicNo.7)  Re[6]: MouseMoveが連続発生
□投稿者/ y4yama (29回)-(2007/09/22(Sat) 13:06:09)
No8053 (囚人 さん) に返信

おぉ〜!納得しました。ホントに有難うございます。今後ともよろしくお願いいたします

> 1.CPU に負荷がかかってるパターン
>
> マウスが動く
> ↓
> WM_MOUSEMOVE発生
> ↓
> ラベルが動く
> ↓
> 画面がリフレッシュされる
> ↓
> 偽のWM_MOUSEMOVE発生
> ↓
> ラベルが動く
> ↓
> 画面がリフレッシュされる
> ↓
> WM_MOUSEMOVE発生
> ↓
> …以下無限

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -