none
VC++ 2008のWindowsフォームアプリケーションでトラックバーのスタイル変更の方法を教えて下さい RRS feed

  • 質問

  • VC++ 2008で、Windowsフォームアプリケーションに配置したトラックバーのスタイルを

    選択領域を持つスタイルに変更したいのですが、方法が解りません。

    どなたか教えて頂けないでしょうか。

    スタイルに、TBS_ENABLESELRANGEを設定すれば出来そうだというところまでは調べたのですが

    その後が解りませんでした。

    また、選択範囲(開始/終了)の設定・参照方法も教えて頂けると助かります。

     

    宜しくお願い致します。


    tomohiro nishikiori
    2011年8月30日 9:46

回答

  • Azuleanさんと同意見です。

    TBS_ENABLESELRANGEなトラックバーって今まで見たことないんですが、そんなに「not 特殊なパーツ」なんでしょうか。このアプリのここで使われている、とかの具体例ってどこかにありますか?

    一応、手段としてはTrackBar.CreateParamsプロパティをオーバーライドすればできますが…。

    • 回答としてマーク もんきー 2011年9月2日 1:25
    2011年9月2日 0:09

すべての返信

  • .NET Framework の Windows Forms の TrackBar コントロールを利用していて、それに対してスタイルを無理矢理設定しようという話でしょうか?
    素直に自分で TrackBar を作り直すべきだと考えます。

    理由は、既存の TrackBar コントロールはそのスタイルを考慮していないと考えられ、無理にスタイルを付与して値の取得・設定が SendMessage ベースになること、コントロールが想定していない状態になることで障害が発生する可能性があることが挙げられます。

    C++ 界隈でその手法が紹介されているのは、Windows Forms ではないはずです。
    MFC やダイアログベースアプリケーションとして構築されるのであれば、それも一手でしょう。
    またはそれを実現しているサードパーティーのコントロールを買ってくるのも手ですね。(あるかどうかは不明)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年8月30日 13:52
    モデレータ
  • 回答ありがとうございました、お礼が遅くなり申し訳ありません。

     

    スタイルを設定して、選択範囲のあるトラックバーを作成する情報を見つけたのが

    MFCベースの情報で、確かにSendMessageベースで値の設定・参照を行っていたこと、

    Visual Studioのフォームのデザインでどんなに探してもそれらしいプロパティ等が見つからないので

    自前ですべて作り直しを行わなければだめかもしれないとは思っていたのですが・・・

    「それほど【特殊】なパーツではないのではないか」という思いもあり質問しました。

     

    同一フォーム上で「microsoft chart controls」も使用していたので出来ればMFCは使用したくなかったのですが

    他の手段(MFCでトラックバーを作成)を検討してみます。

     


    tomohiro nishikiori
    2011年9月1日 1:03
  • 「それほど【特殊】なパーツではないのではないか」という思いもあり質問しました。

    昔は見かけましたが、最近はあまりみませんね。
    見栄えもかっこよくないですし、忘れられたコントロールスタイルのようなイメージを持っています。(私見)

    同一フォーム上で「microsoft chart controls」も使用していたので出来ればMFCは使用したくなかったのですが
    他の手段(MFCでトラックバーを作成)を検討してみます。

    MFC でトラックバー拡張コントロールを作ってラップして、Windows Forms で使うとか。
    (手間はかかりますけれど)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年9月1日 14:37
    モデレータ
  • Azuleanさんと同意見です。

    TBS_ENABLESELRANGEなトラックバーって今まで見たことないんですが、そんなに「not 特殊なパーツ」なんでしょうか。このアプリのここで使われている、とかの具体例ってどこかにありますか?

    一応、手段としてはTrackBar.CreateParamsプロパティをオーバーライドすればできますが…。

    • 回答としてマーク もんきー 2011年9月2日 1:25
    2011年9月2日 0:09
  • >TBS_ENABLESELRANGEなトラックバーって今まで見たことないんですが、そんなに「not 特殊なパーツ」なんでしょうか。このアプリのここで使われている、とかの具体例ってどこかにありますか?

    Aviutl.exeのトラックバーがTBS_ENABLESELRANGEを使用しています。

    ちょうどそのようなコントロールが行いたかったので、「こんなことできないかな」と探していたらTBS_ENABLESELRANGEを見つけました。

    通常のトラックバーで「SetRange」を使用して、オペレーションでカバーしようかとも思ったのですが、一度指定すると全体が見えなくなること、

    範囲設定をリセットする為のボタンの追加も必要だったので、格好が悪くてもトラックバー単体で何とかできないか試していました。

    Aviutlは、たまに仕事の雑用で使うこともあるツールだったので「特殊ではない」と思っていましたが、

    言われてみれば確かに他で見たような記憶もないですね・・・(苦笑)。

     

    >一応、手段としてはTrackBar.CreateParamsプロパティをオーバーライドすればできますが…。

    ありがとうございました、こちらの方法を試してみることにします。

     


    tomohiro nishikiori
    2011年9月2日 1:36
  • MFC でトラックバー拡張コントロールを作ってラップして、Windows Forms で使うとか。
    (手間はかかりますけれど)

    一応、途中まで作ってはみたのですが、挫折してしまいました・・・

    ちょうどそのような事をやっている方のページを見つけたこともありましたが。

    手間がかかる割に、他で使うようなアテもなかったので、無駄になると判断したのもあります。


    tomohiro nishikiori
    2011年9月2日 1:47
  • >一応、手段としてはTrackBar.CreateParamsプロパティをオーバーライドすればできますが…。
    ありがとうございました、こちらの方法を試してみることにします。

    先の投稿にも書きましたが、TrackBar クラス自体が想定していない状況になります。
    今の時点でうまく動かないコードがあったり、将来の .NET Framework で実装が増えて動かなくなったりする可能性があることも覚えておいてください。
    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年9月2日 15:32
    モデレータ
  • Aviutlですか、懐かしい…。

    Windowsユーザー エクスペリエンス ガイドラインというものがあります。MicrosoftがVista / 7の設計に当たって定めた指針であり、アプリケーション開発者もこの指針に従うことで、「ユーザーが混乱なしに効率的に操作できるようにする」ことを目的としています。

    この中には当然、スライダーの項もありますが、

    • その設定が相対量のように見えるかどうか。
    • その設定が既知の正確な数値かどうか。
    • 設定変更の効果についてのフィードバックをすぐに得られることがユーザーの役に立つかどうか。

    が挙げられています。範囲を指定するという行為は、数値を扱っているでしょうしフィードバックがすぐに得られないはずですから、スライダーを使用するのは不適切ということになります。

    参考までにどうぞ。

    2011年9月2日 16:18
  • 先の投稿にも書きましたが、TrackBar クラス自体が想定していない状況になります。
    今の時点でうまく動かないコードがあったり、将来の .NET Framework で実装が増えて動かなくなったりする可能性があることも覚えておいてください。

    Windowsのアプリケーションは、色々と考慮しなければならないことが多くて大変ですね。

    今までずっと組み込みのシステム開発をメインに行ってきたので、大変勉強になりました。

    やはり、今ある部品をそのまま使用して操作手順が煩雑にならないようUIを整理するのが一番みたいですね。

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


    tomohiro nishikiori
    2011年9月5日 1:17
  • この中には当然、スライダーの項もありますが、

    • その設定が相対量のように見えるかどうか。
    • その設定が既知の正確な数値かどうか。
    • 設定変更の効果についてのフィードバックをすぐに得られることがユーザーの役に立つかどうか。

    が挙げられています。範囲を指定するという行為は、数値を扱っているでしょうしフィードバックがすぐに得られないはずですから、スライダーを使用するのは不適切ということになります。

    参考までにどうぞ。

    ありがとうございます。

    Azuleanさんへの回答にも書きましたが、通常のトラックバーとボタンを複数組み合わせて

    UIを整理することにします。

    今回行っているのが、

    人体(下肢)に装着した複数の慣性センサ(加速度・角速度)の計測データから、

    1. 人体の簡易モデルを3次元データのアニメーションとして任意の視点でチェック
    2. 計測データの時間的な変化をグラフとして表示

    した上で

    • 全体あるいは選択範囲(A点→B点間)のデータをリピート再生
    • グラフ上でクリック、あるいはトラックバーで移動した先の時間位置データで3次元データを更新

    だったので、「選択部分」がどこからどこまでなのかを「視覚的」にユーザーに知らせたかったためです。

    トラックバーのMinimunをサンプルの先頭データ(0)、Maximunをサンプルの末尾データとし

    SetRange()で選択範囲の最小値から最大値の範囲が全体のどの部分かを明示したかったのですが、

    SetRange()やmaximun/minimunを変更した途端、トラックバーの可動範囲全体が【選択範囲】

    になってしまうので【全体】と【選択範囲】が見えなくなってしまい困ってしまいました。

    範囲を別の変数に持ち、コントロールすれば、【全体】は見えますが、【選択範囲】が見えません。

    その時、Aviutlで範囲指定に使用していたバーを思い出したという経緯があります。

     

    長文、申し訳ありませんでした。


    tomohiro nishikiori
    2011年9月5日 2:08