テキストビュアー

今回は、前回のhinagataプログラムをもとにテキストビュアーを作ります。

テキストの読み込みと表示

テキストの読み込みは普通のファイル操作です。 textbufに読み込んだ後、改行文字を探して行先頭アドレスをlinebufにセットします。 また改行文字は'\0'に置き換えます。復帰文字'\r'があった場合それも置き換えます。

表示はWM_PAINTメッセージへの応答で行います。文字列の表示に使えるAPIはTextOut(),DrawText(),TabbedTextOut()などがあります。 このうちTextOut()はタブの展開が自動でできないので除外します。 行ピッチはフォントサイズから計算しています。

ソース

スクロール

スクロールバーをつけるには、CreateWindow()時に指定するウィンドウスタイルに WS_VSCROLLとWS_HSCROLLを追加します。 なお、このスクロールバーは以前出てきたスクロールバー コントロールとは違います。 (スクロールバーコントロールは一個のウィンドウですが、 今回のスクロールバーはメインウインドウの一部です。)

そしてスクロール範囲を設定します。scrollset()関数でやってます。SetScrollRange() APIで 範囲の設定、SetScrollPos() APIでつまみの初期位置を指定します。 横スクロールの範囲指定のためにはテキストの最大桁数を知る必要があるので、 readtext()時に調べています。(変数maxlen)

スクロールバーが動かされた時の処理を追加します。MainWClass_OnVScroll()および MainWClass_OnHScroll()関数でやってます。ScrollWindow() APIはウィンドウをスクロールし、 その結果新たに見えるようになった場所にWM_PAINTを送ります。 WM_PAINT描画ルーチンもテキストの途中からの表示に対応できるよう変更します。 PAINTSTRUCT構造体のrcPaintメンバに描画範囲が入っているので、これを利用しています。

マウスだけでは不便なので、MainWClass_OnKey()関数内で、 キーボードの矢印キー等をスクロールバーメッセージに変換します。

ソース

右端で折り返す

右端で折り返す場合、行を分割して表示しますが、この時、日本語文字の途中で 分割しないようにしなければなりません。 右端で折り返す処理はfoldという変数で切りわけています。linecount2はこの時の 表示行数、lin1は1行の文字数です。なお、手抜きのためTabの展開後の桁数は無視 しています。そのためTabを含む行は右端が見えなくなることが起こりえます。 (Tab幅を1にすれば全部見えます。)

ソース

その他、実用化のための機能

エディタの起動とか再読み込みとか、検索とか、コマンドラインの解釈とか、 ドラッグ&ドロップとか。全部一度出てきた処理なので分かると思います。

ソース

前のページ

次のページ

一つ上のページに戻る