none
MFCアプリケーションでグリッドコントロールを使用したい RRS feed

  • 質問

  • いつもお世話になっております。arubi-momoと申します。

    開発環境はWindows7 64bit、VisualStudio2010 MFCを使用しています。

    現行のシステムでは、あるダイアログ画面でグリッドコントロールを使用しています。

    グリッドコントロールはかなり古い、GrapeCityのVS-FlexGrid pro 8.0J を使用しており、バージョンアップのたびにだましだまし継続してきた感じです。

    Windows10になるタイミングで、この辺のツールも一新しようということになりました。調べたところ、VS-FlexGrid pro の後継としてFlexGrid for Winformという製品があるようなのですが、.NETにしか対応しておらず、MFCでは使用できないことがわかりました。

    MFCで使用できるグリッドコントロールツールがないか調べてみたのですが、皆さんMFCユーザーは苦労されているようで、GUIだけ.NETにしたり、自作されたりで対応しているようでした。GUIだけ.NETにする方法は開発工数が膨らみすぎるため現実的ではなく、できれば何かのツールで代替して、グリッドコントロールを使用している画面だけを修正する形にしたいと考えております。

    今のところ自分で思いつくものは、ListCtrlをカスタマイズして、あたかも編集できるかのように動かすという方法なのですが、何か他に良い方法、良いツールをご存知の方がいらっしゃれば、ご教示いただきたく思います。

    何卒、よろしくお願いいたします。

    2017年9月12日 8:54

回答

  • 有償のサードパーティ製MFCライブラリはいくつかありますが、BCGSoftのBCGSuite for MFCもしくはBCGControlBar Pro for MFCにGridが含まれています。評価版とサポート環境についてはこちら

    BCGSoft | Samples

    そのほか、Rogue WaveのStingrayにもMFC向けGridがあります。最新版12.2のサポート環境はこちら。評価版のリクエストはこちら

    Stingray コンポーネントとデモ | ローグウェーブ

    上記に限らず、たぶんどの製品も試用版があると思うので、購入する前にアプリケーション実現のための機能やパフォーマンスが十分かどうか調べておいたほうがよいでしょう。海外製品はIMEのサポートが甘い部分があったりします。

    なお、ComponentOne Studio ActiveXの最新版では、64bit対応やWindows 10対応など、VSFlexGridのメンテも続けられているようです。英語版のみ?

    What's New in ComponentOne Studio ActiveX

    無償のオープンソースライブラリとしては、Ultimate Gridというのがあるようです。

    The Ultimate Grid Home Page - CodeProject

    ちなみに、C++/CLIを使って、特定のダイアログウィンドウだけWPF/WinForms化する方法もあります。MFCアプリケーションプロジェクトプロパティの/clrオプションを有効にすれば、C++/CLIが使えるようになります。ただし/clrを有効にすると、スタティックライブラリとリンクできなくなったりといった弊害も出ます。マネージコード(.NETを使う部分)をラップするネイティブC関数もしくはネイティブC++クラスを作成し、MFC標準DLLもしくはMFC拡張DLLにエクスポートすることで、ラッパーを使うアプリのEXE本体は/clrオプションを一切使わずにネイティブのまま維持することも可能です。あるいは、WPF/WinFormsによるUIライブラリのDLLをC#で作成し、COM参照可能に設定してCOMコンポーネント化(ActiveX化)したうえで、MFCネイティブアプリから呼び出すという方法もあります。デメリットとしては、.NETやDLL設計に関する深い知識が必要になること、.NETの初期化処理に時間がかかることが挙げられます。

    別のアプローチとしては、CHtmlViewもしくはCDHtmlDialogを使って、SlickGridのようなJavaScript/CSSで書かれたグリッドライブラリを利用する方法もあります。この方法のデメリットとしては、HTML/JavaScript/CSSのバックエンドとしてIEに依存すること、C++側とのやりとりが難しくなることが挙げられます。

    なお、もし無償のライブラリを使用する際は各ライセンス条項をしっかり読んでください。

    2017年9月12日 14:55

