こんにちは、はじめて質問させていただきます。
CEditで可視行の先頭は取得できますが可視行の範囲は取得できないでしょうか?
なにをしたいかというと、エディットボックスに表示されているテキスト内容が
スクロールする必要があるかどうかを知るために可視範囲が知りたいのです。
宜しくお願いします。
MSDNより
GetFirstVisibleLine
エディット コントロールの 1 番上の可視の行を取得します。
>rinさん
ありがとうございませす。
先頭ではなく、範囲が知りたいのです。
たとえば1、2、3、4、5行あり、1~4行までは表示され、5行目は不可視という感じです。
何行表示されているのかがわからないのです。
CEditクラスのメンバのGetLineLengthで取れませんか?
試していないのでなんともいえませんが
エディット内の行数が取れるようです。
文字が設定されていない場合は戻り値は1です。
またLineLengthの方は指定した行の文字数が取れるようです。
以上
右端で折り返した場合、データ上の行数と、表示行数が一致しないから
「最大、何行表示できる」って関数はなかったかと。
折り返ししないようにスタイルを設定し、
エディットそのものの表示サイズを現在使用している文字サイズで割って
最大数を計算した上で、GetFirstVisibleLineとあわせて、
どこからどこまで表示されてるかを算出するというのはどうでしょうか?
あとは、
縦スクロールバーの情報を得て、現在値を常に最大値に移動させる
とか
なんとなく私の主観ですが
折り返したとしても恐らくスクロールを適用するかどうかの
判断に使用するのではないかと受け止めているのですが
そういう意味では上記のGetLineLengthで
問題ないような気がします。
もちろんデータなどを行数ごとに表示して
データ数として行数を取得したいのであれば
rinさんのおっしゃる方法でないと無理です。
あと補足ですがもしデータを行ごとに表示、
行数を取得したいのであればListCtrlなどのクラスの
使用をお勧めします。
>tera
GetLineLengthとはGetLineCountのことですよね?
それだとすべての行数が取れるので、どの範囲までが表示されているのかがわからないの
です。
1,2,3,4行まであったとしても、それがすべて可視領域に入っているのかどうかわからな
いのです。
何行まで表示できるかはじめから分っていれば問題ないのですが。
>rin
折り返しなしだとそれはそれは困ってしまうんですよ。
文字の高さ取得して、それとエディットコントロールとの高さを計算して
何行程度はいるかを調べるのがいいのかもしれないですね。
??
よくおっしゃっている意味がわかりにくいのですが
エディットボックスの高さが不定値ってことですか??
なんとなくですが先頭の行から文字数を
ループでまわして読んでいって空文字じゃなければ~
などで文字が入っているかチェックすれば
文字が入力、表示されている行数を取得出来るのでは
ないでしょうか??
私の調査ミスかもしれないのですが
CEdit::GetLineLength ってありますでしょうか?
http://www.google.co.jp/search?hl=ja&rls=GGLJ%2CGGLJ%3A2006-27%2CGGLJ%
3Aja&q=GetLineLength+CEdit&btnG=%E6%A4%9C%E7%B4%A2&lr=lang_ja
ひっかからないのですが・・・
>rinさん
GetLineCountの間違いです。
以上。
すみません。
色々調査してて返事が遅くなってしまい申し訳ないです。
>tera
そうです。エディットボックスは可変です。
ウィンドウが広げられるとエディットボックスも
それにおおじ広くしたいのですが
その場合に可視行が分らないのです。
なので、エディットボックスの高さと幅は分っても
不可視行があるのか無いのかが分らないのです。
不可視行がないならスクロールなし
不可視行があるならスクロールあり
の判断ができないのです。
説明不足ですみません。
>tera
抜けました。
空文字はないのですが。
やっぱり文字幅で折り返しをチェックするか
文字の高さから計算するしかないのかも知れないですね。
// 可視行の範囲を検索する
m_pInfoEdit->GetRect(&editRect);
for(cnt = 0; cnt <= m_pInfoEdit->GetLineCount(); cnt++)
{
index = m_pInfoEdit->LineIndex(cnt);
chaPt = m_pInfoEdit->PosFromChar(index);
//文字の先頭が表示範囲より外の場合
if(chaPt.y >= editRect.bottom)
{
bSCrollBar = true;
break;
}
}
間違えて送信してしまいました。
上記の処理で可視行かどうかをチェックできました。