MFC   VC++   Visual Studio   Visual Studio   プログラミング

CMFCPropertyGridCtrl上の値取得

 CMFCPropertyGridCtrlを使い、コントロール上の各設定値などを取得する方法を紹介します。

 値を取得するタイミングはいくつかあるのですが、今回は、設定値が変更された直後ではなく、変更が完全に確定したタイミングについて書いていきたいと思います。
 ここで、変更が完全に確定したタイミングとは、例えば、「True/False」を設定する場合、ドロップダウンリストから選択してすぐではなく、設定し終えて他のコントロールや項目へフォーカスが移動したときのことです。
 VisualStudioを使っているとわかると思うのですが、プロパティの変更が適用されるときと同じタイミングです。

 方法は、「CMFCPropertyGridCtrl」を派生させたクラス(ここではCMyProperty)を作り、そこで仮想関数「ValidateItemData」を処理していきます。
 まずヘッダファイルに、
    virtual BOOL ValidateItemData(CMFCPropertyGridProperty* pProp);
と宣言し、cppファイル内で以下のように書きます。
BOOL CMyProperty::ValidateItemData(CMFCPropertyGridProperty* pProp)
{
    if(pProp)
    {
        CString str = pProp->GetName();        // 設定項目名を取得
        if(str == _T("数値設定"))
        {
            int iNum = (_variant_t)pProp->GetValue();
        }
        else if(str == _T("テキスト設定"))
        {
pProp->OnUpdateValue();
            CString strTxt = pProp->FormatProperty();
        }
        else if(str == _T("BOOL値設定"))
        {
            bool bT = (_variant_t)pProp->GetValue();
        }
    }

    return CMFCPropertyGridCtrl::ValidateItemData(pProp);
}
 ここで少し説明すると、基本的に値は「GetValue」で取得し「_variant_t」にキャストすれば、後は「_variant_t」が自動で色々な型に変換してくれます。
 テキストで取得したい場合は「FormatProperty」を使えば、数値設定だろうがドロップダウンリストだろうが、表示されているテキストが取得できます。
 ※注: この記事にコメントをいただき、テキスト取得時の部分を修正しました。
     今までの方法だと、直接入力のとき値が更新されず、正しい値が取得できませんでした。
     そこで、値取得前に「pProp->OnUpdateValue();」を呼ぶ事により、きちんと値が取得できるようになります。
     修正部分は赤字になっています。


 この他に「CMFCPropertyGridCtrl」では、色設定やフォント設定などが出来ますが、基本的にどれもやり方は同じで、設定項目名で処理を切り替え、そこで「pProp」を使って値を取得していきます。
ランキングへ     posted by 遠雷 | Comment(2) | コントロール
この記事へのコメント
ドロップダウンやスピンボタンの値は上記ので更新された値が取れるけど、テキストを手で編集した変更内容は、pProp->OnUpdateValue();しておかないと、うまく更新されません。
http://groups.google.com/group/microsoft.public.vc.mfc/browse_thread/thread/0c362538183aac62?hl=en
Posted by pc_jisakker at 2009年09月15日 19:11
pc_jisakker様
コメントありがとうございます。

ご指摘の通り、値を取得する前に「pProp->OnUpdateValue();」をしておかないと、更新された値が取得できませんね。
早速、修正と注意書きを追加しておきました。

また何かあればよろしくお願いします。
Posted by 遠雷 at 2009年09月15日 21:03
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。