C++/CLIとMFCでのMDI作成方法について

このQ&Aのポイント
  • C++/CLIとMFCを使用してMDIを作成する方法について教えてください。
  • C++/CLIでMDIを作成する場合、IsMdiContainerプロパティとMdiParentプロパティを設定する必要があります。
  • MFCで作成した子ウィンドウをC++/CLIの親Formにプラグインさせることは可能でしょうか?
回答を見る
  • ベストアンサー

C++/CLIとMFC

よろしくお願いします。 環境はVisual C++ 2005です。 ご存知の方がいらっしゃいましたらご教授ください。 一つのプロジェクトで作成した親Formに対して、 もう一つのプロジェクトで作成した子ウィンドウをプラグインさせ、MDIを作ろうとしているのですが [CLR]->[Windowsフォームアプリケーション]で作成したプロジェクトのFormに対して MFCで作成した子ウィンドウをプラグインさせることは可能なのでしょうか? C++/CLIでMDIを作る時は MDIの親となるFormのIsMdiContainerプロパティをtrueに設定し、 MDIの子となるFormのMdiParentプロパティをMDIの親Formの インスタンスに設定する必要があると思うのですが、 子の部分をMFCを使って作成した場合どのようにすれば 親子関係が作れるのかわからず質問させていただきました。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

無理でしょうね … MFC周りの初期化をする部分を全て作りこまないといけないようですよ 子ウィンドウのハンドルと親ウィンドウのハンドルを使って WinAPIのSetParentを呼んでやれば 親子関係は構築できいる思います SetParent( MFCWnd->m_hWnd, (HWND)oForm->Handle.ToPointer() ); といった具合ですが … CLRプロジェクトに MFCウィンドウのCPP/Hを追加して実験してみましたが MFCの初期化関数を作りこんでいないので コンパイル・リンクは通りましたが 実行すると CLRのApplicationクラスまで来る前にエラーになってしまいました

gogoee
質問者

お礼

実験までしていただきありがとうございます。 やはり難しいのですね(私も実行時にApplicationクラスに来る前にエラーが出ている状態なので)。 ご教授いただきありがとうございました。

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

土台がぜんぜん違うものですから無理でしょうね 可能性の話をするならば MFCのレギュラーDLLに子ウィンドウを作成してエクスポートしておいてって方向かな これでも面倒だと思いますよ MFC側から親を探すのは CWnd経由だし CLR側から子ウインドウはForm^でしょうし … どちらかに統一しないと面倒この上ないでしょう リソースの管理にしても然りですよね … 同一リソースを DLL,EXE双方に持たなくてはいけなくなるし ・・・

gogoee
質問者

お礼

お礼が遅くなってしまい大変申し訳ありません。 どうにか出来ないものかと色々と・・・。 お教えいただきありがとうございました。 そうですよね。仰る通り土台が違いますものね。 これで閉めさせていただきます。 ありがとうございました。

