UNICODEのSDIでテキストを画面に表示

[戻る]
Baby Chicken 2009/05/19(火) 15:43:35
度々すみません。ご教授下さい。
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)もっとスマートなフォーマットの仕方は?
宜しくお願いします。

bun 2009/05/19(火) 16:08:12
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()を使用します。

bun 2009/05/19(火) 16:09:41
訂正です(^^;)

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()を使用します。

Blue 2009/05/19(火) 16:13:00
>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);
で終わり。

Baby Chicken 2009/05/19(火) 16:36:44
[[解決]]
bun様、Blue様
ご丁寧なご指導ありがとうございました。
以前VC++6.0でプログラム書いた時は確かUNICODEの問題でつまずくことは無かったよう
に思っています。VC++2008でやって、いきなりコンパイラに叱られ、すごく焦って質問
させて頂きました。
ありがとうございました。

bun 2009/05/20(水) 10:36:47
参考までに...
  VC++6.0まで  AppWizardのデフォルト:マルチバイト
  VC++.NET以降 AppWizardのデフォルト:ユニコード
なので、普通にやってるだけで今回の問題に直面します。

なお、WindowsXP以降(および従来のWinNT)はOS自体が、
ユニコードで動作してるらしいです。

なので、アプリケーションもユニコードで実装した方が、
OS内部での文字コード変換を省略できる分だけ、
アプリケーションの動作が高速になる模様。

Baby Chicken 2009/05/20(水) 13:52:18
bun様
そうなのですか UNICODEで実装するようにこれからはしたいと思います。

古いスレッドには追加発言できません。