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

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

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

DateTimePickerでホイールを使う方法

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

■90110 / inTopicNo.1)  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よりも上に回してもそれ以上上がらないようにしたいのですが
どのようにしたら良いですか?




引用返信 編集キー/
■90118 / inTopicNo.2)  Re[1]: DateTimePickerでホイールを使う方法
□投稿者/ WebSurfer (1755回)-(2019/02/09(Sat) 23:38:54)
No90110 (やーまー さん) に返信

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

もし、DateTimePicker というのが .NET のライブラリに含まれるものでなく、サードパーティ製
とかであれば、何なのかも詳しく書いてください。
引用返信 編集キー/
■90119 / inTopicNo.3)  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 キー入力と制御できるとは思いますが…。
引用返信 編集キー/
■90125 / inTopicNo.4)  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して読み込ませようとしても
エラーが発生しました
と表示されてツールボックスから消滅してしまいます。

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


引用返信 編集キー/
■90126 / inTopicNo.5)  Re[3]: DateTimePickerでホイールを使う方法
□投稿者/ やーまー (4回)-(2019/02/11(Mon) 12:52:49)
単に一度ビルドしていないのが原因でした

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

引用返信 編集キー/
■90127 / inTopicNo.6)  Re[4]: DateTimePickerでホイールを使う方法
□投稿者/ Azulean (1030回)-(2019/02/11(Mon) 18:12:59)
前にも書きましたが、DateTimePicker は単純な構造ではありません。
ちょっと書き換えるだけで動作を変えられるものではないので、お望みの動作をしようとすると、かなりの部分を自作することになります。
(選択したときに色を変える動作も自分で作る必要がありますし、どの部分が選択されているかを自分で知る必要があるが、それは簡単にできそうにない)
引用返信 編集キー/
■90128 / inTopicNo.7)  Re[5]: DateTimePickerでホイールを使う方法
□投稿者/ やーまー (5回)-(2019/02/11(Mon) 19:48:07)
OnPaintで基本的な部分はDateTimePickerを継承しつつ
センタリングの部分だけ書き換えることってできないのでしょうか?

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

繰り返しになりますが、DateTimePicker コントロールは Win32 のコモンコントロールを使っているだけなので、OnPaint を横取りしても細かな制御はできません。
DateTimePicker の場合はすべて自分で描くか、任せるかの2択になりそうです。
引用返信 編集キー/
■90130 / inTopicNo.9)  Re[7]: DateTimePickerでホイールを使う方法
□投稿者/ やーまー (6回)-(2019/02/11(Mon) 21:23:22)
そうでしたか

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

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

このトピックをツリーで一括表示


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

このトピックに書きこむ