CodeZine(コードジン)

特集ページ一覧

WPFアプリケーションで腕試し
~C++でもWPFアプリを

Visual Studio ぜんぶのせ!

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2012/06/06 14:00
目次

ネイティブとマネージドの橋渡し部分の作成

 さて、CounterはC++すなわちnativeなので、.NETのmanaged世界と繋ぐためmanagedの薄皮でくるんでやらにゃなりません。この役にはnativeとmanagedの2つの顔を持つC++/CLIが適任でしょうね。

 プロジェクト:C++/CLRクラスライブラリ「CounterModel」を起こし、薄皮クラス CounterModelを実装します。CounterModelはCounterを内包し、カウンタを+1/-1するアクション:Increment/Decrement、そしてカウンタ値が変化したときの処理を登録できるイベント:CountUpdatedを公開します。

CounterModel.h
#ifndef COUNTERMODEL_H__
#define COUNTERMODEL_H__

namespace DataBindingSample {

  class Counter;

  public ref class CounterModel {
  public:
    CounterModel();
   !CounterModel();
   ~CounterModel();

    // Model→ViewModel
    event System::Action<int>^ CountUpdated;

    // ViewModel→Model 
    property System::Action<Object^>^ Increment { System::Action<Object^>^ get(); }
    property System::Action<Object^>^ Decrement { System::Action<Object^>^ get(); }

  private:
    Counter* counter_;
    void Notify();
    void inc(Object^ dummy);
    void dec(Object^ dummy);

  };

}

#endif
CounterModel.cpp
#include "Counter.h"
#include "CounterModel.h"

using namespace System;

/*
 * CounterModel impl.
 */
namespace DataBindingSample {

  CounterModel::CounterModel()  { counter_ = new Counter(); }
  CounterModel::!CounterModel() { this->~CounterModel(); }
  CounterModel::~CounterModel() { delete counter_; }

  Action<Object^>^ CounterModel::Increment::get() 
    { return gcnew Action<Object^>(this, &CounterModel::inc); } 
  Action<Object^>^ CounterModel::Decrement::get() 
    { return gcnew Action<Object^>(this, &CounterModel::dec); } 

  void CounterModel::Notify() { CountUpdated(counter_->count()); }
  void CounterModel::inc(Object^ dummy) { counter_->inc(); Notify(); }
  void CounterModel::dec(Object^ dummy) { counter_->dec(); Notify(); }

}

 これでnativeなCounterをmanagedの皮でくるむことができたハズ。おためしにC#から呼び出してみましょう。

Program.cs
namespace CounterModelTestRun {
  class Program {
    static void Main() {
      var counter = new DataBindingSample.CounterModel();
      counter.CountUpdated += count => System.Console.WriteLine("count: {0}", count);
      var inc = counter.Increment;
      var dec = counter.Decrement;
      inc(null); inc(null); inc(null);
      dec(null); dec(null); dec(null); 
    }
  }
}
/* 実行結果:
count: 1
count: 2
count: 3
count: 2
count: 1
count: 0
*/

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • επιστημη(エピステーメー)

    C++に首まで浸かったプログラマ。 Microsoft MVP, Visual C++ (2004.01~2018.06) "だった"り わんくま同盟でたまにセッションスピーカやったり 中国茶淹れてにわか茶人を気取ってたり、 あと Facebook とか。 著書: - STL標準...

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5