はじめまして、DTです。
文字列を揃えたいのですがうまくいかない
例:
strXA=-20.0; //文字列
strYA=7.60;
strXA2=-320.0; //文字列
strYA2=17.00;
以下のように表示したい
-20.0 7.60
-320.0 17.00
単純に接合にすれば、小数点を揃えない
Name1 = strXA+ + strYA;
Name2 = strXA2+ + strYA2;
結果
-20.0 7.60
-320.0 17.00 //ズレ
どうしたらいいでしょうか。
よろしくお願いします。
環境:windows XP .Net2002
>strXA=-20.0; //文字列
数値かと思いますが……
strXA=-20.0;
なら文字列かも知れませんけど。
# strXAがなにものかによりますが…。
で、どこに表示したいんですか?
また、表示したい箇所のGDIに設定しているフォントはプロポーショナルピッチですか?
固定ピッチですか?
プロポーショナルならば、
>単純に接合にすれば、小数点を揃えない
>Name1 = strXA+ + strYA;
みたいな方法では出来ませんが。
DrawText()で描画であれば、描画しようとしているテキストの矩形サイズが求められます
から、
そこから計算して始点の位置を調整することも可能でしょう。
sprintf(...)を使って、空白や数値(にして)なら
小数以下も書式設定可。
Name1, Name2 はおそらく文字列なんでしょうが、
どの関数(MFC か SDK かの区別も分らないので)で
どこに(画面、プリンター)出力したのか
分るように書いてください。
又、フォントを指定しているのならフォント名も知らせてください。
現在の条件だけなら
DrawText使い、右揃えにして、空白をタブにする
シンプルに考えるなら
プログラムはコンソールプログラムに限定
コマンドプロンプトの設定は固定ピッチフォントになっている
とした時に(そういう条件ではないという話なら条件も全て説明に入れましょう)
表示は半角英数ですると考えるとマイナスも小数点も一文字なんですから
文字数数えてスペースで位置あわせをすればよいという話になりますよね。
で、表示のときに何文字目から何文字目までに一つ目のデータを表示し、
二つ目のデータが何文字目から何文字目に収まればよいのかをデザインして
それに合うように文字数をカウントしながらつなげればよいのでは?
もしくは各行毎にsprintfを使って書式をうまく設定して合わせるとか。
printf系の書式設定は結構いろいろなことが出来るようになっているので
ちゃんと調べれば、お望みの事が出来ると思います。
何にしても出力時の条件がはっきりしていないので
今のままではそのものずばりのレスは付きにくいと思います。
コメントありがとう。
説明が不足ですがすみませんでした。
CString strXA=-20.0; //文字列
CString strYA=7.60;
CString strXA2=-320.0; //文字列
CString strYA2=17.00;
配列
Name[1] = strXA+ + strYA;
Name[2] = strXA2+ + strYA2;
…
char szMsg[40];
COLORREF crColor =RGB(129,129,129);
pDC->SetTextColor(crColor );
for(i=0; i<103; i++){
wsprintf( szMsg, Name[i], GetRValue( crColor ))
pDC->TextOut( LtestX, LtestY, szMsg);
}
単純で、別々の配列に入れって
NameX[1] = strXA;
NameX[2] = strXA2;
...
NameX[102] = strXA102;
NameY[1] = strYA;
NameY[2] = strYA2;
...
NameY[102] = strYA102;
の場合、文字を揃えるのですが、
問題:
一行で
Name[1] = strXA+ + strYA;
表示したい場合、文字の揃え可能なのでしょうか。
無理だったら、別々に表示します。
よろしくお願いします。
1、CFontを使う。
2、CreateFontで
・書体をMSゴシックにする。
・nPitchAndFamilyを、FIXED_PITCHに設定する。
でだめですか?
書体はMSゴシックで試すのがいいと思います。
要らぬ突込みかもしれませんが。
文字列だと言う話ならこうではなくて
> CString strXA=-20.0; //文字列
> CString strYA=7.60;
> CString strXA2=-320.0; //文字列
> CString strYA2=17.00;
こうではありませんか?
CString strXA=-20.0; //文字列
CString strYA=7.60;
CString strXA2=-320.0; //文字列
CString strYA2=17.00;
大した話ではないかもしれませんけれど、
提示されたコードに不備があるとコード全体に対する
信憑性も危うくなってきます。
なので提示するのであれば、内容は吟味された方が良いです。
あと、GDIに関してちゃんと勉強されていますか?
きちんと書籍なりで勉強された方が今後の為には良いような気がします。
ANC(アルファニューメリックキャラクター[0xFF 以下の文字コード])
の範囲内の文字コードしか使わない条件で、用いるフォントが
固定ピッチ(等幅)の場合では出力する時に、文字数だけで
文字の相対位置が決まりますから
文字列を連結する際に左右の文字列の長さに応じて中間の空白部の
文字数を調節することで解決するのではないかと考えます。
コメントありがとう。
> CString strXA=-20.0; //文字列
ミスです。すみませんでした。
CString strXA=-20.0; //文字列
> ・書体をMSゴシックにする。
> ・nPitchAndFamilyを、FIXED_PITCHに設定する。
何も変わりません。
>文字列を連結する際に左右の文字列の長さに応じて中間の空白部の
>文字数を調節することで解決するのではないかと考えます。
やってみました。
結果は
...
-20.0 *7.60 //マイナスの同士OK
-320.0 17.00 //マイナスの同士OK
-1.8 *1.95 //マイナスの同士OK
0.0 12.60 //フラスの同士 OK
3.6 *4.62 //フラスの同士 OK
...
一行列目:
マイナスの同士が揃えています。
フラスの同士も揃えています。
マイナス==>プラスに変わると
-1.8 *1.95 //ここから
0.0 12.60 //ここまで半角スペスようなズレ、(ここで完全表示できません。)
一文字ズレではないですが、半角スペスようなズレがあります。
”*”は半角文字
よろしくお願いします。
うーーん、
少々食い違いがあるみたいですね。
> 環境:windows XP .Net2002
1. MFCを使ってますか?
2. CViewですか?
3. フォントの設定はどうなっていますか?
使っている数字が半角数字の場合、そのさらに半角分のズレがあるのであれば、
それは固定ピッチのフォントが使われていない状態だと思います。
固定ピッチのフォントを使っていてそういうズレ方をするはずがないからです。
フォントには固定ピッチとプロポーショナルがあるとか
そういう知識はきちんとお持ちでしょうか?
もしお持ちでないなら書籍等でGDIの描画について勉強されることをお勧めします。
知識なしで闇雲に突き進んでも良いことはありません。
誤解したまま先へ先へと進んでしまう可能性が高いので。
固定ピッチのフォントを使うためにはフォントを生成する必要がありますが、
この時に引き渡すフォントの名称が間違っていると目的のフォントが見つからずに
規定のフォントが使用されてしまいます。
フォントの名称に関してはよくよく確認しないと正しいつもりで間違った名称を使って
いることがありますよ。
たとえば、MSゴシックのMSは全角英字なのか半角英字なのかとか
MSとゴシックの間にスペースがあるのかないのか、
あったとした時にそのスペースは全角なのか半角なのかとかetc...
返信の内容を見る限りではGDIに関する知識が足りない状態だと思います。
GDIに関する勉強をまずはした方がよいと思います。
その上で今の問題をどう解決するかを考えた方が結果的には近道だと思いますよ。
誤字が合ったので訂正
誤)
規定のフォントが使用されてしまいます。
正)
既定のフォントが使用されてしまいます。
strX行列とstrY行列が同時に調整しました。
-29.3 6.61 //
-23.8 8.60 //
-20.0 **11.13
-17.2 **11.10
*-5.0 **10.73
*-1.8 **11.85
**0.0 **12.60
**3.6 **14.62
*10.0 **14.61
*13.9 **11.82
うまく揃えました。
いろいろ教えていただき、ありがとうございました。