none
CMFCPropertyGridCtrlをPropertyGridに置き換える RRS feed

  • 質問

  • Visual Studio 2008 Feature PackのApp Wizardで作成したPropertyウィンドゥはCMFCPropertyGridCtrlクラスで実装されていますが、これをマネージドのPropertyGridクラスに置き換えようとしています。CMFCPropertyGridCtrlクラスだと、SelectedObjectが使えないため、いちいち項目を追加しなければならないからです。

     

    ところがどうしてもPropertyGridのオブジェクトが表示できなくて困っています。下記のように試してみました。

     

    ① AppWizardが生成したCPropertiesWndクラスに、PropertyGridメンバーを定義。

     

    gcroot<PropertyGrid^> m_prop;

     

     

    ② CPropertiesWndクラスのOnCreate()でオブジェクトの生成と初期化。

     

     m_prop=gcnew PropertyGrid();
     m_prop->CommandsVisibleIfAvailable=true;
     m_prop->Dock = DockStyle:: Fill;
     m_prop->Location = System:: Drawing:: Point(0, 0);
     m_prop->Size = System:: Drawing:: Size(155, 520);
     m_prop->TabIndex = 0;
     m_prop->Show();
     m_prop->Visible=true;

    不要かもしれませんが、表示できないためあれこれ追加しました。

     

     

    ③ SelectedObjectにデータの参照をセット。CMainFrameクラスのm_wndPropertiesはpublicに変更済み。pDoc->m_csdocは、やはりマネージドクラスで、こちらは正常に値が入っていることはMessageBox()で表示して確認済み。

     

     pFrame->m_wndProperties.m_prop->SelectedObject=pDoc->m_csdoc;

     

    これが実現できると、データ構造はC#やVBで、画面はC++で記述ができるようになります。C++でデータC#でUIではなく、時代に逆行しているように思えますが、Feature PackのVisual Studio風やOffice 2007風のUIの美しさ、C#のXmlSerializerの簡単さの両方を使いたいというのがそもそもの動機です。

     

    一度SelectedObjectの快適さに慣れてしまうと、とてもCMFCPropertyGridPropertyのAddSubItem()をだらだらと書く気にはなれません。多くの方々が同じ事を実現したいと考えていると思います。

     

    よろしくご教授ください。

    2009年1月20日 0:21

回答

  • それだけだと、PropertyGridコントロールを作成しただけで、どこに表示するかを指定していませんよね?

    Windowsフォームアプリケーションのデザイナが生成するファイルを見ると分かりますが、コントロールのクラスのインスタンスを作成した後、コンテナとなるフォーム・コントロールのControlsプロパティにAddすることで、親子関係を設定します。

     

    今回のアプローチでは、どこに表示するかを指定する要素が抜け落ちていませんか?

     

    MFCではいくつかのWindows Formsをホストするためのクラスが用意されています。

    http://msdn.microsoft.com/ja-jp/library/ahdd1h97.aspx

    2009年1月20日 13:49
    モデレータ

すべての返信

  • それだけだと、PropertyGridコントロールを作成しただけで、どこに表示するかを指定していませんよね?

    Windowsフォームアプリケーションのデザイナが生成するファイルを見ると分かりますが、コントロールのクラスのインスタンスを作成した後、コンテナとなるフォーム・コントロールのControlsプロパティにAddすることで、親子関係を設定します。

     

    今回のアプローチでは、どこに表示するかを指定する要素が抜け落ちていませんか?

     

    MFCではいくつかのWindows Formsをホストするためのクラスが用意されています。

    http://msdn.microsoft.com/ja-jp/library/ahdd1h97.aspx

    2009年1月20日 13:49
    モデレータ
  • 返信ありがとうございます。CWinFormsControlとCreateManagedControl()を使って正常に動くようになりました。当初、親子関係については、親ウィンドゥがMFCなのでどうしていいか分からず、仕方がないので放置していました。

     

    これで想定していた通りに動くようにはなったのですが、動きがやや重いです。リリース版でコンパイルしても変わりませんでしたので、マネージ/アンマネージの切り替えのせいかもしれません。とりあえず重大な問題ではないので、このまま開発を続けることにします。

     

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

    2009年1月22日 7:51