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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.94254 の関連記事表示

<< 0 >>
■94254  DateTimePickerでホイールを使う方法
□投稿者/ paison -(2020/03/27(Fri) 15:33:59)

    分類:[.NET 全般] 

    VB2015を使用しています。


    DateTimePickerでホイールを使いたいのですが
    どこかのサイトに書かれてあったように

    Private Sub DateTimePicker1_MouseWheel(sender As Object, e As MouseEventArgs)

    If CType(sender, DateTimePicker).Focused Then

    If e.Delta > 0 Then

    System.Windows.Forms.SendKeys.Send("{UP}")

    Else

    System.Windows.Forms.SendKeys.Send("{DOWN}")

    End If

    End If

    End Sub

    を使うと実現することができます。


    しかし、ビルドして実行する場合には良いのですが、
    デバッグモードで
    DateTimePicker2_ValueChanged

    の中のコードにブレイクポイントを付けた状態で起動すると
    ホイールを回した時に、プログラムとマウスカーソルがフリーズしてしまいます。
    マウスカーソルが動かせないので、PCの電源を切って強制終了するしか方法がなくなります。

    一体、どうすればこのような現象が出なくなりますでしょうか?

親記事 /過去ログ163より / 関連記事表示
削除チェック/

■94255  Re[1]: DateTimePickerでホイールを使う方法
□投稿者/ 魔界の仮面弁士 -(2020/03/27(Fri) 17:17:55)
    No94254 (paison さん) に返信
    > Private Sub DateTimePicker1_MouseWheel(sender As Object, e As MouseEventArgs)

    通常であれば、イベントハンドラは
     Private Sub DateTimePicker1_MouseWheel(sender As Object, e As MouseEventArgs) Handles DateTimePicker1.MouseWheel
    あるいは
     Private Sub DateTimePicker1_MouseWheel(sender As Object, e As MouseEventArgs) Handles DateTimePicker1.MouseWheel, DateTimePicker2.MouseWheel
    などの形式になっているはずです。
    AddHandler による動的割り当てを行っているのでしょうか?


    > の中のコードにブレイクポイントを付けた状態で起動すると
    > ホイールを回した時に、プログラムとマウスカーソルがフリーズしてしまいます。
    コードウィンドウで [F5] を押せば再開できるはずですが、
    フリーズする状況は再現できませんでした。


    > 一体、どうすればこのような現象が出なくなりますでしょうか?
    提示頂いた情報だけでは、再現テストを行えません。
    新規プロジェクトを作成し、現象を再現可能な最小限のコードを作って提示することはできますか?



    一応、SendKeys を使わないバージョンも置いておきます。
     
    Public Class DateTimePickerWithWheel
      Inherits DateTimePicker
      Protected Overrides Sub OnMouseWheel(e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseWheel(e)
        Dim msgU As Message
        Dim msgD As Message
        If e.Delta > 0 Then
          msgU = Message.Create(Handle, &H100, New IntPtr(Keys.Up), New IntPtr(&H1480001))
          msgD = Message.Create(Handle, &H101, New IntPtr(Keys.Up), New IntPtr(&HC1480001))
        Else
          msgU = Message.Create(Handle, &H100, New IntPtr(Keys.Down), New IntPtr(&H1500001))
          msgD = Message.Create(Handle, &H101, New IntPtr(Keys.Down), New IntPtr(&HC1500001))
        End If
        MyBase.WndProc(msgU)
        MyBase.WndProc(msgD)
      End Sub
    End Class


    既存のコントロールを継承コントロールに置き換えできない事情がある場合は、
    NativeWindow クラスで WndProc を捕らえて、WM_MOUSEWHEEL(&H020A) が飛んできた時に
    同じように WM_KEYUP(&H100) と WM_KEYDOWN(&H101) を投げつけることでも実装できそう。
記事No.94254 のレス /過去ログ163より / 関連記事表示
削除チェック/

■94257  Re[2]: DateTimePickerでホイールを使う方法
□投稿者/ paison -(2020/03/27(Fri) 21:04:03)
    ありがとうございます。
    >NativeWindow クラスで WndProc を捕らえて、WM_MOUSEWHEEL(&H020A) が飛んできた時に

    こちらの方法を試したいのですが、
    ホイールの回転方向を取得するにはどのようにしたら良いですか?
    検索してみたのですが
    どのコードを使えば良いか分かりませんでしたのでお教え願います。
記事No.94254 のレス /過去ログ163より / 関連記事表示
削除チェック/

■94259  Re[3]: DateTimePickerでホイールを使う方法
□投稿者/ 魔界の仮面弁士 -(2020/03/27(Fri) 21:55:49)
    No94257 (paison さん) に返信
    >>NativeWindow クラスで WndProc を捕らえて、WM_MOUSEWHEEL(&H020A) が飛んできた時に
    > ホイールの回転方向を取得するにはどのようにしたら良いですか?

    WPARAM の上位ワードが Delta 値らしいです。
    https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-mousewheel


    ということは、こんな感じかな。

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
      If m.Msg = WM_MOUSEWHEEL Then
        '上位ワードY: y座標
        '下位ワードX: x座標
        Dim lp As New Point(m.LParam.ToInt32())
        '上位ワードY: ホイール回数数 Delta
        '下位ワードX: 仮想キーのビットフラグ
        Dim wp As New Point(m.WParam.ToInt32())
        Dim e As MouseEventArgs = New HandledMouseEventArgs(MouseButtons.None, 0, lp.X, lp.Y, wp.Y)

        If e.Delta > 0 Then

        Else

        End If

      End If
      MyBase.WndProc(m)
    End Sub
記事No.94254 のレス /過去ログ163より / 関連記事表示
削除チェック/

■94258  Re[3]: DateTimePickerでホイールを使う方法
□投稿者/ paison -(2020/03/27(Fri) 21:35:02)
記事No.94254 のレス /過去ログ163より / 関連記事表示
削除チェック/

■94260  Re[4]: DateTimePickerでホイールを使う方法
□投稿者/ paison -(2020/03/27(Fri) 22:16:36)
    ありがとうございます。
    試してみたのですが
    Dim wp As New Point(m.WParam.ToInt32())

    のところで、Int32では表せない64ビット数が来ることがあり、
    そのときにエラーになります。
    ToInt64にするとNew Pointが使えなくなります
    どうすれば良いですか?
記事No.94254 のレス /過去ログ163より / 関連記事表示
削除チェック/

■94261  Re[5]: DateTimePickerでホイールを使う方法
□投稿者/ paison -(2020/03/27(Fri) 22:51:25)
    Microsoftのページを見ると
    GET_WHEEL_DELTA_WPARAM

    で変換しろ、と書かれてありますが
    GET_WHEEL_DELTA_WPARAMはどうやって宣言すれば良いか書かれてありません
    リンクを巡ってもAPIの宣言コードが書かれていないのですが
    どのようにすれば良いですか?
記事No.94254 のレス /過去ログ163より / 関連記事表示
削除チェック/

■94264  Re[6]: DateTimePickerでホイールを使う方法
□投稿者/ KOZ -(2020/03/27(Fri) 23:19:37)
記事No.94254 のレス /過去ログ163より / 関連記事表示
削除チェック/

■94262  Re[5]: DateTimePickerでホイールを使う方法
□投稿者/ KOZ -(2020/03/27(Fri) 22:58:26)
記事No.94254 のレス /過去ログ163より / 関連記事表示
削除チェック/

■94263  Re[6]: DateTimePickerでホイールを使う方法
□投稿者/ paison -(2020/03/27(Fri) 23:09:12)
    ありがとうございます。
    うまくいきました。
    フリーズする件に関してはもう少し調べてみます。
記事No.94254 のレス /過去ログ163より / 関連記事表示
削除チェック/

■94268  Re[7]: DateTimePickerでホイールを使う方法
□投稿者/ paison -(2020/03/28(Sat) 10:31:38)
    ありがとうございます。

    そこを見れば良かったんですね。

    ただ、気になるのは
    https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-mousewheel

    このページには
    Do not use the LOWORD or HIWORD macros to extract the x- and y- coordinates

    と書かれてあります。
    GET_WHEEL_DELTA_WPARAM
    を辿ると
    結局は、HIWORDを使うことになるのですが、
    これはどう解釈すれば良いですか・

    SignedHIWORDをご提示くださったのは
    どういう流れで見つけられたのでしょうか?


記事No.94254 のレス /過去ログ163より / 関連記事表示
削除チェック/

■94269  Re[8]: DateTimePickerでホイールを使う方法
□投稿者/ 魔界の仮面弁士 -(2020/03/28(Sat) 12:12:40)
    2020/03/28(Sat) 14:29:47 編集(投稿者)

    No94268 (paison さん) に返信
    > Do not use the LOWORD or HIWORD macros to extract the x- and y- coordinates
    > と書かれてあります。

    垂直ホイールの WM_MOUSEWHEEL だけでなく
    水平ホイールの WM_MOUSEHWHEEL でも同じようで。
    https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-mousehwheel


    > GET_WHEEL_DELTA_WPARAM
    > を辿ると
    > 結局は、HIWORDを使うことになるのですが、
    > これはどう解釈すれば良いですか・

    要するに、「Delta 値や X / Y 座標は符号付きの値として取得してくださいね」という意味です。
    『LOWORD and HIWORD treat the coordinates as unsigned quantities.』と書かれていますよね。


    GET_WHEEL_DELTA_WPARAM にて得られる値は SHORT 型。
    HIWORD / LOWORD / GET_KEYSTATE_WPARAM で得られるのは WORD 型。

    WORD 型は、System.UInt16 相当なので負数を扱えませんが、
    SHORT 型は、System.Int16 相当なので負数を扱えます。


    WPRAM 型は、Win16 が 16bit長、Win32 では 32bit長、Win64 では 64bit長で、
    LPARAM 型は、Win16/Win32 では 32bit長、Win64 では 64bit長という違いがありますが、
    .NET には 16bit 版が無いので、LPARAM/WPARAM 共に System.IntPtr とすることが多いですね。



    > SignedHIWORDをご提示くださったのは
    > どういう流れで見つけられたのでしょうか?
    例えば、System.Windows.Forms.Control の
    private void WmMouseWheel(ref Message m) のソースコードとか。

    https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/Control.cs,13546



記事No.94254 のレス /過去ログ163より / 関連記事表示
削除チェック/

■94272  Re[9]: DateTimePickerでホイールを使う方法
□投稿者/ KOZ -(2020/03/28(Sat) 13:37:13)
記事No.94254 のレス /過去ログ163より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -