初回のスピンボタンの挙動について

このQ&Aのポイント
  • スピンボタンをクリックすると最初の一回目に値がマイナスされる現象が発生します。
  • INIファイルから値を読み込み、エデットボックスに表示します。
  • 再度INIファイルから値を読み込み、エデットボックスに表示します。
回答を見る
  • ベストアンサー

初回のスピンボタンの挙動

下記コードを記入し、スピンボタンの増加をクリックすると 最初の一回目に触った時のみ値がマイナスされる現象がでます。 なぜでしょうか? 1)INIファイルから値を読み込みエデットボックスに表示する。 2)スピンボタンの増加をクリックすると、最初の一回目に触った時のみ値がマイナスされる (エデットボックスの値が50だとすると49になる) 3)再度INIファイルから値を読み込みエデットボックスに表示する。 4)二回目からマイナスされない。 (エデットボックスの値が50だとすると51になる) スピンボタンのOnDeltapos UDACCEL stUD; stUD.nSec = 1; stUD.nInc = 1; // ここで変化量設定 CSpinButtonCtrl* m_Spin=(CSpinButtonCtrl*)GetDlgItem(IDC_SPIN1); m_Spin->SetRange32(0,300); //レンジ CString str; ((CEdit*)GetDlgItem(IDC_EDIT1))->GetWindowText(str);//エディットから文字列を int a=atoi(str);//文字列を数字に変換 m_Spin->SetPos(a); //初期値 m_Spin->SetAccel(1,&stUD);//変化量 m_Spin->SetBuddy((CSpinButtonCtrl*)GetDlgItem(IDC_EDIT1));//エディットに関連付け 環境 Windwos XP,Microsoft Visual C++ 6.0

  • obone
  • お礼率51% (111/215)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

提示されたコードは、初期化に相当するコードでしょうから、スピンボタンがクリックされるたびに呼び出されるOnDeltaposで処理するのは不適切ではないですか? おそらく、原因は、最初にスピンボタンがクリックされた時には、SetRange32が呼び出されていないため、初期状態の動作である減算を行っていて、その処理の途中でSetRange32しただけでは、すでに開始されている減算の処理を変えることはできないということでしょう。 初期化処理は、ダイアログならOnInitDialog、ビューならOnInitialUpdateなどで行うべきでしょう。

obone
質問者

お礼

OnInitDialogでうまくなりました。 ありがとうございました。

関連するQ&A

  • MFCのエディットボックスの値をスピンボタン

    エディットボックスの値をスピンボタンの初期値にしたく、 下記コーディングにしたのですが CString Item; m_Spin->SetPos(((CEdit*)GetDlgItem(IDC_EDIT1))->GetWindowText(Item)); SetPos' : 1 番目の引数を 'void' から 'int' に変換できません。 とのエラーになります。 どのように変更したらよいかお教えください。

  • VC++ MFC スピンボタンについて

    VC++ .NET2005でプログラムを作成中です。 スピンボタンで「1~100」までを指定するものがあり、 ※スピンボタン(IDC_SPIN1)、エディットボックス(IDC_SPNED1) スピンボタンで指定されたものを別のエディットボックス(IDC_EDIT1)内に「0」を指定分CStringで表示したいです。 例: スピンボタンで5を指定 ↓ 00000 スピンボタンで15を指定 ↓ 000000000000000 どのようなプログラムにしたらよいのでしょうか? よろしくお願いします。

  • スピンボタンとエディットボックスの連携

    VC++でスピンボタンを押すと値が1増えて、それが計算式に反映され、エディットボックスの値を変えるとそれも計算式に反映される。 というスピンボタンとエディットボックスを連携したプログラムの作成が上手くいきません。 エディットボックスのメッセージは何を用いればいいのでしょうか。具体的にはエディットボックスに値を入力し、エンターキーをクリックした時にすぐに計算式を実行できるようにしたいのですができません。そのやり方がわかりません。 できたとしてもスピンボタンとの連携が上手くいきません。何かよい方法はないか教えてください。

  • visualC++での文法

    VisualC++を勉強しているのですがどうしても分からないので教えてください。例えばダイアログベースでのMFCプロジェクト test を作り、コントロールにプッシュボタンとエディットボックスを配置し、プッシュボタンのイベントハンドラに void CtestDlg::OnBnClickedButton1() { CEdit* Settext =(CEdit*)GetDlgItem(IDC_EDIT1); Settext -> SetWindowText("OKWEB"); } とすれば、プッシュボタンを押したときにエディットボックスにOKWEBと表示されますよね。 この場合のCEdit* Settext =(CEdit*)GetDlgItem(IDC_EDIT1); の(CEdit*)は何なのでしょうか?最初のCEdit* はSettextがCEdit*クラスを示すポインタになるのは理解できるのですが、(CEdit*)はオブジェクトでそれがGetDlgItemを使っているのでしょうか。それならば、(CEdit*).GetDlgItem(IDC_EDIT1) じゃないのでしょうか?それとも(CEdit*)はキャストか何かなのでしょうか? C++の勉強が足りないのは分かってるのですが、VisualC++の勉強と同時進行なのでどうも混乱しています。詳しい方どうかお願いします。

  • VC++2010 GDIオブジェクトの解放方法

    現在、VC++2010 MFCでアプリケーションを作成しています。 処理している内容は、ADボードから電圧値をもらい、それをエディットボックスに表示する処理ですが、タスクマネージャなどでみるとGDIオブジェクトが増加していき、9999になるとアプリケーションがフリーズしてしまいます。調べたところ、解放するプログラムが必要みたいですが、解放方法が分かりませんでしたので質問させていただきました。最初にエディットボックスのレイアウトを変更する処理をしています。 以下が今回のプログラムとなっております。 CFont* m_pFont;  CFont* m_pFont;m_pFont = new CFont; m_pFont->CreatePointFont(200,""); ((CEdit *)GetDlgItem(IDC_EDIT1))->SetFont(m_pFont); ((CEdit *)GetDlgItem(IDC_EDIT2))->SetFont(m_pFont); ((CEdit *)GetDlgItem(IDC_EDIT3))->SetFont(m_pFont); ((CEdit *)GetDlgItem(IDC_EDIT4))->SetFont(m_pFont); ((CEdit *)GetDlgItem(IDC_EDIT5))->SetFont(m_pFont); ((CEdit *)GetDlgItem(IDC_EDIT6))->SetFont(m_pFont); DeleteObject(m_pFont); SetTimer(1,1000,NULL); 以下が毎秒処理となっております。 void Power_Noise::OnTimer(UINT_PTR nIDEvent) { m_nRet = m_pADControl->AD_In_Out(m_AD1,m_AD2,m_AD3,m_AD4,m_AD5,m_AD6); if(m_nRet == FALSE){ MessageBox("失敗"); KillTimer(1); } UpdateData(TRUE); m_xvEditVolt[0] = m_AD1; m_xvEditVolt[1] = m_AD2; m_xvEditVolt[2] = m_AD3; m_xvEditVolt[3] = m_AD4; m_xvEditVolt[4] = m_AD5; m_xvEditVolt[5] = m_AD6; UpdateData(FALSE); }

  • MFCのスピンボタンで自動関連しないで設定

    MFCのスピンボタンで自動関連指定しないでエディットボックスと関連させる 方法を教えてください。 目的 初期値はエディットボックスに表示してある。 スピンボタンを押す度にエディットボックスの値が変化する。

  • スピンボタンのSetRangeはなぜあるのか

    MFCでスピンボタンの上限下限をセットするメソッドに SetRangeとSetRange32があります。 1.SetRange32で事足りるはずなのにどうして2つあるのでしょう もともとSetRangeしかなかったのが増えたということでしょうか? 2.SetRangeで書かれているプログラムをSetRange32に変えると何か不都合が起きることが考えられますか。 3.SetRangeで範囲設定しないとスピンボタンの上矢印で値が減少し、下矢印で値が増加するという動作になります。これは仕様らしいですが、なぜこのような仕様になっているのでしょう。

  • コンパイルエラー'CObject::operator =' : private メンバ (クラス 'CObject' で宣言されている) にアクセスできません。

    現在ダイアログA,B,Cがあります。 Aにはボタン2つ([C]呼び込みボタンと[格納]ボタン)、タブがあり、 Bにはエディットボックス(IDC_EDIT1)とスピンボタン(IDC_SPIN1)が Cにもエディットボックス(IDC_EDIT2)とスピンボタン(IDC_SPIN2)があります。 BもCもスピンボタンを押すたびに数値が増減します。 それで、 Aは呼び出し元 BはAにあるタブ内に表示されるダイアログ CはAのボタン押下で呼び出されるダイアログ です。 Aのヘッダに CBDlg m_bdlg; CCDlg m_cdlg; struct aaa { int b; // Bダイアログのスピンの数値を格納する   int c; // Cダイアログの〃 }; と定義しました。 Aの[格納]ボタンを押すと構造体に格納されるようにしたいので void CADlg::OnBnClickedKakuno() { struct aaa astruct; astruct.b = m_bdlg.GetDlgItemInt(IDC_EDIT1); astruct.c = m_cdlg.GetDlgItemInt(IDC_EDIT2); } このようにしてコンパイルをしたところ ------------------------------------------------- 1>c:\program files\microsoft visual studio 8\vc\atlmfc\include\afxwin.h(1820) : error C2248: 'CObject::operator =' : private メンバ (クラス 'CObject' で宣言されている) にアクセスできません。 1> c:\program files\microsoft visual studio 8\vc\atlmfc\include\afx.h(559) : 'CObject::operator =' の宣言を確認してください。 1> c:\program files\microsoft visual studio 8\vc\atlmfc\include\afx.h(529) : 'CObject' の宣言を確認してください。 1> コンパイラでのこの診断により関数 'CCmdTarget &CCmdTarget::operator =(const CCmdTarget &)' が生成されました。 ------------------------------------------------- のようなエラーが発生しました。 どうすればよいのでしょうか? 解決法の程、ご教授いただければと思います。

  • GetDlgItemInt( ) c++

    現在MFCでウィンドウプログラムを作成しています。 現在、エディットボックス(IDC_EDIT1)が1つあり その変数に CEdit m_ed1; と、もう1つ double d_ed1; があります。 どちらもIDC_EDIT1に対する変数です。 IDC_EDIT1で入力された値(2.56)をd_ed1に代入したいのです。 d_ed1 = GetDlgItemInt(IDC_EDIT1); としたらもちろん d_ed1には [2]しか入らないわけなのですが、 これを解消するにはどうしたらよいのでしょうか。 ご教授の程お願いいたします。

  • 猫でも 20章

    LRESULTはlong型、DWORDはmsdnより、「32 ビットの符号なし整数、またはセグメント アドレスとそれに関連するオフセット」、SendMessageは返り値はLRESULT型。それで、猫でもわかるプログラミング20章(http://www.kumei.ne.jp/c_lang/sdk/sdk_20.htm)、の上のほうにリスト等の情報を取得するのに、 int getDlg(HWND hDlgWnd) { GetWindowText(GetDlgItem(hDlgWnd, IDC_EDIT1), edit_str, sizeof(edit_str)); ScrPos = GetScrollPos(GetDlgItem(hDlgWnd, IDC_SCROLL1), SB_CTL); ListNo = (int)(DWORD)SendMessage(GetDlgItem(hDlgWnd, IDC_LIST1), LB_GETCURSEL, 0L, 0L); ComboNo = (int)(DWORD)SendMessage(GetDlgItem(hDlgWnd, IDC_COMBO1), CB_GETCURSEL, 0L, 0L); return 0; } とあるのですが、SendMessageを(int)(DWORD)とキャストしているのはなぜなんでしょうか。(int)ではダメですか?

専門家に質問してみよう