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

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

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

Re[5]: ユーザーコントロールでのMouseHover・Leave


(過去ログ 105 を表示中)

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

■62886 / inTopicNo.1)  ユーザーコントロールでのMouseHover・Leave
  
□投稿者/ ベッキー (1回)-(2011/11/08(Tue) 11:38:34)

分類:[VB.NET/VB2005 以降] 

こんにちは。
ユーザーコントロールを作成し、このコントロールの上にマウスポインタが来たら
コントロールの枠線を立体的(Windows.Forms.BorderStyle.Fixed3D)にして、
マウスポインタが離れていったら枠線をフラット(Windows.Forms.BorderStyle.FixedSingle)に
したいと思い、このコントロールのイベントとして、以下のようなコードを書きました。

Private Sub ctr_MouseHover(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseHover
Me.BorderStyle = Windows.Forms.BorderStyle.Fixed3D
End Sub

Private Sub ctr_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseLeave
Me.BorderStyle = Windows.Forms.BorderStyle.FixedSingle
End Sub

これをフォーム等に配置した後、マウスポインタをこのコントロール上に持っていくとコントロールの枠線が立体的になり、
マウスポインタをこのコントロールから外すとコントロールの枠線はフラットになるのですが、
このコントロールの境界のあたりにマウスポインタを持っていくと、枠線が立体的になったりフラットになったりを
繰り返して振動した状態(私の業界ではチャタリングと言っています)になります。

これを防ぐいい方法はないでしょうか?
使用している言語はVB2008です。
よろしくお願いします。
引用返信 編集キー/
■62888 / inTopicNo.2)  Re[1]: ユーザーコントロールでのMouseHover・Leave
□投稿者/ shu (1076回)-(2011/11/08(Tue) 11:48:50)
No62886 (ベッキー さん) に返信

マウスポジションの範囲で例えば5x5((-2,-2)-(+2,+2))の範囲がすべてユーザーコントロール内に含まれていたら
ユーザーコントロール内にマウスカーソルがあると判断してみてはどうでしょう?
引用返信 編集キー/
■62889 / inTopicNo.3)  Re[2]: ユーザーコントロールでのMouseHover・Leave
□投稿者/ ベッキー (2回)-(2011/11/08(Tue) 11:57:53)
No62888 (shu さん) に返信
> ■No62886 (ベッキー さん) に返信
>
> マウスポジションの範囲で例えば5x5((-2,-2)-(+2,+2))の範囲がすべてユーザーコントロール内に含まれていたら
> ユーザーコントロール内にマウスカーソルがあると判断してみてはどうでしょう?

早速のコメント有難う御座います。
ところで5x5((-2,-2)-(+2,+2))とは何のことでしょうか?
引用返信 編集キー/
■62890 / inTopicNo.4)  Re[3]: ユーザーコントロールでのMouseHover・Leave
□投稿者/ shu (1077回)-(2011/11/08(Tue) 12:09:49)
No62889 (ベッキー さん) に返信

> 早速のコメント有難う御座います。
> ところで5x5((-2,-2)-(+2,+2))とは何のことでしょうか?
マウスポジションを中心とした上下左右2の範囲で幅と高さが5になるのでこう書きました。


□□□□□
□□□□□
□□■□□   ■がマウスポジション
□□□□□
□□□□□


これがすべて含まれていれば大丈夫ではないかと。
引用返信 編集キー/
■62892 / inTopicNo.5)  Re[4]: ユーザーコントロールでのMouseHover・Leave
□投稿者/ ベッキー (3回)-(2011/11/08(Tue) 12:52:18)
No62890 (shu さん) に返信
>>ところで5x5((-2,-2)-(+2,+2))とは何のことでしょうか?
> マウスポジションを中心とした上下左右2の範囲で幅と高さが5になるのでこう書きました。
> 
> 
> □□□□□
> □□□□□
> □□■□□   ■がマウスポジション
> □□□□□
> □□□□□
> 
> 
> これがすべて含まれていれば大丈夫ではないかと。

解説有難う御座いました。

これをヒントに、このコントロールのMouseHover・MouseLeaveに加え、MouseMoveイベントについて
以下の処理を呼び出すことでうまくいきました。
(MouseHoverイベント時、条件により、マウスポインタの位置が立体表示の位置でない場合があるので、
MouseMoveイベントにて再判断をしています。)

    Private Sub SetBorder()
        Dim rec As Rectangle
        Dim p As Point

        rec = Me.Bounds
        p = Me.Parent.PointToClient(System.Windows.Forms.Cursor.Position)

        If rec.Contains(New Rectangle(p.X - 2, p.Y - 2, 5, 5)) Then
            Me.BorderStyle = Windows.Forms.BorderStyle.Fixed3D
        Else
            Me.BorderStyle = Windows.Forms.BorderStyle.FixedSingle
        End If
    End Sub

ところで、マウスポインタの位置±2の領域で判断するのには何か理由があるのでしょうか?
確かに、試しにマウスポインタの位置±1の領域で判断した場合、ゆっくりとマウスを外すと、
元の枠線(フラット)には戻りませんでした。

引用返信 編集キー/
■62893 / inTopicNo.6)  Re[5]: ユーザーコントロールでのMouseHover・Leave
□投稿者/ shu (1078回)-(2011/11/08(Tue) 13:33:00)
No62892 (ベッキー さん) に返信

ClientRectangleを元にマウスイベントが発生するので
Boundsにふくまれるかでチェックするとboundsには含まれるがClientRectangleには
含まれない範囲でそのようなことが発生します。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -