DXライブラリでの自動改行
Posted: 2012年7月09日(月) 15:23
DXライブラリを用いて、テキストファイルの読み込んで、ある一定の長さまできたら自動改行するプログラムを作りたいのです。
(例
”あいうえおかきくけこさしすせそたちつてと”
↓
”あいうえおかきくけこ”
”さしすせそたちつてと”
テキストの読み込みは問題なく出来るのですが、問題は改行の為の文字列を分割する為に必要な、適切な要素数を返すプログラムです。
が、しかし、これだとサイズの単位が1バイト、つまりchar型1つ分単位になってしまいます。
1バイトだけの記号やアルファベットなら構わないのでしょうが、
2バイト使う漢字やその他の文字がchar一つ分ずつ分割されて、文字化けしてしまいます。
ワイド文字であれば2バイトずつで良いのですが、DXライブラリはマルチバイト文字を採用しています
(もしかしたらUNICODEの方もあるのでしょうか?でも、これまで書いたほかのは全部マルチバイトだったので直す作業が大変に・・・)。
API関数を用いてワイド文字変換するしか無いのでしょうか?
他に何か良い方法があればお願い致します。
同じ文字列を、長さごとに改行したいので読み込みの際の分割は無しでお願い致します。
(例
”あいうえおかきくけこさしすせそたちつてと”
↓
”あいうえおかきくけこ”
”さしすせそたちつてと”
テキストの読み込みは問題なく出来るのですが、問題は改行の為の文字列を分割する為に必要な、適切な要素数を返すプログラムです。
//与えられた文字列と幅を元にして適切な要素数を返す関数
//widthは幅
int str_size(const int width,const std::string& buf,int font=0){
int i=0,str_len;
if(font==0){
str_len=GetDrawStringWidth(buf.c_str(),buf.size());
for(i=0;width<str_len;++i){
str_len=GetDrawStringWidth(buf.c_str(),buf.size()-i);
}
}
else{
str_len=GetDrawStringWidthToHandle(buf.c_str(),buf.size(),font);
for(i=0;width<str_len;++i){
str_len=GetDrawStringWidthToHandle(buf.c_str(),buf.size()-i,font);
}
}
return buf.size()-i;
}
//テキストを分割し表示するプログラム フォント有り
//bufはstring型を持つvector配列 コンテナだから普通はイテレータ使うべきなのかな?(要素削除したりするわけでは無いので要らないかなと思いました)
//x2-x1-40はボックスか何かに合わせた時にぴったりだと困るので両端の分(各20ずつ)の間を空けるための値
//実際はクラス関数なので引数は全部省略されます
void txt_graph(int x1,int y1,int x2,int font,std::vector<std::string> &buf){
int n=0,str_len=0,size=0;
std::string str[2];
for(unsigned int i=0;i<buf.size();i++){
str_len=GetDrawStringWidthToHandle(buf[i].c_str(),buf[i].size(),font);
if(str_len>x2-x1-40){
str[0]=buf[i];
size=0;
//設定された幅になるまで繰り返す。
while(str_len>(x2-x1-40)){
str_len=GetDrawStringWidthToHandle(str[0].c_str(),str[0].size(),font);
size=nov_size(x2-x1-40,str[0],font);
str[1]=str[0].substr(0,size); //分割した文字の代入
str[0]=str[0].substr(size); //文字の切り詰め
//テキストの描画
DrawStringToHandle(x1+20,y1+20*(i+n+1),str[1].c_str(),WHITE,font);
if(str_len>(x2-x1-40))
n++; //一つ進める
}
}else
DrawStringToHandle(x1+20,y1+20*(i+n+1),buf[i].c_str(),WHITE,font);
}
}
1バイトだけの記号やアルファベットなら構わないのでしょうが、
2バイト使う漢字やその他の文字がchar一つ分ずつ分割されて、文字化けしてしまいます。
ワイド文字であれば2バイトずつで良いのですが、DXライブラリはマルチバイト文字を採用しています
(もしかしたらUNICODEの方もあるのでしょうか?でも、これまで書いたほかのは全部マルチバイトだったので直す作業が大変に・・・)。
API関数を用いてワイド文字変換するしか無いのでしょうか?
他に何か良い方法があればお願い致します。
同じ文字列を、長さごとに改行したいので読み込みの際の分割は無しでお願い致します。