超シンプルなテキストエディタを作る、の続きです。
やはりテキストエディタと言うからには、一度保存したテキストを編集したい欲がありますよね。この記事の開発でファイルを開く機能を実装します。これで編集途中のファイルを一旦保存して、あとから再び開き直すことを可能にします。
いよいよ本格的にテキストエディタらしくなってきました。
ファイルを開く機能の実装
さて今回はファイルを開く機能として、システムメニューに「ファイル -> ファイルを開く」を追加します。
該当するメニューを押した場合のイベントハンドラを追加して、以下のようにコーディングします。
メニューの追加やメニューへのハンドラの追加がわからない方は、以前の記事を参照してください。
void CMyEditorDlg::OnMOpenfile()
{
// TODO: ここにコマンド ハンドラー コードを追加します。
CStdioFile file;
CString ss;
CString ssall;
long mode;
char c[256];
mode = CFile::modeRead | CFile::modeNoTruncate | CFile::typeText;
if (file.Open(TEXT("C:\\temp\\test.txt"), mode))
{
while (file.ReadString(c,256))
{
ss = c;
ssall = ssall + ss;
}
m_edit.SetWindowText(ssall);
file.Close();
}
}
さて、これが結構苦労しました。
まずはmode設定はいいですよね。本来はファイルオープンから「ファイル閉じる」という操作をユーザがするまでファイルは開きっぱなしにするのがいい(編集中のファイルをこのアプリから専有するためにも)いいんでしょうけど、まずはファイルを読み込むことだけやりたかったのでこの中で閉じちゃってます。なのでmodeも読み取り専用にしています。
その後ファイルを読み取れたらCFile::ReadString()で1行ずつ読み取っていくんですが、なぜか改行コードをうまく読み取ってくれません。
Micorosoftのドキュメントを見ると、 CFile::ReadString() はCStringを引数に取る使い方をすると、\nを勝手に落としちゃうらしいです。な、なんて余計なことを……!
そのため用意したchar型のバッファに一旦突っ込んでからCStringに突っ込んで足し合わせてSetWindowText()しています。この処理は無駄だと思うのでいつか変えたいです。
今回エディットコントロールに後から後から追加していく方法がわからなかったので、こんなやり方になってしまいました。もう少しうまいやり方があればコメントで募集しています。

うまく改行も表示させることができました。ファイルを開くことができるとなんだか感慨深いですね。
コメント