3つですすてにゃんのブログです2014-12-27とりあえずメモ帳作ったよその他2014年も残りわずかですが皆さんいかがお過ごしでしょーか。Text?Atom?そんな横文字のよくわからないエディタ使うのはただのかっこつけだよ。2014ってことで取り残されないためにもメモ帳をC#で自作してみました。Studioもそこまで使ったことないです。今回はググりながら素人なりにがんばってみました。メモ帳程度なら出来るだろうと。Professionalです。この前Community版が出たのでそれでもよかったですけどね。起動して新規プロジェクトを作るとこの画面が出ました:ん~?どれにすればいいんだ。Formsのほうを選択しました。あとで検索してみるとどうやらWPFを使ったほうが良いという意見が多いようですがまあいいでしょう。作ろう新規プロジェクトを作ったらフォームが現れた!あら、簡単じゃないの。メモ帳なのでRichTextBoxを配置してみた。おーおー、この調子なら数十分で出来ちゃうんじゃないの?(※実際はのんびりしながら4日くらいかかっちゃいました)でもこれいきなり問題があるのですよ。ウィンドウをリサイズしてもRichTextBoxがリサイズしてくれないんですよ。ないのでとりあえずDockっていうプロパティをFillに変えてやったら解決しました。次にメニューを追加してみます。MenuStripってのを追加したら簡単にできました。あれれ~?見た目おかしくないか?僕の知ってるメモ帳のメニューじゃないなぁ。theme.*2んん?MenuStripよりもMainMenuっていうやつを使ったほうがいいらしい?で使うには追加しないといけないらしい。ふーん、ってことで追加してるところ:なるほどね、沢山追加できるものがあるんだね。MainMenuを入れたところでメニュー項目を入力していきました。実行してみると、おっ、それっぽいね?アイコンもメモ帳のやつにしてタイトルはとりあえず無題にしときました。コンテキストメニュー(右クリックした時に出るやつ)も同じように設定できるみたいですね。いえばまだコードを書いていないな...コード書こうぜ一番簡単そうな「ステータスバーの表示」から書こう。これはチェックボックス風なメニュー項目で、チェックが入ってる間はメモ帳の下にステータスバーが表示され、僕が知ってる限りでは現在マウスがある場所の行と列番号を表示してくれるもの。m」みたいな形式で右下に表示されてます。ことでまずStatusStripってのを追加してっと。あれ?これ右寄せってどうやんの。右寄せしたい物の左側に空白を入れて右寄せになってるように見せかけるってことか?実際やってみたらできました。あとは行と列番号を求めるコード。RichTextBoxのSelectionStartというプロパティが現在マウスで選択されてる部分の最初の位置を返してくれるらしいのでそれを利用するみたい。こんな感じ:WordWrapというメニュー項目も一応実装しました。実装というより単にチェックをオン・オフにするだけでしたけどね。セーブしようセーブが出来なかったらどうしようもないですよね。SaveFileDialogというめっちゃ便利なものがあるみたいなので追加。セーブというメニュー項目がクリックされたらこのダイアログボックスを表示させるようにしました。次に、セーブが押されたときどうするか?まずメモ帳のタイトルを「無題」とか「Untitled」とかじゃなくてセーブダイアログボックスで入力したものに変えたいよね。Notepad";SaveFileDialogのFileNameというのがファイル名だと思ったら実際はパスだという罠でした。参考にGetFileNameという関数にたどり着きました。次に実際にファイルに書き込みをして「セーブ」をしないといけないですね。StreamWriterっていうのを使えば書き込むことができるらしい。System.Text.Encoding.GetEncoding("shift_jis"));writer.Write(mainTextBox.Text);writer.Flush();writer.Close();writer.Dispose();StreamWriterの第一引数が保存するファイルのパス、第二引数が文字をアペンドするかどうか(僕の場合は全部上書きということでfalse)、で最後の引数が文字コードですね。ググったとき他の人がshift_jis使ってたのでそれにしてますが、まあ他のでもできるはず。次にそのwriterを使ってRichTextBoxの中身を使って書き込む。これだけで良さそうだけど実行してみたら保存されてなくてどうやらwriter.Flush()必須っぽいですね。この後CloseしてDisposeしてますがこれは多分他の処理でOpenとかSaveとかしてたらプログラムが怒りそうだと思ったのでとりあえずDispose(破棄?)してます。ところでここで明示的に文字コード指定していますがこれは何故かと言うとSaveFileDialogにはデフォルトでは文字コードを選ぶためのドロップダウンメニューがついていないんですよ~メモ帳のセーブダイアログにはあるのに。ググってみるとどうやら簡単にドロップダウンメニューを追加することができないようなのでとりあえず放置で。ファイルを開くためには基本的にはセーブと同様で、writerじゃなくてreaderを使ったらできました。セーブしないの?保存していないファイルを閉じるときに「保存しますか?」みたいの、出るよね。それやりたい!やりました。ユーザーがメモ帳を閉じようとするときにそれを阻止しちゃうコードはこちらを参考にしました。FormClosingイベントってイベントがあるんだね。次にMessageBoxを表示させてセーブしますか?ってするのもいいが、デフォルトでは「セーブボタン」なんてものはないんだよなぁ。YESとかNOとかCANCELとか。label.*4自分でフォーム作れってさ。仕方ないので作りました:で、どうやって親のフォームにどのボタン押したのか伝えるの。ググったところここをみるとどうやらDialogResultっていうのを設定しておけばどのボタンを押したかがわかるようなのでそうしました。Saveを押したら何もせずにそのまま閉じる、Cancelを押したらメモ帳を閉じるのを阻止しちゃう。