エディットボックスからの数値取得(Unicode)

[戻る]
ウニコード 2007/01/28(日) 22:22:47
VS2005 Win32 API SDK C

エディットボックスからの数値取得方法についての質問です。
HWND hedit01,hedit02;//エディットボックスのハンドル
TCHAR  charbuf[64]={0};
int i;

//エディットボックスで6桁の数字を入力
GetWindowText(hedit01,charbuf,64);//charbufに格納
i=atoi((LPCSTR)charbuf);         //数値に変換してiに格納
wsprintf(charbuf, TEXT("%d") ,i);//再変換
SetWindowText(hedit02,charbuf);  //入力されたのとは別のエディットボックスに表示

で結果がhedit02のエディットボックスに6桁ではなく1桁しか表示されません。
Unicodeが原因でatoiがうまく機能せず1桁しか取得できていないようです。
Unicodeでなんとかうまく6桁の数値を取得する方法はないでしょうか?

ダイアログでないのでUnicodeに対応しているGetDlgItemInt()は使えませんでした。

上では6桁表示をやっていますが6桁数値の獲得方法が質問内容です。

επιστημη [HomePage] 2007/01/28(日) 22:59:49
atoiはUnicodeには使えません。 _wtoi を試してみて。

Blue 2007/01/29(月) 00:16:03
TCHAR型なら_ttoiを使ってください。

>i=atoi((LPCSTR)charbuf);   
このような、コンパイルを通すだけのための強引なキャストは
TCHAR型を理解していない人がよくやります。

参考
http://www.ruche-home.net/program/tips/tchar.php

シャノン 2007/01/29(月) 09:10:42
GetDlgItemInt という関数もある。

PATIO 2007/01/29(月) 13:14:38
ちなみにUnicodeとマルチバイトコードでは
扱いが全く異なるのでキャストしても使えません。
どうしてもatoiでやりたいならマルチバイトコードに変換する必要があります。
ただし、すでに皆さんが指摘しているようにUnicodeを対象に処理する方法は
あるのでそちらで行った方が正攻法ですね。
キャストはそのデータを見る見方を変えるだけで中身を替えるわけではないので
単に型合わせするのではなくて、きちんとその型で引き渡せる方法が無いのかを
考えるようにした方が良いです。
キャストはキャストしても大丈夫と言う事がわかっている時にしか使えません。
それで強引にビルドが通ってもそれは根本の解決にはなりません。

シャノン 2007/01/29(月) 16:38:16
> ダイアログでないのでUnicodeに対応しているGetDlgItemInt()は使えませんでした。

ごめん書いてあったね。
でも、CreateWindowEx で作ったメインウィンドウの上に CreateWindowEx で作ったエデ
ィットボックス置いて試したけど使えたよ。

ウニコード 2007/01/29(月) 19:03:57
[[解決]]
■επιστημηさん
すばやい返答ありがとうございます。
おかげでうまくいきました。

■Blueさん
_ttoiは<tchar.h>をincludeしたらつかえました。
参考サイトでUnicodeについてしっかり理解をしようと思います。
情報提供ありがとうございます。

■PATIOさん
返答ありがとうございます。
方法がよくわからなかったのでおかしいと思いながらキャストしてました。
これからは気をつけます。


■シャノンさん
UINT GetDlgItemInt(
  HWND hDlg,           // ダイアログボックスのハンドル
  int nIDDlgItem,      // コントロールの識別子
  BOOL *lpTranslated,  // 成功したかどうかの状態
  BOOL bSigned         // 値が符号付きか符号なしか
);
とあったのでダイアログボックスのハンドルをいれるhDlgに
何をいれればいいのか分からずエディットボックスのハンドルをいれてみて
使えなかったので使えませんでしたと書き込んでしまいました。

で、CreateWindowExでなくCreateWindowでもhDlgに親のハンドルを使えばうまく機能し
てしまいました。GetDlgItemTextも使えました。
これらは今までダイアログにしか使えないと思っていました。
貴重な情報提供ありがとうございます。

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