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

わんくま同盟

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

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

ツリー一括表示

DateTimePickerでホイールを使う方法 /やーまー (19/02/09(Sat) 14:03) #90110
Re[1]: DateTimePickerでホイールを使う方法 /WebSurfer (19/02/09(Sat) 23:38) #90118
Re[1]: DateTimePickerでホイールを使う方法 /Azulean (19/02/10(Sun) 08:03) #90119
  └ Re[2]: DateTimePickerでホイールを使う方法 /やーまー (19/02/11(Mon) 12:22) #90125
    └ Re[3]: DateTimePickerでホイールを使う方法 /やーまー (19/02/11(Mon) 12:52) #90126
      └ Re[4]: DateTimePickerでホイールを使う方法 /Azulean (19/02/11(Mon) 18:12) #90127
        └ Re[5]: DateTimePickerでホイールを使う方法 /やーまー (19/02/11(Mon) 19:48) #90128
          └ Re[6]: DateTimePickerでホイールを使う方法 /Azulean (19/02/11(Mon) 21:06) #90129
            └ Re[7]: DateTimePickerでホイールを使う方法 /やーまー (19/02/11(Mon) 21:23) #90130 解決済み


親記事 / ▼[ 90118 ] ▼[ 90119 ]
■90110 / 親階層)  DateTimePickerでホイールを使う方法
□投稿者/ やーまー (1回)-(2019/02/09(Sat) 14:03:15)

分類:[.NET 全般] 

DateTimePickerでホイールを回すことで数値を変えられるようにしたいのですが

    Private Sub DateTimePicker1_MouseWheel(sender As Object, e As MouseEventArgs) Handles DateTimePicker1.MouseWheel

            If e.Delta > 0 Then

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

            Else

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

            End If

    End Sub

このコードでできるようになりました。

しかし、この方法だと
ゼロから更にホイールを下に回すと
23や59といった値になってしまいます。

これをゼロよりも下に回しても下がらず
23や59よりも上に回してもそれ以上上がらないようにしたいのですが
どのようにしたら良いですか?




[ □ Tree ] 返信 編集キー/

▲[ 90110 ] / 返信無し
■90118 / 1階層)  Re[1]: DateTimePickerでホイールを使う方法
□投稿者/ WebSurfer (1755回)-(2019/02/09(Sat) 23:38:54)
No90110 (やーまー さん) に返信

何を作っているか(Windows Forms? ASP.NET Web アプリ? その他?)と開発環境(OS, .NET,
Visual Studio のバージョンなど)を書いてください。

もし、DateTimePicker というのが .NET のライブラリに含まれるものでなく、サードパーティ製
とかであれば、何なのかも詳しく書いてください。
[ 親 90110 / □ Tree ] 返信 編集キー/

▲[ 90110 ] / ▼[ 90125 ]
■90119 / 1階層)  Re[1]: DateTimePickerでホイールを使う方法
□投稿者/ Azulean (1029回)-(2019/02/10(Sun) 08:03:16)
すでに動いているということと、「 System.Windows.Forms.SendKeys.Send」があるということなので、Windows Forms だと仮定しておきます。

No90110 (やーまー さん) に返信
> DateTimePickerでホイールを回すことで数値を変えられるようにしたいのですが
(略)
> これをゼロよりも下に回しても下がらず
> 23や59よりも上に回してもそれ以上上がらないようにしたいのですが
> どのようにしたら良いですか?

現状は、DateTimePicker コントロールの自身の上下キー操作の仕様に依存(委譲)したものになっています。
こういったケースで考えられる案としては以下のものがあります。

 1. 上下キーの動き自体を制御したい場合は DateTimePicker のコントロールを継承するか、メッセージのフックが必要になります。
 2. ホイール時のみ、その数値またぎを排除したいのなら、Value プロパティを見て、SendKey を呼ぶ・呼ばないを分ければ良いことになります。

ただし、実際には DateTimePicker コントロールが Windows のコモンコントロール(SysDateTimePick32)を .NET で使えるようにラップしたものであるため、細かな動きの制御は困難です。
また、OS によって DateTimePicker の動きも結構変わる事情もあります。
このため、細かなカスタマイズを目指すのは大変だと思います。
(カスタマイズを頑張るなら、全部自作するぐらいの勢いが必要かもしれない)


