[MFC]メニューでダイアログを操作する

MFC
この記事は約5分で読めます。

超シンプルなテキストエディタを作る」で作成したエディタは、ファイルの保存をSAVEボタンを押すことで対応していました。しかし昨今のテキストエディタを見てみるとボタン押下でファイルを保存するエディタは稀です。

そこで今回は、ダイアログにメニューを追加し、メニューの操作でファイルを保存できるようにします。例によってファイルは既存ファイルへの上書きだけを行います。選択したファイルへの読み書きはそのうちやります。

完成品のイメージを参考までに貼っておきます。ファイルメニューが追加されています。

実装記録

メニューの追加

まずはメニューを追加しましょう。リソースビューで右クリックし、「リソースの追加」をクリックします。するとリソースの追加ダイアログが表示されるので、追加するリソースとしてメニューを選択しましょう。

するとリソースにメニューが追加されるので編集画面を開き、メニューの内容を編集しましょう。あまり説明しにくいのですが、触ればすぐに編集の仕方はわかると思います。

空欄に文字を入れていくと、その下と右に自動的に空のメニューのキャプションを入力する欄が出てきます。ここに文字を入れるとどんどんメニューが生成されていきます。

しかし今回は、ただ保存するメニューを追加するだけですので、「ファイル -> 上書き保存」メニューを追加するだけにします。上書き保存メニューをクリックすると、ファイルが保存される仕組みです。

メニューのイベントハンドラの追加

メニューの追加が終わったら、次はメニュー押下時のイベントを処理するハンドラを作成しましょう。

情報が少なかったせいか、ここが一番苦労しました。閉鎖されたホームページがトップに来るのは辛かった。何度もクリックしちゃうし。

イベントを追加するので、メニューのプロパティから稲妻ボタンを押して該当するイベントを……といった手順ではありません。

メニューにイベントハンドラを追加する場合は、メニューリソースの編集画面の該当するメニューで右クリック ー> イベントハンドラーの追加、で追加を行います。そうすると、イベントハンドラーウィザードがポップアップしてくるのでハンドラーを追加します。ハンドラーの追加先と、処理を行う関数名を入力します。特にこだわりがなければデフォルトのままで構いません。

ハンドラを追加するクラスですが、僕はCMyEditorDlgを選びます。メニューの操作はあくまでダイアログの一部なのでダイアログのクラスとして受け取って、実際の処理はCMyEditorAppに隠しちゃう、といった流れのほうがわかりやすいと思うので。今回はひとまずメニューを追加しちゃうだけにするので、処理も CMyEditorDlg に突っ込んじゃいますが。

なお、イベントハンドラーを追加する前にメニューのIDを変更しておくことをおすすめします。これはメニューリソースの編集画面で、右クリック -> IDの編集でキャプションの代わりにメニューIDを編集できるモードに切り替わります。デフォルトではよくわからない番号がついているので、メニューの意味のわかりやすい英単語などにIDを変更しておくといいでしょう。

もとに戻したい場合はもう一度IDの編集を選択すればいいです。

SAVEボタンの処理をメニューのイベントハンドラに移植する

これはもう単純にソースをコピペするだけです。

一応貼っておきます。

void CMyEditorDlg::OnBnClickedSave()
{
	// TODO: ここにコントロール通知ハンドラー コードを追加します。
/* この処理はメニューのイベントハンドラに移植する。
	CStdioFile	file;
	CString		ss;
	long		mode;
	setlocale(LC_CTYPE, "jpn");

	mode = CFile::modeCreate | CFile::modeWrite | CFile::typeText;

	if (file.Open(TEXT("C:\\temp\\test.txt"), mode))
	{
		m_edit.GetWindowText(ss);
		file.WriteString(ss);
		file.Close();
	}
*/
}

void CMyEditorDlg::OnMSave()
{
	// TODO: ここにコマンド ハンドラー コードを追加します。
	CStdioFile	file;
	CString		ss;
	long		mode;
	setlocale(LC_CTYPE, "jpn");

	mode = CFile::modeCreate | CFile::modeWrite | CFile::typeText;

	if (file.Open(TEXT("C:\\temp\\test.txt"), mode))
	{
		m_edit.GetWindowText(ss);
		file.WriteString(ss);
		file.Close();
	}
}

最後に用済みになったSAVEボタンを削除します。

そのまま消してもいいとは思いますがなんとなく怖いので、クラスウィザードからSAVEボタンのイベントハンドラを削除します。

最後にSAVEボタンを消して空いた余白にエディットコントロールを広げて完成です。

動作確認

最後にもう一度完成品を貼っておきます。

ファイル -> 上書き保存ボタンで、問題なく保存ができることを確認しました。

コメント

  1. […] […]

タイトルとURLをコピーしました