VC++にあるedit controlの件(’14/9)
またも、VC++の関係のことです。少しずつ勉強しては簡単な部分的プログラムを書いて、
動作確認なんぞをしているところです。
早いうちに"control"について調べたんですが、その中で一番気になってきたのは"edit"
というもの。ネット上にはこれを使えば、簡単なエディタを作ることができるというご主張
がいくつかあったためです。
しかし、windows付属の「メモ帳」(私は使っていませんが)を始め、エディタには共通の
最低限の機能があり、それはメニューから選ぶ編集機能のうちの、「切り取り」「コピー」
「削除」に関してわからないことが起きて、この2週間くらい、私の中で一つのpending事
項として残ってきました。それは、
「メモ帳」の場合、上記三つの機能のいずれかを使うのは、まずは
文章から対象のセンテンスを選択(Selection)しなければならない
という大前提に係ることでした。
「メモ帳」の場合、このセンテンス選択(例えばマウスで範囲をドラッグする・・お恥ずかし
いことに今回調べるまで知らなかったのですが、あの、選択範囲のテキスト背景を黒色
にするのはwindowsの標準機能なんですね。)をすると、それをしないときは上記三つの
メニューはGRAY表示で無効になっていて、Selectionを行うと、途端に有効化します。
で、私の疑問はこのことだったんです。
Windowsの基本的アーキテクチャより、WinAPI32+VC++プログラミングでは、最も基本
的なものとしては通常、プログラムはウンドウプロシージャでメッセージ処理を行ってい
るのですが、
上記のセンテンスSelectionによるメッセージメニューGRAY⇒有効化
って、『何で判断し、それをどこでやっているのか』
という疑問が湧いて来たのでした。実は「何で判断しているか?」については「メモ帳」
はどうしているかは知りませんけど、一つ方法はすぐに発見できました。
それは、例えば、
iText = SendMessage(hWndEdit, EM_GETSEL, 0, 0);
として、edito controlに"EM_GETSEL"というメッセージを送ってやると、この関数の戻り
値iTextから
LOWORD(iText) : 選択した文字列の先頭文字番号
HIWORD(iText) : 選択した文字列の最後の文字の次の位置の番号
となりますので、HIWORD(iText) - LOWORD(iText) ≠ 0なら選択されたと判断可能と
いうわけです。
しかしながら、edit controlって自ら発しているメッセージはWM_COMMANDくらいしかな
いらしい?そして、そのedit controlが出すWM_COMMANDに付加されている情報という
のはHIWORD(wParam)に入っている「通知コード」だけ。ところがこの「通知コード」には
Selectionという情報はないんですよね。
edit control画面を作って、入力フォーカスを得る(マウスでクリックするか、あらかじめ
WM_CREATE処理でSetFocusでやっておく)と自動的に縦棒caretが出てそのままキー
ボード入力ができてしまいます。で、ビギナーの私が独学で調べた限りでは、まず
フォーカスを得たときに通知コードEN_SETFOCUSがHIWORD(wParam)にセットされた
WM_COMMANDが出、ついで一文字入力ごとにEN_UPDATEがHIWORD(wParam)に
セットされたWM_COMMANDが出ているようですね。そして、入力フォーカスを失うとそ
の時点でEN_KILLFOCUSがセットされたWM_COMMANDが出てくる・・・。
このEN_UPDATEとかEN_KILLFOCUSを用いたプログラム例はネット上にありましたし、
自分でも利用した簡単なプログラミング(EN_UPDATEについては、文字列を入力して
いくとそれに即応して一文字ずつ16進数文字コードが表示されるというもの)で確かめ
ています。
しかし、このWM_COMMANDでは上のことができない・・・。サブクラスも考えてみたん
ですが、うまい方法が思いつかない・・・。通知コードさえ出ていればとないものねだり
の私でした(^^;(むやみにやっては失敗-ランタイムエラーまたは無視(:_;))
なぜ悩んだかというと今行方不明になっている例のWindowsプログラミングという私の
バイブルみたいな本に簡易エディタに関して詳しくコード例と説明があったことだけ覚
えているからです。
で、そこが永遠のビギナーたる所以ですけど、ふと、PeekMessageのelseのところなら
できるのではないかと思いつきました。やってみたら、一つの正解。ちゃんとできてし
まいました(^^;。でも、これしか方法ないのかなぁと・・・。ネット見ても発見できなかった
ので。
ちなみに、Selectionするとwindowsの標準機能で出てくるポップアップメニューはちゃ
んとこのGray表示⇒有効化やってくれるんですねぇ。ですから、上の話は自分で作っ
たメニューバーの編集のサブメニューの話なんです。
ちなみに、上のselectionにおける先頭文字位置と文末の次の位置をリアルタイムに
表示するものを作ってみましたが、今更、改めて気が付いたことが・・・
このedit controlはES_MULTILINEとして複数行入力可能にした場合、Enterキーで次
行に行きますけど、このEnterキーは2字分に相当することをその結果から、今更な
がら思い出しました。CR(\r) LF(\n)なんですね。で、Wikipediaによると、Windowsだ
けがまだこれ?・・・マックは違うようですね。
戻る