現状をベースに実現する方向で考えた場合、厳しいのはどの位置(時分秒など)が選択されているかを知る方法です。
ざっと以下のページも読み直してみましたが、公開されていなさそうでした。
https://docs.microsoft.com/en-us/windows/desktop/controls/date-and-time-picker-control-reference

これがわかるのなら、現在値とホイールの方向から無視 or キー入力と制御できるとは思いますが…。
[ 親 90110 / □ Tree ] 返信 編集キー/

▲[ 90119 ] / ▼[ 90126 ]
■90125 / 2階層)  Re[2]: DateTimePickerでホイールを使う方法
□投稿者/ やーまー (3回)-(2019/02/11(Mon) 12:22:24)
ありがとうございます。

これはできないのですね。

あと、数値を中央揃えしたいとも考えています。

https://stackoverflow.com/questions/46675204/is-it-possible-to-center-the-text-of-datetimepicker

ここにC#のコードが掲載されていて、
これを以下のようにVBにかきかえてみました。

Public Class CenteredDateTimePicker
    Inherits DateTimePicker

    Public Sub New()
        MyBase.New
        SetStyle(ControlStyles.UserPaint, True)
    End Sub

    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
        e.Graphics.DrawString(Text, Font, New SolidBrush(ForeColor), ClientRectangle, New StringFormat() With {.Alignment = StringAlignment.Center, .LineAlignment = StringAlignment.Center})
    End Sub
End Class

しかし、ツールボックスからフォームにD&Dして読み込ませようとしても
エラーが発生しました
と表示されてツールボックスから消滅してしまいます。

一体どのようにすれば良いですか?


[ 親 90110 / □ Tree ] 返信 編集キー/

▲[ 90125 ] / ▼[ 90127 ]
■90126 / 3階層)  Re[3]: DateTimePickerでホイールを使う方法
□投稿者/ やーまー (4回)-(2019/02/11(Mon) 12:52:49)
単に一度ビルドしていないのが原因でした

表示はできたのですが
黒枠が表示されない上に
数値を選択しても青色にならず
数値が動かないのですが
これは一体どうすれば良いですか?

[ 親 90110 / □ Tree ] 返信 編集キー/

▲[ 90126 ] / ▼[ 90128 ]
■90127 / 4階層)  Re[4]: DateTimePickerでホイールを使う方法
□投稿者/ Azulean (1030回)-(2019/02/11(Mon) 18:12:59)
前にも書きましたが、DateTimePicker は単純な構造ではありません。
ちょっと書き換えるだけで動作を変えられるものではないので、お望みの動作をしようとすると、かなりの部分を自作することになります。
(選択したときに色を変える動作も自分で作る必要がありますし、どの部分が選択されているかを自分で知る必要があるが、それは簡単にできそうにない)
[ 親 90110 / □ Tree ] 返信 編集キー/

▲[ 90127 ] / ▼[ 90129 ]
■90128 / 5階層)  Re[5]: DateTimePickerでホイールを使う方法
□投稿者/ やーまー (5回)-(2019/02/11(Mon) 19:48:07)
OnPaintで基本的な部分はDateTimePickerを継承しつつ
センタリングの部分だけ書き換えることってできないのでしょうか?

[ 親 90110 / □ Tree ] 返信 編集キー/

▲[ 90128 ] / ▼[ 90130 ]
■90129 / 6階層)  Re[6]: DateTimePickerでホイールを使う方法
□投稿者/ Azulean (1031回)-(2019/02/11(Mon) 21:06:41)
No90128 (やーまー さん) に返信
> OnPaintで基本的な部分はDateTimePickerを継承しつつ
> センタリングの部分だけ書き換えることってできないのでしょうか?

繰り返しになりますが、DateTimePicker コントロールは Win32 のコモンコントロールを使っているだけなので、OnPaint を横取りしても細かな制御はできません。
DateTimePicker の場合はすべて自分で描くか、任せるかの2択になりそうです。
[ 親 90110 / □ Tree ] 返信 編集キー/

▲[ 90129 ] / 返信無し
■90130 / 7階層)  Re[7]: DateTimePickerでホイールを使う方法
□投稿者/ やーまー (6回)-(2019/02/11(Mon) 21:23:22)
そうでしたか

どうもありがとうございました。

解決済み
[ 親 90110 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -