当方、VisualC++6.0を学び始めました。
ダイアログベースの計算ソフトを作っているのですが、
スピンコントロールの設置で少しつまづいたので助言をお願いします。
スピンが無限に増え続けているのですが、
これに最大値と最小値の制限を設定したいのです。
(例えば、10~100まで)
m_spnを設定して、m_spn.SetRange (10,100);
としたのですが、うまく動作しません。
何かアドバイスがあれば お願いします。
HELPを読んでみるとわかりますが、CSpinButtonCtrlのRangeの初期値は0,100と書いてあ
ります。
ですから、スピンボタンコントロール側のプロパティで自動関連付けと数値の自動表示を
設定しているのであれば、
0から100の間で遷移するはずなのでかずよさんが書かれているような現象は起こらな
いと思います。
実際に簡単なテストプログラムを作成してみましたが、無限に増え続けると言うようなこ
とは起こりませんでした。
また、SetRangeによる設定も特に問題なく動作しています。
ここであげている以外の部分でまずい所があって動いていないのかもしれませんが、
今、書かれている内容からだけでは何ともコメントのしようがありません。
長いコード全部あげられても困りますが、全体が見渡せる程度のコードの提示は必要です。
何処を省略していいのかわからないのであれば、全部あげるしかないですけれど。
丁寧な返信、ありがとうございます。
私のスピンのプロパティを見てみると、自動関連のボックスにチェックがありませんで
した。
そもそも、自動関連の機能をうまく使えていないのでこのような形になっているという
ことがわかりましたが、
自動関連にチェックを入れると、スピンの位置が変化してしまうのです。
このような現象が起きてしまい、自動関連をすることができません。
いま、こちらでも試行錯誤やっていますので、できたらor何かエラーが起きたらまた返
信します。
>自動関連にチェックを入れると、スピンの位置が変化してしまうのです。
どう変化するのか具体的に書いてください。
自動関連は、コントロールのTABオーダーに関連して行われます。
基本的に関連付けられるエディットコントロールやスタティックコントロールと
スピンコントロールはTABオーダーで続きになっている必要があり、
スピンコントロールの直前にあるコントロールに関連付けられます。
この辺のコントロールがうまく行っていないのではないかと思います。
配置の設定を「アタッチしない」以外にしていると関連付けされたコントロールの
サイズが自動調整されたり、スピンコントロールの位置が勝手に動いたりしますが、
この事を言っているのではないですか?
TABオーダーの調整は、レイアウトメニューのタブオーダーで出来ます。
この時に1と表示されているコントロールが表示直後にフォーカスを受け取るコントロー
ルです。
以降、表示されている番号順になります。
スピンボタンコントロールの自動関連付けを使う場合、
スピンコントロールの番号の直前の番号が関連付けされるコントロールに振られている
必要があります。
この辺は、画面を見ながら調整し見てください。
PATIOさん、おはようございます。
昨日はたくさんのアドバイスありがとうございました!
今日、教えてもらったとおりにTABオーダーの調整をしました。
やっと意味がわかって、そのあたりのことが明確になりました。
本当にありがとうございます!
しかし、無事に関連付けることができたと思ったのですが、
ちょっとエラーが出てしまってデバッグできなくなってしまいました。
解決してうまくいったらまた書き込みします。
REEさん、具体的な内容ではなく申し訳ありませんでした。
位置の変化はタブオーダーの設定で解決しました。
あとは、最大値と最小値の設定がうまくいくかどうかなので、
それが解決できたらまた返信します。
debugエラーは解決できましたが、スピンの値が無限に増えてor減少していきます。
スピンのコードは、
void CRounderror_softwareDlg::OnDeltaposSPINRw(NMHDR* pNMHDR, LRESULT*
pResult)
{
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
m_Rw += pNMUpDown -> iDelta * 0.1;
m_spnrw.SetPos((int)(m_Rw * 5));
UpdateData(FALSE);
*pResult = 0;
}
このような感じになっています。スピンはm_spnrwで、エディットボックスはm_Rwです。
何かわかる点がありましたらおねがいします。
「自動関連付け」と「数値の自動表示」を使うのであれば、
上記のコードは要らないと思いますよ。
上記のように自前でコントロールするのであれば、自分で上限や下限チェックが
いるのではないかと思います。
UDN_DELTAPOSを見ているのだと思いますが、これだと押されれば必ずメッセージが
来るのではないですか?
pNMUpDow->iPosは更新されていない可能性が高そうです。
それぞれのメッセージがどんな時に来るのかをきちんと把握して使わないと同じような
問題に突き当たると思いますよ。
ちなみにm_Rwはエディットボックスとかかれていますが、
正確にはエディットボックスに関連付けているdoubleか何かの変数なのでは?
この辺はきちんと区別してください。
クラスウィザードを使うとどちらのパターンでも変数を作成できてしまいますが、
コントロールそのものを示す変数とコントロールの中に保持されているデータを
受け取るための変数では意味合いが変わって来ます。
メンバー変数の追加の時に出てくるダイアログで「カテゴリ」と言うのがありますが、
ここで「コントロール」を選ぶと前者、「値」を選ぶと後者になります。
細かい話ですが、一つ一つ理解していかないとハマル原因になりますので注意してください。
まったくもっておっしゃるとおりです。
すべて当たっています。説明不足で申し訳ありませんでした。と、同時に驚いていま
す。
お忙しい中、本当に申し訳ありません。勉強になります。
やっと本題に戻れるのですが、私の最初の質問がまずかったみたいです。
自分で最大値と最小値を設定する方法が知りたかったということです。
ですので、上記のようなコードを組み、試行錯誤しておりました。
そうした方法がご存知でしたら、ご教授願います。
上記のように自分でハンドリングするのでしたら
ご自分のアプリで最大値と最小値の管理を行い、
上記のハンドラで大小チェックを行ってデフォルトの動きに合うようにコードを書いてく
ださい。
例えば、m_Rwが最大値以上にならないようにチェックして加算する。
m_Rwが最小値以下にならないようにチェックして減算する。
上記のコードを見るとCSPinButtonCtrlが内部で行っている部分を無視して
外部から全てコントロールしているように見えます。
単にボタン扱いしている感じです。
なのでそういう使い方をするのであれば、内部でやってくれているであろう部分も
外部で行わないと駄目です。
例えば、
double dbWk;
dbWk = m_Rw + (pNMUpDown->iDelta * 0.1);
if(dbWk > dbMax)
{
dbWk = dbMax;
}
if(dbWk < dbMin)
{
dbWk = dbMin;
}
m_Rw = dbWk;
UpdateData(FALSE);
今のソースを見る限りでは、
m_spnrw.SetPos((int)(m_Rw * 5));
は意味が無いと思います。
CSPinButtonCtrlの内部に保持しているpositionを使っていないようなので。
PATIOさん、ありがとうございます。
さきほど、コードを改変したところ、見事に動作しました!嬉しいです!
不適切でわかりにくい質問に丁寧に答えていただいたことに、本当に感謝します。
さらに勉強を重ね、自分でトラブルを解決できるようになりたいと思いますが、
また、今後何かトラブルがあるようなことがあればよろしくお願いします。