MFCでDLLをつくり、それをC#から呼ぶ(復習)

Form appを作る

  • Visual Studioを開き、New Projectを作る、ダイアログで"Visual C#" -> "Windows Form Applicattion"を選択し、名前は"DLLTestForm"

MFC DLLプロジェクトをソリューションに追加する

  • Solution Explorerで"Solution 'DLLTesForm'"を右クリックし、"Add" -> "New Project"を選択
  • ダイアログで"Visual C++" -> "MFC"を選択し、MFC DLLプロジェクトを追加する、名前は"DLLTestEngine"

DLLにする関数を追加する

  • "DLLTestEngine.cpp"を開き、行末に以下を追加する


int DLL_add(int argument1, int argument2)
{
return argument1 + argument2;
}

DLLの関数export関数を宣言する

  • 上記で追加した関数の上に、以下を追加


extern "C" __declspec(dllexport) int DLL_add(int, int);


以上で呼び出されるDLLの実装は終了、次は呼び出すapp側の実装

FormにUIオブジェクトを配置する

  • "DLLTestForm"のForm1にbuttonとlabelを配置する、名前はそれぞれ"buttonAdd"、"labelResult"

ボタンのイベントハンドラを実装する


private void buttonAdd_Click(object sender, EventArgs e)
{
int argument1 = 1;
int argument2 = 1;
int Return = DLL_add(argument1, argument2);
labelResult.Text = string.Format("{0}", Return);
}

DLLラッパー関数を作成する

  • "Form1.cs"のForm1の宣言直後に、以下を追加


[DllImport("DLLTestEngine.dll", CallingConvention = CallingConvention.Cdecl)]
static extern int DLL_add(int argument1, int argument2);

ビルドする

  • ビルドする、ビルドが終わったら、ビルドされたDLLをC# appのexeのあるフォルダーにコピーする

実行する

  • うまくいけば、Formの表示されているラベルが"label1"から"2"に変わるはずだ。

Formに画像を表示する

Formに画像を表示する方法はいろいろあるのだが、一番簡単なのはFormの背景(Backgroundimage)にしてしまうことだ。

Form appを作る

  • Visual Studioを開き、New Projectを作る、名前は"DLLTestForm"

Formにドラッグ&ドロップを出来るようにする

  • Form1を開き、"Properties"をプロパティビューにして"AllowDrop"を"True"にする

Formにドラッグ&ドロップのイベントハンドラを実装

private void onDragEnter(object sender, DragEventArgs e)
{
    if ( e.Data.GetDataPresent( DataFormats.FileDrop ) )
        e.Effect = DragDropEffects.All;
    else
        e.Effect = DragDropEffects.None;
}
private void onDragDrop(object sender, DragEventArgs e)
{
    string[] stringFilename = (string[]) e.Data.GetData(DataFormats.FileDrop, false);
}

ファイルの画像を背景に貼り付ける


Image imgFromFile = Image.FromFile(stringFilename[0]);
this.BackgroundImage = imgFromFile;


さてこの方法だと何がよろしくないかというと、読み込んだ画像を加工して表示するのが厄介なことだ。
画像を加工するのに一番手っ取り早いのは、Bitmapオブジェクトにしてしまうことだ。
ついでに、Paintのイベントハンドラを実装して、Formの再描画をしたらFormのGraphicsオブジェトを利用して画像の表示を更新できるようにしよう。

Formのメンバー関数にBitmapオブジェクトを追加する。


Bitmap m_bmpFromFile;

"onDragDropを以下のように変更する

private void onDragDrop(object sender, DragEventArgs e)
{
    string[] stringFilename = (string[])e.Data.GetData(DataFormats.FileDrop, false);
    //
    m_bmpFromFile = new Bitmap(stringFilename[0]);
    Invalidate();
}

FormのPaintイベントハンドラを実装する

  • Form1の、"Properties"イベントビューで、"Paint"のイベントハンドラを作る、名前は"onPaint"
  • "onPaint"を以下のように実装


private void onPaint(object sender, PaintEventArgs e)
{
if (m_bmpFromFile != null)
{
e.Graphics.DrawImage(m_bmpFromFile, 0, 0, m_bmpFromFile.Width, m_bmpFromFile.Height);
}
}
m_bmpFromFileの初期化を忘れると、onPaintがクラッシュするので、くれぐれも注意。