度々すみません。ご教授下さい。
UNICODEでSDIをMFC of Visual Studio 2008 Standard on Vista SP2で作成しました。
OnDrawで画面にテキストを表示するのですが、sprintf_sで整形し出力するのですが、
int data = 100;
char cbuf[100];
sprintf_s(cbuf, 99, %02x, data);
pDC->TextOut(10, 10, cbuf);
だと、
BOOL CDC::TextOutW(int,int,const CString &)' : 3 番目の引数を 'char [100]' から
'const CString &' に変換できません。というエラーがでます。
そこで、
CString buf;として
sprintf_s(cbuf, 99, %02X, data);
buf = cbuf;
pDC->TextOut(10, 10, buf);
とするとうまく出力できましたが、
1)char*をCString*に変換する方法は?
2)もっとスマートなフォーマットの仕方は?
宜しくお願いします。
UNICODEなら、以下のどちらかで自動変換されます。
<1.ユニコード指定の場合>
wchar_t cbuf[100];
swprintf_s(cbuf, 99, _T(%02X), 0xCDA);
pDC->TextOut(10, 50, cbuf);
<2.マルチバイト/ユニコード自動変換の場合>
TCHAR cbuf[100];
_stprintf_s(cbuf, 99, _T(%02X), 0x1FA);
pDC->TextOut(10, 10, cbuf);
char や "文字列は、マルチバイト文字列です。
さらに、sprintf_s() はマルチバイト文字列用です。
ユニコード文字列では、
wchar_t や L"文字列になります。
その場合、sprintf_s()ではなく、swprintf_s()を使用します。
さらに、双方を自動変換するのが、
TCHAR や _T(")文字列になります。
その場合、sprintf_s()ではなく、_stprintf_s()を使用します。
訂正です(^^;)
UNICODEなら、以下のどちらかで自動変換されます。
<1.ユニコード指定の場合>
wchar_t cbuf[100];
swprintf_s(cbuf, 99, L%02X, data);
pDC->TextOut(10, 10, cbuf);
<2.マルチバイト/ユニコード自動変換の場合>
TCHAR cbuf[100];
_stprintf_s(cbuf, 99, _T(%02X), data);
pDC->TextOut(10, 10, cbuf);
char や "文字列は、マルチバイト文字列です。
さらに、sprintf_s() はマルチバイト文字列用です。
ユニコード文字列では、
wchar_t や L"文字列になります。
その場合、sprintf_s()ではなく、swprintf_s()を使用します。
さらに、双方を自動変換するのが、
TCHAR や _T(")文字列になります。
その場合、sprintf_s()ではなく、_stprintf_s()を使用します。
>pDC->TextOut(10, 10, cbuf);
pDC->TextOut(10, 10, CString(cbuf));
はできない?
bunさんがおっしゃる通り、CStringやMFCのクラスを使うのであれば、
TCHAR対応したコードにしたほうが良いでしょう。
マルチバイト→Unicodeの変換もせずにすむわけですし。
ちなみに、CStringクラスにはFormatメソッドがありますので、
>char cbuf[100];
>CString buf;
>sprintf_s(cbuf, 99, %02X, data);
>buf = cbuf;
>pDC->TextOut(10, 10, buf);
は
CString buf;
buf.Format(_T(%02X), data);
pDC->TextOut(10, 10, buf);
で終わり。
bun様、Blue様
ご丁寧なご指導ありがとうございました。
以前VC++6.0でプログラム書いた時は確かUNICODEの問題でつまずくことは無かったよう
に思っています。VC++2008でやって、いきなりコンパイラに叱られ、すごく焦って質問
させて頂きました。
ありがとうございました。
参考までに...
VC++6.0まで AppWizardのデフォルト:マルチバイト
VC++.NET以降 AppWizardのデフォルト:ユニコード
なので、普通にやってるだけで今回の問題に直面します。
なお、WindowsXP以降(および従来のWinNT)はOS自体が、
ユニコードで動作してるらしいです。
なので、アプリケーションもユニコードで実装した方が、
OS内部での文字コード変換を省略できる分だけ、
アプリケーションの動作が高速になる模様。
bun様
そうなのですか UNICODEで実装するようにこれからはしたいと思います。