いい加減、こんな仕事に関係ない調べごとはやめなはれ、という感じですが。
これが最後です!
MFCアプリケーションで.NET Frameworkクラスライブラリにより描画する §
MFCアプリケーションのCViewを継承したビューのOnDrawハンドラで、.NET Frameworkクラスライブラリの機能を用いて描画行うというテストプログラムを書いてみました。
使ったのは、Visual Stduio.NET 2003とManaged C++です。(C++/CLIではない)
サンプルソース (抜粋) §
抜粋だけ掲載します。万一全体を見たいという奇特な人がいる場合は以下から入手してください。
なお、事前に、プロジェクトのプロパティから「マネージ拡張」を「はい」に切り替え、Managedコード アプリケーションに切り替えておく必要があります。
(前略)
#using <mscorlib.dll>
#using <System.dll>
#using <System.Drawing.dll>
#using <System.Windows.Forms.dll>
using namespace System;
using namespace System::Drawing;
using namespace System::Windows::Forms;
(中略)
void Cmfcdotnet001View::OnDraw(CDC* pDC)
{
Cmfcdotnet001Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
#pragma push_macro ("new")
#undef new
Graphics * g = Graphics::FromHdc(pDC->m_hDC);
try
{
Font * font = __gc new Font(S"MS ゴシック",12);
Brush * brush = __gc new SolidBrush( Color::Black );
PointF position( 10.0, 10.0 );
g->DrawString( S"Hello Mixed!", font, brush, position );
}
__finally
{
g->Dispose();
}
#pragma pop_macro ("new")
}
(後略)
実行結果 §
実行結果は割愛します。ウィンドウの左上に、黒字でHello Mixed!と表示されるはずです。
解説 §
Windows APIの生DCを経由することで、MFCと.NET Frameworkクラスライブラリは意思疎通することができるわけです。
つまり、pDC->m_hDCでMFCクラスから生DCの取得。
Graphics::FromHdcを使うことで、生DCからGraphicsオブジェクトを生成できます。
あとは好きなように描画してやれば良いわけですね。
ちなみに、後始末はどのレベルまで必要になるかは詰め切れていません。GraphicsオブジェクトだけDisposeしていますが、フォントやブラシもDisposeした方が良いでしょう。
#pragma push_macro ("new")と#undef newの役割は、MFCがnewをマクロで再定義していることが悪影響を及ぼすこと(ビルドエラーになる)への対策です。MFCアプリケーション内で__gc newする場合は前後をサンプルソースのようなコードで挟むと良いようです。
余談 §
この結果は、とっくの昔に実現されていた技術に過ぎませんが、けっこう衝撃的です。
MFCアプリケーションをManagedな世界に持ってこられると言うことは、そのようなソースコード資産に価値が生じるからです。
さて、これが可能であるなら、CViewのウィンドウ上に.NET Frameworkのコントロールを貼り付けられるか、ということも調べてみましたが、これは残念ながら無理であるようですね。生DCを介して結び付くように、生HWNDを介して結び付かないかと思ったのですが、ちょっと無理っぽい……。