特集

Vista時代のVisual C++の流儀(中編)

MFCから.NETへの実践的移行計画

επιστημη(えぴすてーめー)
2007/03/06

●MFCのDocument/Viewアーキテクチャのおさらい

 エンド・ユーザーがボタンのクリックなどによってアプリケーションに処理を要求したとしましょう。Document/Viewアーキテクチャでは、ボタン・クリックによって発生するイベントはViewが受理し、Documentに用意されたメソッドを呼び出すことによってイベントに応じた処理をDocumentに要求します。Documentはそれに応え、データの加工などの処理を行います。

 その処理の結果、エンド・ユーザーが欲するデータに何らかの変更が生じたなら、それをエンド・ユーザーに向けて表現するために、DocumentはUpdateAllViewsメソッドを呼び出します。するとそのDocumentに対応する表現を担うすべてのViewのOnUpdateメソッドが呼び出されます。OnUpdateメソッドは必要に応じてDocumentからデータを取得し、それを画面に反映させます。

 以上の流れを示したのが、次の図です。

MFCのDocument/Viewアーキテクチャの処理の流れ

改訂版 C#入門「第17章 言語に内蔵されたイベント機能」

 MFCが提供するこのアーキテクチャをC#によるViewとC++/CLIによるDocumentで実現することになります。そのためには上記のようにDocument側にあるUpdateAllViewsメソッドの呼び出しによってView側のOnUpdateメソッドが呼び出されなくてはなりません。この仕組みは.NETのイベント機能で簡単に実現できます。やってみましょう。

●.NETでのDocument/Viewアーキテクチャの構築方法

 本稿では簡単な積算機を作ります。事前の準備として、VS 2005の[新しいプロジェクト]ダイアログで、「その他のプロジェクトの種類」−「Visual Studio ソリューション」の「空のソリューション」テンプレートを選択し、「dotNetArchitecture」という名前で新規ソリューションを作成します。

 そしてそのソリューションに、「Document」という名前のC++/CLI(=[Visual C++]−[CLR])の「クラス ライブラリ」プロジェクトを追加します。これはDocument/ViewアーキテクチャにおけるDocumentとなります。

 さらに、「View」という名前のC#の「コンソール アプリケーション」プロジェクトを新規作成します。これがViewになります。Viewプロジェクトでは、「Program.cs」を「View.cs」というファイル名に変更し、[参照設定]でDocumentプロジェクトを参照するように設定してください。最後に、Viewプロジェクトを[スタートアップ プロジェクトに設定]します。

 以上の準備が終わったら、まずDocumentをC++/CLIで書きます。ソース・ファイル「Document.cpp」を開き、次のコードを書き加えてください。

#include "stdafx.h"
#include "Document.h"

namespace trial {
  public ref class Document {
  private:
    int value_;
  public:
    event System::EventHandler^ UpdateAllViews;
    Document() : value_(0) {}
    void Add(int n) {
      value_ += n;
      UpdateAllViews(this, nullptr);
    }
    int Value() { return value_; }
  };
}
C++/CLIで記述したDocumentのサンプル・コード(Document.cpp)

 Document側にあるUpdateAllViewsメソッドを、このコードではイベントとして実装しています。View側で(ボタン・クリックなど)何らかのエンド・ユーザー・イベントからの処理要求が発生すると、ViewはAddメソッドを呼び出すという仕様です。Addメソッド内部では、要求された処理を行い、その処理結果をViewに返すためにUpdateAllViewsイベントを発生させます。

 Documentプロジェクトをコンパイルし、アセンブリ(Document.dll)を作ります。

 次にC#でView側を作成します。ソース・ファイル「View.cs」を開き、次のコードを書き加えてください。

using System;
using Document;

namespace trial {
  public class View {
    private void OnUpdate(object sender, System.EventArgs e) {
      System.Console.WriteLine("sum = {0}", ((Document)sender).Value());
    }
    public static void Main() {
      View v = new View();
      Document d = new Document();
      d.UpdateAllViews += v.OnUpdate;
      for ( int i = 0; i < 5; ++i ) {
        d.Add(i);
      }
    }
  }
}
C#で記述したViewのサンプル・コード(View.cs)
ひな型のソース・コードでは名前空間名が「View」、クラス名が「Program」となっているが、これはこのコードで上書きしてよい。

 MainメソッドではViewとDocumentを生成(new)し、DocumentのUpdateAllViewsイベントにViewのOnUpdateメソッドを登録(+=)することで双方がつながります。これによって、Document側でUpdateAllViewsイベントが発生すれば、View側のOnUpdateメソッドが呼び出されます。

 以上で完成です。サンプル・プログラムを実行したのが次の画面です。

Document/Viewアーキテクチャを実装した.NETのサンプル・プログラムの実行結果
仮想的なエンド・ユーザーからの処理要求として、DocumentのAddメソッドが5回呼び出されているため、Viewの更新も5回行われる。

 ここまでのサンプル・プログラムはここ(dotNetArchitecture.zip)からダウンロードできます。

MFCから.NETへ ── 移行の実際

 .NETでも、MFCで構築したVC++アプリケーションで多く活用されているDocument/Viewアーキテクチャを簡単に実現できることが分かりました。それでは実際にMFCで構築したVC++アプリケーションを.NETへ移行するにはどうすればよいのでしょうか。


 INDEX
  [特集]
  Vista時代のVisual C++の流儀(前編)
  Vista到来。既存C/C++資産の.NET化を始めよう!
    1.Vista時代にC/C++はもはやお払い箱なのか?
    2.C/C++資産をどこまで生かせる?
    3.ネイティブ・オブジェクトをマネージ・コードでくるむ
    4.文字コード変換
 
  Vista時代のVisual C++の流儀(中編)
  MFCから.NETへの実践的移行計画
    1.C++/CLIによるWindowsフォーム・アプリケーション
  2.言語をまたいだDocument/Viewアーキテクチャ
    3..NET移行前のMFCサンプル・アプリケーション
    4.MFCのDocument/Viewアーキテクチャの.NET化
    5.MFCで書かれたDocumentを.NET化する2つの方法
 
  Vista時代のVisual C++の流儀(後編)
  STL/CLRによるDocument/Viewアーキテクチャ
    1.STL/CLRとは
    2.STL/CLRの特徴
    3.Visual Studio 2005で試す
    4.おまけ:NUnitの活用


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間