スポンサーサイト

--年--月--日 --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

てきすとえでぃた 3

2006年06月25日 01:09

今回もまたテキストエディタの続きです。


さて、前回予告したとおり無制限のリドゥとアンドゥの実装に入りました。
まぁ、こんなもんはセオリーがあるので、実装処理自体はサクっと終わりました。

簡単に説明すると、、、
入力が来た時に書き込まれたバッファの位置と書き終えたバッファの位置を保存。
削除が来た時は削除された領域の開始位置と終了位置、それに消された内容を保存すればいいだけです。

後は自前のテンプレートのリストとかスタッククラスを併用して現在のアンドゥ位置を覚えておけば終了。

簡単ですね。


当たり前ですけど、全てのバッファを保存するような真似はしません。
そんなことやったら何メガあっても足りませんから。


実装処理自体は単純でもインターフェースとくっつけると厄介になるのがウィンドウズのいいところw
上の処理、実はそのまま乗せようとすると問題があるんですね。



コピー&ペーストやカット、DELETE キーでの削除なら何も問題ありません。
削除される場合(CUT や CLEAR などで)はEM_GETSEL とかで選択領域を取得、文が挿入される場合(PASTE など)は WM_CHAR をクラックしてコピー後の領域を保存すればいいだけです。


ここで WM_CHAR を捕まえるのは WM_KEYDOWN とかで捕まえるより効率がいいからです。
WM_KEYDOWN では IME が変換処理中にもメッセージが飛んできちゃうからですね。

あ、DELETE キーだけは WM_KEYDOWN じゃないと処理できないので、こっちで処理します。
押されてるかどうかの処理は GetKeyState(VK_DELETE) などで取得できます。


さて、それじゃ何が問題なのか?
当たり前ですけど、入力中に毎回リドゥとアンドゥ用のバッファを作成するのでは処理が重過ぎます。
(もっとも、今のPCならあまり気にするレベルじゃないかもしれませんけどね)


それではどうするか?
 ・一定時間入力が行われない
 ・改行した
 ・コピー&ペーストなど行った
 ・フォーカスを失った
など、区切りのいいところでバッファを作るのがいいでしょう。



入力はひとまずこの考えでOKです。

それじゃ削除は?
削除も基本的に入力と同じ処理でOKですね。
・・・んが!ここで問題が。


適当なテキストエディタでテキストファイルを開いて CTRL キー+ DELETE キーを押してみてください。
適当な単語単位で削除できますね。


そうです。この処理をアンドゥ出来るようにするのが一番骨が折れるのです( ´Д⊂ヽ


はじめ、何かAPIで選択領域を絞れるのか調べてみました。。
・・・特に見当たりません( ;Д⊂ヽ

ちょっと調べてみると、CTRL + カーソルキーの左 or 右 などの単語単位での移動や単語単位での削除などでどうやって単語を特定しているのか?は EditWordBreakProc というコールバックプロシージャでやってるみたいです。
これは EM_SETWORDBREAKPROC や EM_GETWORDBREAKPROC で設定や取得できるみたいです。
んが、ここでも問題が。。・・・デフォルトの WordBreakProg が無いんです( ;Д⊂ヽ


嘆いててもしょうがないので、結局全て自作してみました。
もちろん、マルチバイト文字や半角カタカナにも対応しないと意味がないので対応しました。
結構面倒でしたよこれ。。


けど、単語取得処理は後々色換えや検索で使用すると思うので作っていても損はないと思うので良かったのかもしれません(´ー` )


とりあえず、自前の EditWordBreakProc が出来たので次回はコレを利用して無制限リドゥとアンドゥを完璧に処理したいと思います。


blog_rank
スポンサーサイト


コメント

    コメントの投稿

    (コメント編集・削除に必要)
    (管理者にだけ表示を許可する)

    トラックバック

    この記事のトラックバックURL
    http://angra.blog31.fc2.com/tb.php/49-ac20334f
    この記事へのトラックバック


    最近の記事


    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。