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

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

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

トラックバーにスライダーを二つ付ける方法

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

■96370 / inTopicNo.1)  トラックバーにスライダーを二つ付ける方法
  
□投稿者/ 鮭 (8回)-(2020/11/17(Tue) 17:45:46)

分類:[.NET 全般] 


http://bbs.wankuma.com/index.cgi?mode=al2&namber=96227

このページにて、カスタムコントロールを使った
トラックバーに色を付ける方法を教えていただきました。

あと、デフォルトだとスライダーが一つだけですが
二つに増やしたいと考えているのですが
どのようにすれば良いですか?

自分でmousemoveやmousedownのところで
スライダー検出やマウスダウンした時の挙動を記述するしかないでしょうか?

もっと良い方法があればお教えください。




引用返信 編集キー/
■96372 / inTopicNo.2)  Re[1]: トラックバーにスライダーを二つ付ける方法
□投稿者/ 魔界の仮面弁士 (2914回)-(2020/11/17(Tue) 18:18:45)
No96370 (鮭 さん) に返信
> あと、デフォルトだとスライダーが一つだけですが
> 二つに増やしたいと考えているのですが
> どのようにすれば良いですか?

Public Class Foo
 Inherits UserControl
End Class

なユーザーコントロールを用意して、そこに TrackBar を 2 つ載せておくとか。
引用返信 編集キー/
■96373 / inTopicNo.3)  Re[2]: トラックバーにスライダーを二つ付ける方法
□投稿者/ 鮭 (9回)-(2020/11/17(Tue) 18:23:36)
No96372 (魔界の仮面弁士 さん) に返信

ありがとうございます。

もう少し詳しく記述の仕方をお教え願えないでしょうか?

引用返信 編集キー/
■96375 / inTopicNo.4)  Re[1]: トラックバーにスライダーを二つ付ける方法
□投稿者/ Azulean (1172回)-(2020/11/18(Wed) 06:48:34)
No96370 (鮭 さん) に返信
> あと、デフォルトだとスライダーが一つだけですが
> 二つに増やしたいと考えているのですが
> どのようにすれば良いですか?

普通には無理でしょう。


No96373 (鮭 さん) に返信
> もう少し詳しく記述の仕方をお教え願えないでしょうか?

魔界の仮面弁士さんからは「トラックバーコントロールを2つ並べたらどうか?」という提案がなされています。
コードを書くことで2つにできるわけではありませんので誤解されていないかが気になります。

2つ並べた状態を部品化するテクニックとして「ユーザーコントロール」が提案されています。
ユーザーコントロールの作り方一般論であれば、こちらのサイトで予習してみてください。
https://www.ipentec.com/document/csharp-create-user-control
引用返信 編集キー/
■96376 / inTopicNo.5)  Re[3]: トラックバーにスライダーを二つ付ける方法
□投稿者/ KOZ (153回)-(2020/11/18(Wed) 09:11:25)
2020/11/18(Wed) 09:11:46 編集(投稿者)
No96373 (鮭 さん) に返信
> もう少し詳しく記述の仕方をお教え願えないでしょうか?

簡単に済ませるなら

Public Class DualTrackBar
    Inherits UserControl

    Public Sub New()
        TrackBar1 = New TrackBarEx With {
            .AutoSize = False,
            .TickStyle = TickStyle.None,
            .Dock = DockStyle.Fill,
            .Visible = True
        }
        TrackBar2 = New TrackBarEx With {
            .Dock = DockStyle.Bottom,
            .Visible = True
        }
        Me.Controls.Add(TrackBar1)
        Me.Controls.Add(TrackBar2)
    End Sub

    Public ReadOnly Property TrackBar1 As TrackBarEx
    Public ReadOnly Property TrackBar2 As TrackBarEx

End Class

こんな感じですかね。

ところでトラックバーを複数備えたコントロールを作りたいのでしょうか?
前のトピックに貼られた画像のようにしたいということであれば、私なら、AutoSize = false/TickStyle = TickStyle.None にしたトラックバーを複数配置します。

引用返信 編集キー/
■96377 / inTopicNo.6)  Re[1]: トラックバーにスライダーを二つ付ける方法
□投稿者/ kiku (206回)-(2020/11/18(Wed) 09:57:56)
No96370 (鮭 さん) に返信
> あと、デフォルトだとスライダーが一つだけですが
> 二つに増やしたいと考えているのですが

この2つに増やすとのことですが、
これは単にトラックバーを2つ用意するということではなく、
別のことを言っているのではないかと想像しました。
漫画絵でも良いのでイメージを提示頂けないですか?
引用返信 編集キー/
■96378 / inTopicNo.7)  Re[2]: トラックバーにスライダーを二つ付ける方法
□投稿者/ 鮭 (10回)-(2020/11/18(Wed) 10:27:46)
ありがとうございます。

すいません、画像をアップすべきでした。

