スポンサーサイト

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

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

にゅーてきすとえでぃたー2

2006年07月12日 01:29

自前出入力処理のエディターの続きです。


今現在スクロールとキーボード入力までは終わりますた(´∀` )
なんでこんなに時間が掛かったかというと、、、。
「画面のスクロール処理」と「何百万行もあるテキストを読み込んだときの水平スクロールバーの文字幅を決める処理の検証」で嵌りました('A`)
特に後者の方はアルゴリズムを改良したり検証したり紆余曲折した挙句、結局バイナリサーチで処理するありきたりな方法が最適!ってことが判りました orz


キーボード入力は全然簡単でしたよこれ。

IME を使わない処理は OnChar で処理して、IME を使うときは WM_IME_COMPOSITION か WM_IME_ENDCOMPOSITION で ImmGetCompositionString を呼んでIMEが管理している文字列を取得して OnChar で処理してやればOKです。

OnChar で処理するとき、IME からの入力だと入力した文字数分だけ OnChar が呼ばれちゃうのでこれを制御しないといけません。
なんでかっていうと、 WM_IME_ENDCOMPOSITION ですでに入力文字は取得できてるので OnChar も1回だけ処理できれば (・∀・)イイ ワケです。

ってなわけで OnKeyDown とかで処理フラグを立てるようにして OnChar の中で処理フラグを消せば IME の入力完了から初めて呼ばれたのか?が判るようになり、文字入力はほぼ終わりました。


あとはキャレットの位置に IME のウィンドウを表示するようにしたり(ImmSetCompositionWindow を使う)キャレットの位置に文字を埋め込むようにしたりとか細かい処理をして終了。
案外簡単ですた('A`)



入力なんかより画面のスクロール処理の方で2日も掛かっちゃいましたよ・・・。
OnHScroll や OnVScroll の度に InvalidateRect( hWnd, NULL, TRUE ) とかやっちゃうと確かに簡単に表示もスクロールも実現できます。
(もちろん、表示するときは左の位置と上の位置がどの位置(または行)の文字を表示するのか? の制御は必要)
んが!これじゃいくらなんでも処理が重過ぎるわけです('A`)

そこで使うAPIが ScrollWindowEx 。
これを使ってやればスクロールして新しく描画しないといけない分の領域だけを OnPaint で書き直せばいいので、処理は格段に軽くなります。

しかし・・・。この処理を実装したときなぜかハマリました・・・。
はまった原因は、Tab 処理です。
ScrollWindowEx 自体は別に難しいところありません。
指定した分だけ表示画像がずれて新しく描画する場所が出るだけなので。

んが、エディターの場合 Tab 位置を考慮しないといけないので、現在の左端の文字は何文字目なのか?が重要なんですね。
単純にやっちゃえば Tab の文字数の剰余を保持して、あとは普通の Tab 処理でOKだとおもうんですけど、そうは問屋が卸しません。
結構面倒な処理が必要です。・・・説明するの面倒なのでやりませんけどw


ってことで、なんとか Tab にも対応してきちんと表示できるようになりましたーヽ(´ω`)ノ

あとは OnSize のときにスクロールする必要があるのかチェックしたり、余白制御を行ったり(これも OnSize の処理の中で GetUpdateRgn とか使って正確に余白分だけ拡張した)、行に含まれる最大文字幅を取得してからソートし、正確に HSCROLL の処理をいれたりしました。



あとやらないといけないことは、、、
 ・改行処理
 ・置換処理(複数行対応の)
 ・削除処理(DELETE、BackSpace の処理)
 ・キャレット位置のテキストを画面に表示する
 ・WordBreak 処理(っていうか描画は単語単位だからすでに出来てるけど)
 ・文字入力後の文字幅制御
 ・カーソル、HOME、ENDキーの処理
 ・ショートカットキーの処理
かな?

これができれば EditBox 相当(機能としては以上あるけど)のものは出来るか。


追加で欲しい機能としては、、、
 ・行番号の表示
 ・キーワード登録
 ・検索(単語単位も)
 ・置換(単語単位も)
ってところかなー。


あと2日ってところかな。このToDoリストだと。

一番面倒な部分は大体終わったのでラストスパートです。
がんばるですよ(`・ω・´)


blog_rank
スポンサーサイト


コメント

    コメントの投稿

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

    トラックバック

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


    最近の記事


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