C++をはじめて一ヶ月の超初心者です。エディットボックス内に浮動小数値を
表示させたいのですがint型からfloat型に変換ができず困っております。
用いている関数(?)は以下のようにしているのですが…。
int A;
CString ss0;
ss0.Format("値=%d",A);
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
int nLastPos = pEdit->GetWindowTextLength();
BOOL bFocus = FALSE;
if(::GetFocus() == pEdit->m_hWnd)
bFocus = TRUE;
GetDlgItem(IDOK)->SetFocus();
}
pEdit->SetSel(nLastPos, nLastPos);
pEdit->ReplaceSel(ss0);
この場合だとエディットボックス内に整数値は表示させることは出来るのですが浮動小数値を表示させるときにintをfloatにかえるだけでいいと思ったのですがうまくいきません。どのようにすればよいのでしょうか。よろしくお願いします。
> ss0.Format("値=%d",A);
コイツを変える必要があります。
%d ってのは整数用の書式ですので、ここを浮動小数点用の書式にしなければなりません。
MSDN で、printf の型フィールド文字について調べてみてください。
ひょっとしたら float 用の書式は無いかもしれませんが、その時は double 型用のをを使っちゃえ。
シャノンさんさっそくの書き込みありがとうございます。
その後自分なりにいじくっては見たのですが次のようなエラーが出てやはりうまくいきません。
warning C4244: 'initializing' : 'int' から 'float' に変換しました。データが失われているかもしれません。
error C2668: 'SetSel' : オーバーロード関数の呼び出しを解決することができません
どうやらGetDlgItem()というやつが原因のような気がするのですが…。
HWND_cdecl GetDlgItem(HWND,int)とGetDlgItemの部分をマウスであわせると
でてくるのです。このintの部分をfloatにかえればと思うのですがドコをどうかえればよいのか検討もつきません。どのようにすればいいのでしょうか。
それとも別の方法があるのでしょうか。よろしくお願いします。
> このintの部分をfloatにかえればと思うのですが
をををををっ!?
GetDlgItem の引数の int を float にですか!?
GetDlgItem ってーのは何をする関数なのか、よーく考えてみてください。
あと、現在のソースコードを載せてみてください。
ついでに、各行に、その行が何をしているのかコメントをつけて。
答えをサックリと教えるのは簡単ですが、ここでそれをやっちゃうと
後々のためにならないような気がします。
失礼いたしました。
現在のコードは以下のようになっております。
void CMatchingDlg::OnButton1()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
int A;
CDC* pDC1=m_pict1.GetDC();
CString str;
CString ss0,su;
UpdateData(TRUE);
su.Format("");
m_J1.SetWindowText(su);
UpdateWindow();
A = GetRValue(pDC1->GetPixel(m_a,m_b));
//ピクチャボックスのある座標からR値を得る
ss0.Format("A値 \r\n%d\r\n",A);
//Aという値をss0に格納
CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
//エディットボックスのポインタを得る
int nLastPos = pEdit->GetWindowTextLength();
//テキスト長を得る
BOOL bFocus = FALSE;
if(::GetFocus() == pEdit->m_hWnd){
bFocus = TRUE;
GetDlgItem(IDOK)->SetFocus();
}
pEdit->SetSel(nLastPos, nLastPos);
//位置指定
pEdit->ReplaceSel(ss0);
//ss0を出力
if(bFocus)
pEdit->SetFocus();
}
のような感じです。intはfloatに変えず表記してあります。GetDlgItem()はまったくの見当違いでした。失礼しました。プログラムはボタンを押すとピクチャボックスのある座標からR値を拾い、その値をエディットボックスに表示というものなのですが…。上記のプログラムは整数に対してはいいのですが、浮動小数で表示できるようにしたいのです。R値自体整数なのでよいのですが、割り算などを行った場合
浮動小数で表記できないと問題なのです(このプログラムに追記で別のR値を拾いその値と割り算を行い比率を表示させるようにするつもりです)。
ですからまず、浮動小数を表示させるようにしたいのですがうまくいかないのです。よろしくお願いします
ss0.Format("A値 \r\n%d\r\n",A);
で、Aがdouble、floatでも表示できるようにしたい。
ということでしょうか?
CString::Formatのヘルプを見ればよいと思います
GetDlgItem が間違いだと気づいたところで…どこを変えればいいと思いますか?
> int A;
float A;
ここと
> A = GetRValue(pDC1->GetPixel(m_a,m_b));
A = 12.3;
ここはまぁ、適当な値にしておくとして、
あと1箇所。
ちなみに今、SetSel のエラーは出てませんよね…?
書き込みありがとうございます。
int Aを float Aに ss0.Format("A値 %d\",A); を
ss0.Format("A値 %f\",A);
そして
int nLastPos = pEdit->GetWindowTextLength();を
float nLastPos = pEdit->GetWindowTextLength();としてみたんですが…。
え!?まさかこの部分{float nLastPos = pEdit->GetWindowTextLength();}が
間違っているのでしょうか。floatじゃなくても良いとか?
SetSelのエラーはintの時はでないのでこのままでも良いのでしょうか?
試してみます。アドバイスありがとうございます。
>float nLastPos = pEdit->GetWindowTextLength();
これは明らかに変です。
intのままにしましょう。
というか、関数の意味・目的を考えてないのでしょうか?
以前
> GetDlgItem ってーのは何をする関数なのか、よーく考えてみてください。
って書きましたけど、同じことを言います。
GetWindowTextLength とは何をする関数なのか、nLastPos とは何なのか、ヘルプを見ながらよーく考えてみてください。
ただやみくもに、int を float にすればいいという話ではありません。
みなさんアドバイスありがとうございます。
浮動小数をもちいる場合にintではなくfloatだと勝手に考え、関数の意味を考えず
やみくもに変更していました。上記のプログラムで
int A → float A
%d → %f
の変更だけでよかったのですね。無事エディットボックスに浮動小数値を表示することができました。これにて解決とさせていただきます。もう少し関数の意味を考えていきたいと思います。みなさん本当にありがとうございました。
ツイート | ![]() |