簡易テキストエディタ(3)

編集可能なテキストのサイズ

とりあえず、実験によってエディットコントロールにどの程度のサイズのテキストが読み込めるか 調べてみると、Windows3.1で64470バイト、Windows95で64474バイトでした。 なおWindowsNTや2000で32ビットプログラムを動作させる時は、このような制限は存在しないはずです。 このように、Windowsのバージョンによって動作が異なる場合、 GetVersion() APIによる バージョンの取得が必要です。

読み込もうとするファイルが大きすぎる場合、ワードパットもしくはライトを起動します。 他のプログラムの起動は、WinExec() APIで行います。

それと、Windows95ではGetWindowText()およびGetDlgItemText()にバグがあるようです。 32KBより大きなバッファサイズを指定すると、テキストを全く取得できません。 よってWM_GETTEXTをSendMessage()します。

変更を破棄して良いかの確認

エディットコントロールには、テキストが変更されたかどうかを示すフラグが準備されています。 これを読みだせばよいので簡単にサポートできます。 まず、新規作成やファイル出力、読み込みの直後などにこのフラグをクリアします。
	SendDlgItemMessage(hDlg, IDEDIT, EM_SETMODIFY, FALSE, 0);
そして、「新規作成」や「開く」や「終了」やWindows自体の終了の時、このフラグをチェックします。 実際の処理は、changesave()関数で行なっています。
	if (SendDlgItemMessage(hDlg, IDEDIT, EM_GETMODIFY, 0, 0)) {
		(中略)
		if (ans==IDYES)	SendMessage(hDlg, WM_COMMAND, IDM_SAVE, 0L);
自分自身にメッセージを送る(Send)というのは、再帰コールと同じことになります。

右端で折り返す

これの実現のためには、もうひとつエディットコントロールを作って、データをコピー する以外、方法がないそうです。そのために、CreateWindowEx()というAPIを使っています。 実際の処理は、foldchange()という関数でやっています。それと、 GetMenu()とCheckMenuItem()を使って、メニューにチェックマークを入れています。

ヘルプ

ヘルプの呼び出しは、WinHelp()APIで行います。今回は、ヘルプファイルの作り方までは 説明しませんので、メモ帳(notepad)のヘルプを呼び出してお茶を濁しています。

コントロールのフォントの変更

テキストエディタとして使用する場合、やはり固定ピッチフォントでないと使いにくい ものです。Windows3.1では、ダイアログテンプレートで
FONT 12, "System"
の部分を
FONT 12, "Terminal"
に直すだけで、適切なサイズの固定ピッチフォントが得られたのですが、Windows95では うまくいきません。そこで、以下のようにします。
	hfont = (HFONT)GetStockObject(OEM_FIXED_FONT);
	SendDlgItemMessage(hDlg, IDEDIT ,WM_SETFONT, (WPARAM)hfont, MAKELONG(TRUE,0));

キー操作

以下のキー操作は、サポートしたいものです。 そのためには、まずリソースファイルに以下を追加します。
editaccel ACCELERATORS
BEGIN
	VK_F3, IDM_NEXT, VIRTKEY
	VK_F1, IDM_HELP, VIRTKEY
	"^A",  IDM_ALL
END
そして、LoadAccelerators() APIを使ってこのアクセラレータテーブルを読み込みます。 メッセージループの中で、TranslateAccelerator() APIを呼び出すと、キー操作が WM_COMMANDメッセージに変換されます。

なお、「Windowsインターフェィス アプリケーションデザインガイド」によると 以下のキー操作もサポートしたほうが良いことになっていますが、メモ帳も サポートしてませんねぇ。

以下のキー操作は、自動的につきます。

ファイル名の受け取り

コマンドライン引数
コマンドライン引数の分割処理は、 cmdlinesprit()関数でやっています。 32ビットの場合、GetCommandLine()でコマンドラインを取得して、これを 渡します。16ビットの場合、WinMain()の第三引数を使います。 (32ビットでWinMainの第三引数を使わない理由は、コンパイラによって動作が異なるから) 分割されてargvに入れられたコマンドライン引数は、 INITDIALOGメッセージでファイルの読込みに使われています。
ドラッグ&ドロップ
これをサポートするには、まず#include <shellapi.h>します。 DragAcceptFiles(hDlg, TRUE);を実行すると、ドロップを受け付けるようになります。 ファイルがドロップされると、WM_DROPFILESというメッセージがやってくるので、 DragQueryFile() というAPIを使ってファイル名を受け取ります。 受け取りが終わったら、DragFinish()を呼び出します。 ダイアログを閉じる時、DragAcceptFiles(hDlg, FALSE);でドロップを禁止します。

その他

Edit_SetSel()というのは、<windowsx.h>で定義されているコントロールAPIです。 Edit_GetSelEnd()は、自分で定義しました。 (#ifdef WIN32 がソースのあちこちに現れるのは見苦しいため)

これでほぼ、メモ帳の代用として使えるプログラムの完成です。 全ソース

前のページ

次のページ

一つ上のページに戻る