https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSZEOj4Na3wOrqeiiQ6Go16fju4V1cKu-b_RQ&usqp=CAU

こういうトラックバーを作りたいと考えています。

KOZさんや魔界の仮面弁士さんの方法を使うのなら
二つのトラックバーを重ね合わせるということで合っていますか?

KOZさんが提示してくださった方法で実現できるのでしょうか?


引用返信 編集キー/
■96379 / inTopicNo.8)  Re[3]: トラックバーにスライダーを二つ付ける方法
□投稿者/ KOZ (154回)-(2020/11/18(Wed) 11:16:20)
No96378 (鮭 さん) に返信
> すいません、画像をアップすべきでした。
> https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSZEOj4Na3wOrqeiiQ6Go16fju4V1cKu-b_RQ&usqp=CAU
> こういうトラックバーを作りたいと考えています。

まったく勘違いをしていました。

> KOZさんが提示してくださった方法で実現できるのでしょうか?

できません。
引用返信 編集キー/
■96380 / inTopicNo.9)  Re[3]: トラックバーにスライダーを二つ付ける方法
□投稿者/ kiku (207回)-(2020/11/18(Wed) 11:38:39)
No96378 (鮭 さん) に返信
> すいません、画像をアップすべきでした。
> https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSZEOj4Na3wOrqeiiQ6Go16fju4V1cKu-b_RQ&usqp=CAU

中身はまったく見てませんが、
CodeProject内に下記を見つけました。
他にもあるかはわかりません。
https://www.codeproject.com/Articles/28717/A-custom-range-selector-control-in-C-with-a-little
引用返信 編集キー/
■96381 / inTopicNo.10)  Re[3]: トラックバーにスライダーを二つ付ける方法
□投稿者/ 魔界の仮面弁士 (2915回)-(2020/11/18(Wed) 11:41:12)
No96378 (鮭 さん) に返信
> こういうトラックバーを作りたいと考えています。

Thumbs が 2 つあるだけでなく、上下で違う向きにあるのですね。

標準の TrackBar では仕組み的に対応できないので、
 案1) 重ね合わせは諦めて、最小値用 TrackBar と 最大値用 TrackBar の 2 つで構成する
 案2) 素の Control から継承するなどして、フルスクラッチで自作する
のいずれかの方法しか無いと思います――残念ながら。


既存の物が無いか探してみたのですが、ダウンロード可能な実装例として見つけたのは
下記ぐらいでした。(ただし C# 版な上に WPF 実装なのが難点)
http://www.thejoyofcode.com/Creating_a_Range_Slider_in_WPF_and_other_cool_tips_and_tricks_for_UserControls_.aspx


WinForms 用では有償製品しか見つけられませんでした。

ComponentOne 製品(GrapeCity 社) の C1RangeSlider コントロール
https://www.grapecity.com/componentone/docs/win/online-input/C1RangeSliderElements.html

NuGet で "Syncfusion.Tools.Windows" をインストールすると使える RangeSlider コントロール
https://help.syncfusion.com/windowsforms/range-slider/getting-started
引用返信 編集キー/
■96382 / inTopicNo.11)  Re[4]: トラックバーにスライダーを二つ付ける方法
□投稿者/ KOZ (155回)-(2020/11/18(Wed) 12:13:28)
TBM_SETRANGE をスタイルに適用することで、TBM_SETRANGE/TBM_SETRANGEMAX/TBM_SETRANGEMIN を使って範囲指定が出来るようです。

「About Trackbar Controls」
https://docs.microsoft.com/en-us/windows/win32/controls/trackbar-controls

TBS_NOTHUMB もスタイルに適用すればつまみが消えるので、あとは2つのつまみの操作と描画をなんとかすれば出来るかも。
引用返信 編集キー/
■96383 / inTopicNo.12)  Re[4]: トラックバーにスライダーを二つ付ける方法
□投稿者/ 鮭 (11回)-(2020/11/18(Wed) 13:28:34)
魔界の仮面弁士さん

> Thumbs が 2 つあるだけでなく、上下で違う向きにあるのですね。

Thumbsは上下で違う向きにある必要はありません。

>  案2) 素の Control から継承するなどして、フルスクラッチで自作する

フルスクラッチとはどういう意味でしょうか?


KOZさん

> TBS_NOTHUMB もスタイルに適用すればつまみが消えるので、あとは2つのつまみの操作と描画をなんとかすれば出来るかも。

これって結局はスライダーとカーソルのオーバーラップの検出やマウスダウンの処理も全部自分で書くことになるわけですよね?
それなら、最初からバーの描画も含めて、全部一から書くのと手間が変わらないような気がしますがいかがでしょうか?



