この記事では超シンプルなテキストエディタを作ります。
むちゃくちゃシンプルでもはや使い物にならないレベルですけどいいんです。なんてったって練習ですから。一応ちゃんとテキストファイルを作るところまで行けたので満足です。最初は小さく、でも早くってグーグルが言ってたって新書に書いてありましたし。
機能要件
今回は超シンプルなテキストエディタなので、実現する機能も簡単です。シンプルを超えたシンプル。もはや何もできないに等しくても文句は言えません。
実現する機能は次の通り。
- ダイアログにエディットボックスが表示され、文字が入力できる。
- エディットボックスに入力した文字をファイルにできる。
この2つだけです。文字を入力できてファイルに出力できたらとりあえずテキストエディタと言えそうです。プログラマは成長するとメモ帳を使わなくなっていく、みたいな所あるかもしれないですけどメモ帳もなかなか高機能なんですよまじで。
参考までに完成品の画像を載せておきます。

シンプルです。Saveボタンしかないし、ウィンドウタイトルすらありません。なぜタイトルがないかというと僕がつけ忘れたからです。タイトルつけたからってテキストに色を付けれるわけでもないのでこのまま行きます。いずれ開発が進めば読み込み機能とかつけてもいいかもしれませんね。
超シンプルなテキストエディタを開発する
プロジェクトの作成
VisualStudioで新しいプロジェクトをMFCで作成します。
今回作るエディタはMFCで作っていきます。

ダイアログベースのアプリケーションで、その他の設定はすべてデフォルトでもいいです。自分の場合は最小化と最大化のボックスくらいはつけました。高度な機能は使うつもり無いのですべてチェックを外します。

ダイアログの作成
まずはダイアログを作っていきます。説明も大変なのでイメージを貼っておきます。今回作るシンプルエディタは、Saveボタンを押してデータをテキストファイルに保存するので、ボタンを一つ追加しておきましょう。

ダイアログができたら次は変数の追加です。ボタンを押したらセーブするようにするためにエディットコントロールにアクセスして編集中の文字列を取ってくる必要があります。そのためにアクセス用の変数を追加しましょう。この変数の中にエディットコントロールが入って、関数やらメンバ変数やらをさわれるようにします。
適当なところで右クリックして「変数の追加」メニューを選び、エディットコントロールの変数を追加します。

これでソース上にエディットコントロールにアクセスできるメンバ変数が追加されます。
SAVEボタンでテキストを保存する
ダイアログの右下に追加したボタンを押すと、テキストを保存するように変更しましょう。ボタン押下のイベントでエディットコントロールから文字列を取得し、テキストファイルに保存します。
まずはボタン押下のイベント関数を追加しましょう。ダイアログのSAVEボタンを選択し、プロパティウィンドウでイベントを表示します。稲妻マークを押しましょう。

するとイベント一覧が出てくるので、BN_CLICKEDの欄に関数名を入力します。これでSAVEボタンを押下すると処理が走る関数が追加されます。
ここではデフォルトで表示されるOnBnClickedSave()にします。

イベント関数を追加できたら、関数の処理を書いていきます。
今回作成するテキストエディタは非常に簡単なものにしたので、保存するファイルは「C:\temp\test.txt」固定です。保存するたびに常に上書きにします。ファイルの保存場所を可変にしたりすると、それ用の処理を追加しないといけないので……。はじめは小さく、あくまでシンプルなものを目指します。
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("test.txt"), mode))
{
m_edit.GetWindowTextW(ss);
file.WriteString(ss);
file.Close();
}
}
setlocale()で使用言語を日本語にしておくようにしましょう。これをしないと日本語で入力したも内容をうまくファイルに保存できません。setlocale()でundefが出る場合は、locale.hのincludeを忘れています。.cppファイルでincludeしておくといいでしょう。
CFileクラスのOpen()でファイルをオープンします。その際のオープンモードはmode変数に代入して入れています。新規作成(ある場合は上書き)、書き込みモード、テキストモードでオープンしています。
オープンに成功したかをif文でチェックして,エディットコントロールから入力した文字列をGetWindowText()で取得しています。このGetWindowText()は使用する環境によってUnicode文字列とマルチバイト文字列を切り替えて扱う関数です。なお今のプロジェクトでどっちのUnicodeとマルチバイトどっちの文字列を使用するかは、プロジェクトのプロパティで見れるので参考にするといいでしょう。
GetWindowText()で手に入れた文字列はCString型の変数ssに入っています。これをCFile::WriteString()を使ってオープンしたファイルに書き込みます。
最後にfileをCloseして保存完了です。
動作確認
最後に動作確認です。ビルドしたexeを起動して、HelloWorld!と入力して保存した後、別のテキストエディタで開いてみましょう。

しっかりHelloWorld!と表示されましたね。
動作確認ができたら、次は日本語を入力して保存してみましょう。setlocale()をちゃんとやっているので、日本語でも問題なく保存できるはずです。
コメント
[…] 前回の記事では超シンプルなテキストエディタを作成しましたが、記事の割と最初の方で触れていたようにタイトルバーにアプリの名前すら表示していませんでした。 […]
[…] 「超シンプルなテキストエディタを作る」で作成したエディタは、ファイルの保存をSAVEボタンを押すことで対応していました。しかし昨今のテキストエディタを見てみるとボタン押下でファイルを保存するエディタは稀です。 […]
[…] 超シンプルなテキストエディタを作るの続きです。 […]
[…] 超シンプルなテキストエディタを作る、の続きです。 […]
[…] 実装対象のアプリケーションは、以前作った超シンプルなテキストエディタです。このエディタもだんだんと機能が充実してきて、初出の記事とはだいぶ変わってきましたのでGitHubにでもソースを公開したほうがいいかも知んないですね。 […]
[…] […]