関連するQ&A

  • 【VC++】MFC、C++/CLI(CLR)、C#の違い、及び、これからの展望

    いつも大変お世話になっています。 VC++初心者です。 VC++6.0(MFC)、VC++2005(CLR)(C++/CLI)(Express Edition)を 同時期に使い始めて何ヶ月か経ちました。 現在では、CLIの方が圧倒的に開発スピードが早く(扱いやすい)、 逆に、MFCの開発スピードが遅く(扱いにくい)、イライラしっぱなしです。 (CLIの開発では、WEBにあるC#のコードを参考にしながら、  コーディングしています。) そこで、何点か疑問に思ったので、ご回答頂けませんでしょうか。 (1)CLIとC#を区別した理由は何なのでしょうか。 (2)MFCはこれからも使われるのでしょうか。  (MFCで新規開発をすることは、まだまだ大勢なのでしょうか。) (3)VC++2005以降、MFCは有償らしいのですが、  VC++6.0(MFC)とVC++2005(MFC)は何か変わったのでしょうか。  (コーディングしやすくなっていますか?) (4)個人差はあると思いますが、開発スピードが一番早いのは、  CLR、C#、MFCのどれでしょうか。   すぐに返信ができないと思いますが、 宜しければ、ご回答頂けると幸いです。

  • C++/CLIのDLLをC#で使う

    C++/CLIのDLLをC#で使う ソリューションの中にC++/CLIでクラスを作成し、出力がDLLのプロジェクトと、 C#でGUI画面の処理のプロジェクトがあります。 このときC#側でC++/CLI側で作ったDLLを使用したいのですが、やり方がわかりません。 DLL自体はC#のDebugフォルダに入っており、参照設定で読み込んでいます。 ご教授のほど、よろしくお願いいたします。

  • C++/CLIについて

    現在C、C++を1部、WIN32を習得しているのですが、ウィンドウアプリケーションを作るときは全てWIN32APIを使用して作っています データベースを使ってみようと思い、VS2005(Pro)についていたSQLEEを使ってみようと色々と調べたんですが、ほとんどの書籍やサイトがVBかC#を使用していました しかし、VBやC#でプログラムを書き直すのも大変なのでどうしようかと思っていたらC++/CLIなるものの存在を知りました そこでC++/CLIの勉強をしてDBを使おうと思ったのですが、何分習得言語以外の知識が足りないため不安なところを質問させてください 以下質問 1、VB、C#、C++/CLIとC+WIN32の大きな違いは.NETFrameWorkが使えるか使えないかということであっていますか? 2、多くの書籍がVBやC#とDBを組み合わせているのは、.NETに含まれるADO.NETを使用するからですか? 3、C/C++を習得するとMFCを習得するのが一般的なようですが、MFCのメリットがイマイチわからないので教えてください(WIN32で十分代用可能なため) 4、C++/CLIを習得すればMFCは必要ありませんよね? 以上質問の数が多いですがよろしくお願いします

  • MDIで、子フォームのみWPF

    winformで作ったアプリケーションに、MDIの導入を考えています。と同時にWPFにも興味があるのですが、MDIで作られる子フォームのみWPFにすることは可能でしょうか? 親winform⇒子winformの場合 //Form4はwindowsform Form4 childform = new Form4(); childform.MdiParent = this; childform.Show(); このように書いています。 それを 親winform⇒子WPFで //UserControl1はユーザーコントロールWPF UserControl1 childform = new UserControl1(); childform.MdiParent = this; childform.Show(); このように書いてみたのですが、エラーで使えませんでした。 MdiParentとShowに赤い線が引かれ、 自動機能で MdiParentには public Form1 MdiParent { get; set; } Showには internal void Show(){ throw new NotImplementedException(); } が、作られましたが解決には至りませんでした。 環境はvisualstdio2013でC#です。 そもそも子formのみWPFは可能なのでしょうか? 可能であれば、方法を教えてください。

  • C++/CLIにてForm1の要素に外部から

    C++/CLIにてForm1の要素に外部の関数からアクセスしたいです。 Windows7、Visual Studio2010にてC++/CLIで 簡単なフォームアプリケーションを作成しています。 仮に新規作成し、とりあえずテキストボックスを貼りつけたとします。 この際「Form1.h」が自動的に作成され、Form1クラスの中に textBox1などの要素が自動的に作成されるかと思います。 Form1クラスのメソッドの中からそれにアクセスするには this->textBox1->Text = L"変更"; みたいにするだけで良いですが、 こうしたForm1クラスの要素に対し、 Form1.h以外の場所にある外部の自作の関数から アクセスを行うにはどのようにすれば良いのでしょうか。

  • C#,C++/CLI,MFCにおけるデータ型の対応と、メソッドへの渡し方

    現在、Visual Studio 2005の、Visual C#、C++/CLI、MFCを使ったシステムを構築しています。 具体的には、MFCで書かれたライブラリ(DLL)をC++/CLIでラップし、C#から呼び出して使うというものです。 現在は、http://www.atmarkit.co.jp/fdotnet/special/vcppinvista02/vcppinvista02_04.html http://msdn2.microsoft.com/ja-jp/library/ac7ay120(VS.80).aspx これらのサイトを参考にしながら、一部のMFCで書かれたメソッドを、C#から呼び出すことに成功しました。しかし、int型やHANDLE型などの、上記サイトに記述されているデータ型を用いたメソッドのラッピングや呼び出しはできたのですが、HDCやLPRECTなどの特殊な型の場合のやり方がよく分かりません。 具体的に現在分からないのは、次の通りです。 HDC(デバイスコンテキスト)、HWND(ウィンドウのハンドル)、CIRCLE,RECT等の構造体、LPRECTなどの構造体のアドレス、POINT*などの構造体のポインタ これらが、C#やCLIでどのような型になるのか、メソッドに渡す時にどのように記述するのかが分かりません。 以上、どなたか分かる方いらっしゃいましたら、ご回答をお願いします。

  • C++/CLIでfstream(.NET 3.5)

    過去の資産にアクセスするためにC#から使うクラスライブラリをC++/CLIで作成しています。 当初は.NET Framework 4.5で作成していたのですが、Windows7でFrameworkを追加するのが面倒くさいという事で、3.5でプロジェクトを起こし直してコンパイルしました。 そうしたところ、大量のリンクエラーが発生しました。 --抜粋(下記を含め、合計18行のエラー) VCMRTD.lib(locale0_implib.obj) : error LNK2034: metadata は、COFF シンボル テーブルと整合しません: LINK : error LNK2034: metadata は、COFF シンボル テーブルと整合しません MSVCMRTD.lib(locale0_implib.obj) : error LNK2020: 未解決のトークン (0A0000A1) "extern "C" double __cdecl _hypot(double,double)" (?_hypot@@$$J0YANNN@Z) -- 調査した結果、fstream関連を定義するとこの症状が出る事がわかりました。 そこで、単純に以下のプロジェクトを作成したところ、同じ現象が発生しました。 1..NET Framework 3.5でCLRクラスライブラリのプロジェクトを作成する(ここではTESTプロジェクト) 2.作成されたテンプレートの「TEST.h」に関数を追加する -----(TEST.h) // TEST.h #pragma once #include <fstream> using namespace System; namespace TEST { public ref class Class1 { void test() { std::fstream f; } }; } ---- 3.コンパイル → リンクエラー 標準関数はいくつか使っているのですが、fstream系だけがダメなようです。 (sstreamはOKでした) これに関して、何か対策方法はないものでしょうか。 情報があればお教え下さい。 よろしくお願いいたします。 開発環境: Windows 8.1 VisualStudio 2013 Pro

  • C# ですみませんが ClientRectangl

    MDI の子フォームでClientRectangleの値が変わります。 MDI全画面表示でPictureBoxを画面サイズに合わせて描画しようとしています。 サイズが計算されたものと違う、Locationも 親 frm = new Form2(); frm.MdiParent = this; frm.Size = new Size(mc.ClientRectangle.Right, mc.ClientRectangle.Bottom); Right=1161 Bottom=652 子 Form2_Load内でのClientRectangle Right=1128 Bottom=614 実際のPictureBoxをクリックイベントで捕まえる Right=1144 Bottom=652 どうしてこうなるのでしょうか?

  • MFC MDIでステータスバーの追加。

    Vd++6.0 MFC。 MDIにてプログラムを作成しているのですが、 親ウィンドウにはステータスバーがついているのですが、 子ウィンドウにはついていません。 子ウィンドウごとにそれぞれのステータスを表示しようと思っているのですが、 ステータスバーを作成する方法がわかりません。 そなたか、ご存知の方宜しくお願い致します。 足りない部分は補足させていただきます。

  • C++/CLIで、アンマネージC++のDLLを使用する方法

    こんにちは。 C++/CLIのプログラムで、アンマネージC++のDLLを使用したいと考えています。 ネット上をいろいろ調べたのですが、具体的な手段がわかりません。 見よう見まねで以下のようにサンプルを作成したのですが、コンパイルすら通る状況になりません。 かなり基本的な問題がありそうで申し訳ないのですが、下記の問題点を教えていただけないでしょうか。 また、参考になりそうなサイトなどありましたら教えていただけると大変助かります。 ■アンマネージC++のDLL VC++6.0で、以下のように、単にデバッグ文字列を書き出すだけのDLL関数を作成しました。 (このDLLが使用できることは他のVC++6.0プロジェクトで確認済みです) /*-----Func.h-----*/ #ifndef __FUNC_H__ #define __FUNC_H__ AFX_EXT_CLASS void WINAPI ShowMessage(); #endif //__FUNC_H__ /*-----Func.cpp-----*/ #include "StdAfx.h" #include "Func.h" #include <stdio.h> void WINAPI ShowMessage() { CString str = "This is The Message from DLL Func!\n"; OutputDebugString(str); } ■C++/CLI でのDLL使用 Visual Studio2008にて、C++のCLRプロジェクトを作成して、以下のようにDLLを使用する準備を行いました。 1.ソリューションエクスプローラのヘッダフォルダに、Func.hを追加 2.プロジェクトのフォルダに、上記で作成したFuncのDLLとLIBファイルを置く。 3.プロジェクトの「プロパティ > C/C++ > プリプロセッサ > プリプロセッサの定義」に、"_AFXDLL"を追加 4.mainクラスのソースに以下を記述 /*----------*/ using namespace System; #include "Func.h" #using "ManagedDllApp.dll" int main() { ShowMessage(); return 0; } /*----------*/ この状態でコンパイルすると、 「エラー 3 error C2144: 構文エラー : 'void' は ';' によって先行されなければなりません。 d:\xxx\Func.h 4 Console 」等、Func.h周りで複数のエラーが出ます。 また、Func.hをインポートしないでコンパイルすると、 「エラー 3 fatal error C1113: #using が 'd:\xxx\manageddllapp.dll' で失敗しました。 」と、Dllでエラーが出ます。 よろしくお願いいたします。

専門家に質問してみよう