【第5回】
第2章:超簡単テキストエディター
使いやすいGUIにするには
(00/05/26)
こんにちは、nakkaです。今回も引き続いてテキストエディターを作っていきます。今回の目標は、自動バックアップ機能の追加とショートカットキーの追加することです。どちらも機能を追加できたところで、実行プログラムといっしょにソースコードをダウンロードできるようにしてあるので、わかるようになるまでじっくり読んでみてください。
GUIでもコマンドラインは欠かせない
Windowsプログラミングでは、GUIで操作できるソフトを制作することがほとんどです。たとえばファイルを開くときは、マウスを使って開きたいファイルを実行プログラムにドラッグ&ドロップするか、ファイルをダブルクリックします。前章で作成した時計ソフトでも、BMP画像をドラッグ&ドロップしてデジタル表示の文字デザインを変更させていました。
上記のような操作をするとき、実際はプログラムにコマンドラインが渡されています。テキストエディターのように実行プログラム以外のファイルを扱うアプリケーションでは、ドラッグ&ドロップなどの“ファイルを開く”操作でアプリケーションまで起動できることが必要です。ファイルの関連付けなどを行った場合、通常ファイルを開く操作をするだけで同時に関連付けされたアプリケーションも起動できますが、アプリケーションがコマンドラインに対応していないと、アプリケーションは起動するがダブルクリックしたはずのファイルを開いてくれないという事態になってしまいます。きちんとコマンドラインに対応させていれば、ファイルを開くだけで関連付けされたアプリケーションで開いて起動することが可能になります。
いざというときの自動バックアップ
テキストエディターで私が個人的にほしい機能のうち、メモ帳では用意されていない機能の一つとして自動バックアップがあります。文章を編集しているときに突然テキストエディターが強制終了してしまった場合など、せっかく編集していた文章がなくなってしまう危険性がいくつか考えられます。そこで、今回は非常に簡単なバックアップ機能を付けました。ただ現時点では、タイマーで一定時間ごとに“editor.bak”という決まったファイル名で保存するようになっているため、複数のテキストファイルを開いている場合に、どのファイルが保存されるかわからないという問題があります。使いやすくするには、複数ファイルをバックアップすることが望ましいでしょう。自分にぴったりのバックアップ方法はどういう形か考えてみましょう。
「ダイアログエディタ」を使いこなす
バックアップを行うために設定画面を作りましたが、ここで気を付けてほしいのが設定画面のタブオーダーです。タブオーダーというのは、[TAB]キーを押したときにカーソルがテキストボックスやボタンを移動する順番のことです。タブオーダーがバラバラだと[TAB]キーを押したときに期待どおりの場所にカーソルが移動せず、アプリケーションがとても使いづらくなります。
この設定は「Microsoft Visual C++」の場合は「ダイアログエディタ」でダイアログのデザインを行った後にメニューの[レイアウト]-[タブオーダー]で編集することが可能です。また、新しくコントロールを追加した場合もこのタブオーダーを修正しておかないと追加したコントロールだけ順番が最後になってしまいます。ダイアログではなく自分でコントロールを作成する場合のタブオーダーは作成したコントロールの順番になるため、タブを移動させる順番を十分に意識してコントロールを作成していく必要があります。
ショートカットキーが便利
さて、いろいろと機能が揃ってきましたが、少し使いやすくするためにここでショートカットキーで機能を呼べるようにしてみます。これはリソースにAccelaratorを追加します。Accelaratorにはプログラムの内部で判別する[ID]と[キー]の割り当てを指定するのですが、IDについては各メニューのIDをそのまま設定してそのメニューを呼び出すキーを指定するといいでしょう。そして、どのショートカットキーでどのメニューが呼び出されるのかを、メニュー内に記述しておくと、ユーザーにとってとてもわかりやすくなります。
Accelaratorを作成したら、プログラムの内部でそのAccelaratorを処理する必要があります。たとえば、以下の処理で可能です。
HANDLE hAccel;
/* リソースからアクセラレータをロード */
hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR));
/* ウィンドウメッセージ処理 */
while(GetMessage(&msg, NULL, 0, 0)){
/* アクセラレータを処理する */
if(TranslateAccelerator(hWnd, hAccel, &msg) == TRUE){
continue;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
|
ショートカットキーは他のソフトとの統一性も大事になってくるので、十分に注意してキーを割り当てていく必要があります。
とはいえ、ショートカットキーはユーザーごとにどのキーを使うか異なるので、ユーザー自身がキー割り当てをカスタマイズできるようにしておけば、誰にとっても使いやすいテキストエディターになるでしょう。
いくつかの機能を追加してきましたが、次回はまずプログラムのソースコードを最適化したいと思います。ソフトが大きくなっていく中でできるだけシンプルな構造でわかりやすい記述にしておけば、後々のバージョンアップが行いやすくなるのです。
それでは、また来週。
(nakka)