今年の5月からC++/Win32 で作り出して半年経過しました。ようやく拡張子に関連付けして使えるようになってきています。半年でいったいどこまでできたのか記録しておきます。まず、なんでC#で作ってたのに C++/Win32 で作ったんって話ですが、これですね。
あほですか?調子乗ってますね。以前に.NETでテキストエディタ作成なんかありえないみたいな記事を見たことがあって、いつかは作ってみたかったんですよね。C++/Win32で。密かに憧れてました。ただ、今からテキストエディタを作るなら VS Code なんかが採用している Electron とかの方が良いかもしれませんね。
テキストエディタを作ったきっかけ
私が C#(最初はvb.netで作ってました)でテキストエディタを作り出した頃は .NET Framework は今みたいにOSに最初からインストールされていなくて別途インストールする必要がありました。.NET製アプリを利用してもらうハードルその①です。
そしてインストールしても、初回起動が遅いんですよね。ほんと。これは色々アプリ側で試行錯誤しましたが、どーにもなりませんでした。.NET製アプリを利用してもらうハードルその②です。基本どんなアプリでもそーですが、テキストエディタって基本動作が軽快で起動も速く無いとダメなアプリみたいなイメージになっちゃてますよね?メモ帳が爆速なんで仕方ないのですが。
そういった理由から.NETでテキストエディタなんかありえないって言われたんだと思います。
そして時は経ち、.NET Native ってのも出てきました。その名の通り、.NET でネイティブアプリが作成できるってやつです。もしかして C# でもネイティブアプリが作成できる?って思っていたのでが、いつまで経っても対象はストアアプリのみで Windows フォームアプリは対象になりませんでした。寂しいですね…。多分今後も対象にならないんじゃないかと…。そんなこんなでずっと C# で作っていました。
って書いておきながら、いつの間にか .NETの Windows フォームアプリもネイティブイメージを生成できるようになってました(気付きませんでした)
もちろん最初からテキストエディタが作成できるわけもなく、かなり試行錯誤しました。最初はテキストエディタなんか作る気は無くて SQL を実行して結果を取得するツールを作っていました。SQL だったらやっぱり色分したいなぁってなって、そこから気付いたらテキストエディタを作っていましたね。
最初はテキストボックスで作っていました。テキストボックスだと色を変更できないので次にリッチテキストボックス(懐かしいなぁ)で作りました。今もそーかは分からないのですが、リッチテキストボックスってスクロールが特殊なんですよね。慣性スクロールって言うの?マリオで言うと、ルイージみたいな動きをします(伝わります?)
結局このスクロールは修正できたんかなぁ。記憶にないですね。色変更も簡単にできるやろって思ってたんですが、正規表現なんかで一度にやろうとしたら、カチコチになり使い物になりませんでした。今だったら多分、もーいいやってなるはずなんですが、その時はなぜかしゃーねーな。コントロールをゼロから作ろうってなりました。そんなこんなで今も作っている状態です。
リリースもしていないのにウダウダ書いてしまいましたが、そんなこんなでどこまでできてん?ですよね。お前 C++ で GUI 作れるん?ってのもあるんですが、「はい。できません。一度も作ったことありません状態です」ですがそれはまた別の機会に。
いちよー、以前にC++/Win32で作りたかったので猫でもわかるWindowsプログラミングは買ったんですけどね。結局、当時は添付のアプリで速ぇーなぁ。で終わりました…。
エディタの外観
まずは見た目から。C# 版を作ってた時に学んだ余計なことをしない方針で進めていたはずなんですが、我慢できんってなって気付いたらこんな状態に…。ちなみに全部カスタマイズ入っています。あっ、エディタ名ですが、C#版が TZEditor なんで、安易に TZEditor++ にしています。
タイトルバーは自作して独自描画、メニューバーはツールバーで自作、ツールバーは標準をカスタムドロー、ポップアップメニューは自作、タブバーも自作、ステータスバーも自作、スクロールバーも自作です。もちろんエディタ部分も自作です。もーツールバー以外は全部自作ですね。
ざっくりですが、4ヶ月くらいがエディタ部分であとの2ヶ月が見た目の実装じゃないかと。中でもポップアップメニューが大変で実装に1ヶ月掛かりました。
昔ってこんな感じに標準とは違うカラーにしてるのってかなり特殊なアプリっぽい感じがしましたが、今だと普通になりつつあります。ただ、こんなに一気に修正してしまったので、肝心なエディタ部分に手を入れられない状態になっています…。
エディタ機能
ようやく本題です。見た目ばっかり触っててどこまでやったか忘れたのもありそうです。作りっぱなしで最終的にはテストしないといけないのですが、実装したのは下記です。基本的に C# 版をベースとして作成しました。中にはそのまま使えるものもありました(スクロールバーの矢印とか座標とか)
- 文字入力とかの基本機能(日本語もOK)
- ファイルの文字コード自動判断(UTF32、UTF16、UTF8、シフトJIS、JIS、EUC)
- 指定行へジャンプ
- 検索/置換(正規表現は無し)
- REDO/UNDO
- キーワードハイライト
- 単一行コメントハイライト
- 複数行コメントハイライト
- シングル/ダブルクォーテーションハイライト(複数行もまたげる)
- URLハイライト(クリックはまだ)
こんな感じですかね。ハイライトは拡張子単位ではなく全ファイル共通です。大体テキストエディタに必要な基本的な機能は実装できてると思います。
C++/Win32で作ってみた感想
やっぱり起動は爆速ですね。今まで悩んでたんはなんやったんやってくらい速いです。正直に言うと最初はなぜか起動以外は C# 版の方が速かったです。これは私の作り方が悪くって今では C# 版よりは速くなりました。
ただ、実装はやっぱり面倒ですね。簡単なツール作ろうってなった場合に C++/Win32 を選択することは無いとは思います…。でも、もし.NETで自作ツールなんか作ってて起動遅いなぁって方は C++/Win32 で作ってみるのもありかなとは思いますね。感動するくらい速いんで(いまさら感満載ですが…。)
おわりに
Twitterとかでも開発状況はつぶやいているのですが、こいついっつも同じことやってへん?って思ったのでどこまでできてるのか整理してみました。
今後の予定ですが、基本的に折り返しとか矩形選択とか機能追加はせず、実装した機能のテストをしようと思います(脱線しなければね…。)そして、リリースして目標の wikipedia のテキストエディタ一覧に掲載されるまで作り続けようと思います。
コメント