nprogram’s blog

気ままに、プログラミングのトピックについて書いていきます

MFCアプリケーションの学習

MFCアプリケーションの学習をする必要が発生したため、記録します。

開発環境は、Visual Studio Community 2015です。

まずは、プロジェクト作成方法です。

ファイル⇒プロジェクトを選択し、MFCアプリケーションを選択します。プロジェクト名は、わかりにくくて、申し訳ないのですが、MFCApplication2としました。

f:id:nprogram:20170612105640p:plain

アプリケーションの種類で、ダイアログベースを選択してください。

f:id:nprogram:20170612105706p:plain

あと、そのまま、デフォルト設定でOKボタンを押します。

プロジェクト作成が完了すると、次のような画面が表示されます。

f:id:nprogram:20170612110300p:plain

■ PlaySound関数を用いた音楽再生サンプルアプリケーションを作成します。

・PlaySound関数を用いた簡単な音楽再生アプリケーションを作成します。 ただし、このアプリケーションは、wavファイルしか再生できず、また、音楽の途中からは再生できません。(泣)

■プログラム表示イメージ f:id:nprogram:20170612104610p:plain

(1) ソリューションエクスプローラーから、リソースファイルを選択します。

f:id:nprogram:20170612110608p:plain

(2) リソースビューが開かれるので、DIALOGをダブルクリックします。

f:id:nprogram:20170612110733p:plain

(3) 次のような画面が開かれます。

f:id:nprogram:20170612111309p:plain

(4) 上記画面左のツールボックスを選択して、Edit Controlを選択して、ダイアログにドラック・アンド・ドロップします。

f:id:nprogram:20170612111509p:plain

(5) 画面にファイルダイアログを開くボタンを追加します。 ツールボックスで、Buttonを選択して、変数の追加を選択します。

f:id:nprogram:20170612111810p:plain

(6) メンバー変数の追加ウィザードは次のようにします。カテゴリはValueにしてください。

f:id:nprogram:20170612113035p:plain

(7) Visual Studioの画面右下のプロパティウィンドウのCaptionに...を入力します。

f:id:nprogram:20170612113218p:plain

(8) プロパティウィンドウの管理イベント(電撃マークみたいなアイコン)を選択してください。

f:id:nprogram:20170612113851p:plain

MFCApplication2Dlg.cppファイルにイベントハンドラメソッドが追加されるため、以下のようにコードを記載します。

void CMFCApplication2Dlg::OnBnClickedButton1()
{
    CFileDialog dlg(
        TRUE,       // FileOpen
        L".wav",
        L"",
        0,
        L"WAVファイル (*.wav)|*.wav|All Files (*.*)|*.*||",
        this);

    if (dlg.DoModal() == IDOK)
    {
        m_strFilePath = dlg.GetPathName();
        UpdateData(FALSE);
    }
}

(9) 一度、アプリケーションを実行しましょう。ビルドして、実行しましょう。...ボタンを押して、ダイアログが開かれることを確認してください。

f:id:nprogram:20170612114535p:plain

(10) 次に、再生ボタンと停止ボタンを画面に追加します。 リソースビューから、ツールボックスを選択して、Buttonを二つダイアログ上にドラック・アンド・ドロップします。 Buttonの表示文字列をプロパティウィンドウからPlay````とStop```に変更してください。

f:id:nprogram:20170612115027p:plain

(11) ```Play````のボタンを選択して、ボタンをクリックしたときのイベントハンドラメソッドを追加し、以下のように記載します。 音楽を再生するのに、PlaySound関数を用います。

void CMFCApplication2Dlg::OnBnClickedButton2()
{
    PlaySound(m_strFilePath, NULL, 0); // 非同期ではない処理
}

(12) 同様に、```Stop````のボタンを選択して、ボタンをクリックしたときのイベントハンドラメソッドを追加し、以下のように記載します。

void CMFCApplication2Dlg::OnBnClickedButton3()
{
    PlaySound(NULL, NULL, 0);
}

(13) PlaySound関数を使うには、mmsystem.hのヘッダファイルをインクルードし、winmm.libをリンクする必要があります。stdafx.h````に、インクルード文#include <mmsystem.h>```を追加してください。

f:id:nprogram:20170612120717p:plain

プロジェクトを右クリックして、プロジェクトのプロパティページを開いて、構成プロパティ⇒リンカーから、追加の依存ファイルにwinmm.libを記載します。 f:id:nprogram:20170612121622p:plain

(14) アプリケーションを実行しましょう。wavファイルをファイル選択ボタンから開き、再生ボタンを押して、音楽が再生されることを確認してください。 音楽は、再生できるようになりましたが、他のボタンを押すことができません。PlaySound関数が非同期処理になっていないためです。

f:id:nprogram:20170612121921p:plain

そこで、次のように、PlaySound関数の呼び出し方を修正して、非同期処理で音楽を再生します。

void CMFCApplication2Dlg::OnBnClickedButton2()
{
    PlaySound(m_strFilePath, NULL, SND_FILENAME | SND_ASYNC);   // 非同期処理 (音楽再生中に、Stopボタンが押せます)
}

(15) アプリケーションを実行しましょう。 wavファイルをファイル選択ボタンから開き、再生ボタンを押して、音楽が再生され、音楽再生中に、停止ボタンが押せれば、本サンプルアプリケーションは完成です。

古い技術ではありますが、引き続き、MFCの学習を続けていこうと思います。

なお、本ページの記載は、以下のサイトを参考にさせていただきました。 ありがとうございます。

・Cactus Software様 MFC C++アプリケーション