ツリーオプションダイアログ

※開発環境は、Windows2000sp4/IE6sp1/VC++6.0sp6/ATL3.0/WTL7.0

TreeOptionDialog

Donutでも、タブコントロールを使用したプロパティシート型オプションを長らく使用していましたが、 オプション項目が増加し、手狭になってきてしまいました。

そこで、秀丸エディタなどで使用されているツリー型オプションダイアログを使いたいと思っていましたが、 codeprojectなどにあるサンプルコードの多くは、 MFC前提だったりして、流用できるものがありませんでした。

また、今までプロパティシートとして作成してきたものの移行が楽なものが欲しかったのですが、どうも簡単にはいかないようです。

そこで、WTLのプロパティシートのソースを参考に、自作してみました。


作成手順

とにかく、楽がしたかったので、リソースエディタでダイアログを作成し、ツリーコントロール IDC_TREE とグループボックス IDC_AREA をダイアログに貼り付けました。

グループボックスは不可視とし、作成した子ウィンドウをリサイズして IDC_AREA に合わせることにしました。

フレームワークとして、テンプレートによるスーパークラスを用意しました。

用意したテンプレートクラスを継承し、必要な部分のみサブクラスでオーバーライドすることによって、手間を削減しました。

また、フレームワーク上では、プロパティシートのメッセージIDを流用する事でメッセージIDで悩む必要がなくなりました。

リソースエディタで子ウィンドウを作成する際、ダイアログプロパティで特に留意する点は下記のとおりです。

詳細な実装については、テンプレートによるスーパークラスの定義を参照してください。
また、使用例としては、サブクラスの定義を参照してください。

なお、上記のサンプルコードは、現行のDonut Q16で使用しているコードの一部を本稿用に編集したものです。
今回のコードの理念としては、コード利用時に楽に使いたい! です。('-'*)フフ


補足

なお、ラジオチェックは、下記のようにすればGet/Setをまとめて記述できます。

#define EXCHANGE_RADIO_BEGIN( var_ ) \
        { \
            int& var = var_;
#define EXCHANGE_RADIO( value , dwFlag ) \
            if( bSaveAndValidate ){ \
                if( var == value ){ \
                    dwStyle |= dwFlag; \
                } \
            }else{ \
                if( ((dwStyle) & (dwFlag)) != 0 ) \
                { \
                    var = value; \
                } \
            }
#define EXCHANGE_RADIO_END() \
        }

// 使用例
EXCHANGE_RADIO_BEGIN( m_nRadio )
    EXCHANGE_RADIO( 1 , RADIO_EX_FLAG1 )
    EXCHANGE_RADIO( 2 , RADIO_EX_FLAG2 )
EXCHANGE_RADIO_END()

[HOME]-[RTL]
Copyright© 2004 RAPT.