MFC CEditクラスで下から上へスクロール表示

==MFC CEditクラスで下から上へスクロール表示==

Visual Studio MFCアプリを作成するときに、前からずっと有りそうで無い「永遠に追加した文字列がスクロールアップするコントロール」を作ってみました。

こう書くと、作ればいいじゃん、となるのですが、毎回SetSelで止まってしまうので、忘備録として記載しておきます。

多分同じように考えて時間を無駄に使っている方も多いのではないかと想像してます。

ダイアログベースで、下のようなCEditは定番かとおもいます。

それぞれのCEditの使い方にもよりますが、一種のモニタとして、内部外部の通信や状態を常に表示したいときに、DOSのコマンドシェル画面のように、追記さえすれば自動的に下から上へスクロールして、最新のバッファの大きさの分だけが見えるという感じにしたいことがよくあります。

その際、SetSel() で文字indexをStart、Stopで指定しますが、そのStart、Stopに具体的に何を与えるかは、MSDNにもしっかり書かれていないように思うのです。

もしここにちゃんと書いてあるよ!ってご存じの方が居られたら教えていただけると嬉しいです。 そもそも昨今はMFCよりC#が多くなり、資料も大変見にくくなってると思うのは私だけではないはず。 拡張に次ぐ拡張で広く浅くエンジニアには辛い状況になってますね。

で、本題。

ここで57番から66番の10行が表示されてて、次に67,68番目を表示するときは、57番58番などの上の方の古いデータを消して、下から順に追加されて上へスクロールさせます。

これだけのことです。

int nLineCount = m_editMon.GetLineCount();
int endpos = m_editMon.LineIndex(1);

if (nLineCount > 10) {
m_editMon.SetSel(0, endpos );
m_editMon.Clear();
}
endpos = m_editMon.GetWindowTextLength();
m_editMon.SetSel(endpos, endpos);
m_editMon.ReplaceSel(buf);
m_editMon.UpdateData(0);

ポイントは、m_editMon.LineIndex(1);で2行目の先頭の文字インデックスを終点としてSetSetして、先頭からClear()することでしょうか。

行文字数には\r\nなどは含まれませんが、文字indexには含まれますので注意が必要ですね。

最後へキャレットを持ってくるのもSetSel(-1,-1)をよく見かけますが、CWindのGetWindowTextLength()で全体の文字数を調べるのが安心できます。