引用返信 編集キー/
■96384 / inTopicNo.13)  Re[5]: トラックバーにスライダーを二つ付ける方法
□投稿者/ 魔界の仮面弁士 (2916回)-(2020/11/18(Wed) 14:10:00)
No96383 (鮭 さん) に返信
>>> 自分でmousemoveやmousedownのところで
>>> スライダー検出やマウスダウンした時の挙動を記述するしかないでしょうか?
>>> もっと良い方法があればお教えください。
>> 案2) 素の Control から継承するなどして、フルスクラッチで自作する
> フルスクラッチとはどういう意味でしょうか?

「『もっと良い方法』は無さそうです」という意味です。
http://e-words.jp/w/%E3%83%95%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%83%E3%83%81.html


既存の TrackBar には複数の Thumbs を管理する機能が無いため、
TrackBar を継承して作ることはできないと思います。

そのため、素の Control あるいは UserControl などを使って実装し、
マウスやキーボード操作に対する処理などについても、すべて自力実装で
記述する必要があると思います。


なお、KOZ さんが紹介されていた RangeSelectorControl コントロールの場合は、
UserControl の OnPaint メソッドをオーバーライドして実装されているようです。
多少の問題はありそうでしたが…。

・キーボード操作に対応していない
・例外をことごとく握りつぶしている
・UI スレッドからの Thread.Sleep の直接利用
・PaintEventArgs をフィールド変数に保持して、別のタイミングで使いまわしている
・e.Grapchis ではなく、CreateGraphics を用いているせいか、ちらつきが大きい
・Image.FromFile など、外部ファイルに追加依存している
・描画時に生成した Grapchis や Brush の Dispose 処理が全くない
引用返信 編集キー/
■96385 / inTopicNo.14)  Re[5]: トラックバーにスライダーを二つ付ける方法
□投稿者/ KOZ (156回)-(2020/11/18(Wed) 14:55:54)
No96383 (鮭 さん) に返信
> それなら、最初からバーの描画も含めて、全部一から書くのと手間が変わらないような気がしますがいかがでしょうか?

TBM_SETRANGE 等のしくみは利用できるわけですし、
0 から作るか、1から作るか、の違いはあると思います。

面倒なのは間違いないですけどね。
引用返信 編集キー/
■96386 / inTopicNo.15)  Re[6]: トラックバーにスライダーを二つ付ける方法
□投稿者/ KOZ (157回)-(2020/11/18(Wed) 15:33:21)
No96384 (魔界の仮面弁士 さん) に返信
> なお、KOZ さんが紹介されていた RangeSelectorControl コントロールの場合は、

No96380 かな?
私ではありません。(^_^;)



引用返信 編集キー/
■96387 / inTopicNo.16)  Re[7]: トラックバーにスライダーを二つ付ける方法
□投稿者/ kiku (208回)-(2020/11/18(Wed) 16:33:55)
No96386 (KOZ さん) に返信
> ■No96380 かな?
> 私ではありません。(^_^;)

下記のように、わたしが紹介したやつですね。
中身はまったく見ていないので、
エッセンスだけ抽出して、新規に作った方が良いと思います。

VS2005で開発したもののようです。
古いですね。

> 中身はまったく見てませんが、
> CodeProject内に下記を見つけました。
> 他にもあるかはわかりません。
> https://www.codeproject.com/Articles/28717/A-custom-range-selector-control-in-C-with-a-little

引用返信 編集キー/
■96388 / inTopicNo.17)  Re[8]: トラックバーにスライダーを二つ付ける方法
□投稿者/ 魔界の仮面弁士 (2917回)-(2020/11/18(Wed) 17:33:23)
No96386 (KOZ さん) に返信
> ■No96380 かな?
> 私ではありません。(^_^;)

No96387 (kiku さん) に返信
> 下記のように、わたしが紹介したやつですね。

あちゃ……ごめんなさい。
はい。 No96380 の kiku さんの投稿のことです。


MSDN Forum の過去ログでも、だいたい同じような回答が付いていました。
残念ですが、`銀の弾` は見つけられませんでした。
https://social.msdn.microsoft.com/Forums/vstudio/en-US/c28677a1-e176-4fc9-8b64-4c05c7710cc3/double-track-bar-is-it-possible?forum=csharpgeneral


slider や trackbar や range selector などのキーワードで探してみましたが、
WinForms 版よりも、WPF 版や Web 版の方が実装例が多そうですね。
つまみが 2 つ以上の物となると、さらにサンプルは少なく…。


別スレッドの No96240 で KOZ さんが紹介されていた VB 版(つまみは 1 つだけ)は、
コードが読みやすい割には見た目にも凝っていて、
マウスだけではなくキーボード操作にも対応しているなど、充実していますね。
(オートリピートは効かないようですが)
引用返信 編集キー/
■96413 / inTopicNo.18)  Re[6]: トラックバーにスライダーを二つ付ける方法
□投稿者/ 鮭 (12回)-(2020/11/21(Sat) 11:28:07)
ありがとうございます。

やはり地道に作っていくしかないのですね・・・

面倒ですが作るしかないですか・・・
解決済み
引用返信 編集キー/

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


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

このトピックに書きこむ