すべての返信

  • CoCreateInstance()が使えないということは、WinRT化してしまったということでしょうか。
    試したことがないので、話半分になってしまいますが、
    「C++/WinRT」というライブラリがGitに公開されてます(MS製)。
    これを使うことによりC++からWinRTを使用できるようです。
    あまり役に立たなくてすみません。
    2017年9月12日 10:01
  • こちらも少し古いのですが、Microsoft 製のグリッドコントロールとして Microsoft Hierarchical FlexGrid Control (MSHFLXGD.OCX) というものがあります。

    Visual Studio 2010 の C++ (MFC) からも利用が可能なので、検討してみてはいかがでしょうか?

    2017年9月12日 10:17
  • 有償のサードパーティ製MFCライブラリはいくつかありますが、BCGSoftのBCGSuite for MFCもしくはBCGControlBar Pro for MFCにGridが含まれています。評価版とサポート環境についてはこちら

    BCGSoft | Samples

    そのほか、Rogue WaveのStingrayにもMFC向けGridがあります。最新版12.2のサポート環境はこちら。評価版のリクエストはこちら

    Stingray コンポーネントとデモ | ローグウェーブ

    上記に限らず、たぶんどの製品も試用版があると思うので、購入する前にアプリケーション実現のための機能やパフォーマンスが十分かどうか調べておいたほうがよいでしょう。海外製品はIMEのサポートが甘い部分があったりします。

    なお、ComponentOne Studio ActiveXの最新版では、64bit対応やWindows 10対応など、VSFlexGridのメンテも続けられているようです。英語版のみ?

    What's New in ComponentOne Studio ActiveX

    無償のオープンソースライブラリとしては、Ultimate Gridというのがあるようです。

    The Ultimate Grid Home Page - CodeProject

    ちなみに、C++/CLIを使って、特定のダイアログウィンドウだけWPF/WinForms化する方法もあります。MFCアプリケーションプロジェクトプロパティの/clrオプションを有効にすれば、C++/CLIが使えるようになります。ただし/clrを有効にすると、スタティックライブラリとリンクできなくなったりといった弊害も出ます。マネージコード(.NETを使う部分)をラップするネイティブC関数もしくはネイティブC++クラスを作成し、MFC標準DLLもしくはMFC拡張DLLにエクスポートすることで、ラッパーを使うアプリのEXE本体は/clrオプションを一切使わずにネイティブのまま維持することも可能です。あるいは、WPF/WinFormsによるUIライブラリのDLLをC#で作成し、COM参照可能に設定してCOMコンポーネント化(ActiveX化)したうえで、MFCネイティブアプリから呼び出すという方法もあります。デメリットとしては、.NETやDLL設計に関する深い知識が必要になること、.NETの初期化処理に時間がかかることが挙げられます。

    別のアプローチとしては、CHtmlViewもしくはCDHtmlDialogを使って、SlickGridのようなJavaScript/CSSで書かれたグリッドライブラリを利用する方法もあります。この方法のデメリットとしては、HTML/JavaScript/CSSのバックエンドとしてIEに依存すること、C++側とのやりとりが難しくなることが挙げられます。

    なお、もし無償のライブラリを使用する際は各ライセンス条項をしっかり読んでください。

    2017年9月12日 14:55
  • グリッドコントロールはかなり古い、GrapeCityのVS-FlexGrid pro 8.0J を使用しており、バージョンアップのたびにだましだまし継続してきた感じです。
    Windows10になるタイミングで、この辺のツールも一新しようということになりました。

    今のところ自分で思いつくものは、ListCtrlをカスタマイズして、あたかも編集できるかのように動かすという方法なのですが

    無茶な実装をすると最初からだましだましになると思います。「ツールも一新」がどの程度本気なのかにもよりますが、適切なものが見つからない場合は既存のグリッドを継続させるのが無難かもしれません。

    C++言語ではSTLのstd::vectorやMFCのCArrayなど配列クラスがいろいろありますが、そうは言ってもSTLやMFCで実装されたグリッドコントロールが見つからない場合は更に別のクラスが使われることになり、配列一つとってもライブラリ間での詰め替え等の本質的でないコードばかりになってしまいます。この辺りもC#や.NETへの移行が進んでいる一因になっていると個人的には考えています。

    C++言語から離れられないとのことでしたら、例えばQtなど別のライブラリを選択肢に加えてみるのもありかもしれません。

    2017年9月12日 21:56
  • いつもお世話になっております。arubi-momoです。

    皆様、たくさんのご返信と情報をありがとうございます!

    Windows10、VS2010、MFCの環境でVS-FlexGridを含むソースがビルドできれば、今回はそのまま既存のグリッドを継続することにはなると思うのですが(環境を申請中で、まだ動作確認ができていない状態です)、今後VSもバージョンを上げる計画があることから、いずれはグリッドも更新しなければならないと思い、色々と調べていた次第です。

    syghさま。C++/CLIはMFCアプリケーションでは併用できないのだと思っていました。ご丁寧に説明くださりありがとうございます。.NETの初期化処理に時間がかかるというのは、初回起動時に.NETの読み込み時間がかかるということでしょうか。

    また、皆様にこんなにたくさんの方法をご教示いただき感謝とともに、自分で全く調べられていなかったのだと自覚しました。

    勉強不足で理解できていない部分が多々ありますが、まずはいただいたキーワードをもとに調べてみます!

    その上でわからないことが出てきたらまたこちらで質問させていただくかもしれません。

    よろしくお願いいたします。

    2017年9月13日 0:24