UNICODEのSDIでテキストを画面に表示 – プログラミング – Home

UNICODEのSDIでテキストを画面...
 
通知
すべてクリア

[解決済] UNICODEのSDIでテキストを画面に表示


Baby Chicken
 Baby Chicken
(@Baby Chicken)
ゲスト
結合: 16年前
投稿: 45
Topic starter  

度々すみません。ご教授下さい。
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
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

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
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

訂正です(^^;)

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
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>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
 Baby Chicken
(@Baby Chicken)
ゲスト
結合: 16年前
投稿: 45
Topic starter  

bun様、Blue様
ご丁寧なご指導ありがとうございました。
以前VC++6.0でプログラム書いた時は確かUNICODEの問題でつまずくことは無かったよう
に思っています。VC++2008でやって、いきなりコンパイラに叱られ、すごく焦って質問
させて頂きました。
ありがとうございました。


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

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

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

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


返信引用
Baby Chicken
 Baby Chicken
(@Baby Chicken)
ゲスト
結合: 16年前
投稿: 45
Topic starter  

bun様
そうなのですか UNICODEで実装するようにこれからはしたいと思います。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました