印刷
カテゴリ: テキストエディタ作成
参照数: 373

 

カーソルの位置が画面内に収まる用に表示位置をずらすためには、

どうしても 1文字ずつ表示幅の計算が必要なので(固定幅でも文字種で表示幅は変わるから)、

横に長い場合やスクロール上限のセットを考えると一定の幅で表示幅に関する情報を格納して

あらかじめ計算しといた方が、何かと便利な気がする。

 

処理は少しややこしくなるけど、、

 現在の行クラス 

class CTextLine {

 

private:
protected:


bsize_t m_start; ///< 行先端のテキストバッファ位置
bsize_t m_end; ///< 行終端のテキストバッファ位置
bsize_t m_charcount; ///< 文字数
edit_eoltype m_eol; ///< 改行種類
CTextEdit* m_parent; ///< テキストバッファが格納されている親クラス

 

これを少し拡張

 

class CTextLine {

 

private:
protected:


bsize_t m_start; ///< 行先端のテキストバッファ位置
bsize_t m_end; ///< 行終端のテキストバッファ位置
bsize_t m_charcount; ///< 文字数
edit_eoltype m_eol; ///< 改行種類
CTextEdit* m_parent; ///< テキストバッファが格納されている親クラス
double m_width; ///< 行全体の表示幅(< 0.0 なら未計算)
/**
* @brief 表示幅キャッシュ用構造体
**/
typedef struct _width_cache_t {


bsize_t m_start; ///< 先端のテキストバッファ位置
bsize_t m_charcount; ///< 文字数
double m_width; ///< 表示幅


} width_cache_t;


std::vector<width_cache_t>* m_width_cache; ///< 表示幅のキャッシュ ///< 表示幅のキャッシュ

赤字部分が追加分。

カーソル移動で行が変わった際に、その行の最大表示幅を計算し格納しておく。

横スクロール範囲は文字単位ではなく、ピクセル単位に。