簡易テキストエディタ(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));
キー操作
以下のキー操作は、サポートしたいものです。
- F1……ヘルプ
- F3……次を検索
- ctrl+A……全て選択
そのためには、まずリソースファイルに以下を追加します。
editaccel ACCELERATORS
BEGIN
VK_F3, IDM_NEXT, VIRTKEY
VK_F1, IDM_HELP, VIRTKEY
"^A", IDM_ALL
END
そして、LoadAccelerators() APIを使ってこのアクセラレータテーブルを読み込みます。
メッセージループの中で、TranslateAccelerator() APIを呼び出すと、キー操作が
WM_COMMANDメッセージに変換されます。
なお、「Windowsインターフェィス アプリケーションデザインガイド」によると
以下のキー操作もサポートしたほうが良いことになっていますが、メモ帳も
サポートしてませんねぇ。
- ctrl+N……新規作成
- ctrl+O……開く
- ctrl+S……上書き保存
以下のキー操作は、自動的につきます。
ファイル名の受け取り
コマンドライン引数
コマンドライン引数の分割処理は、
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 がソースのあちこちに現れるのは見苦しいため)
これでほぼ、メモ帳の代用として使えるプログラムの完成です。
全ソース
前のページ
次のページ
一つ上のページに戻る