スピンコントロール スピンコントロールの操作を「0.1」単位で行う方法。 あらまし スピンコントロールを使用していて、小数単位での操作を行いたくなったことはありませんか? 0.0 〜 0.1 〜 n.n のような。 そんな方法を考えてみました。 おそらくは、スピンコントロールを派生し、 「UDN_DELTAPOS」メッセージを処理したほうが美しいのでしょうが… ぼくは、怠け者なの。 まあ、こっちの方が応用効くし… ← 言い訳 説明 以後、スピンコントロールをスピン。 エディットコントロールをエディットと呼称する。 エディットとスピンの保持している値を変えることで実現。 エディットにはテキストを使用することを利用し、 あたかも小数を表示しているかのように見せかけつつ。 表示されている数値の10倍の値をスピンが持ち、操作することで実現させた これは、スピンが持つデータの第一桁を浮動小数点の値として操作することになる。 (スピンが整数しか扱えないために出た、苦肉の策) つまり。 エディット(表示上) スピン 0.0 ― 0 50.5 ― 505 100.0 ― 1000 といった関係にある。 実装 CEdit m_eMove; //エディットコントロール CSpinButtonCtrl m_spMove; //スピンコントロール と宣言があるとする。 1・作成時の初期化処理で次のように設定する。 void ○○○::InitData() { //スピンのレンジ設定値 int up = UD_MAXVAL >> 1; //仮に最大幅を設定 int low = 1 - up; //仮に最大幅を設定 //スピンの初期化 m_spMove.SetBuddy(&m_eW); //バディの設定(操作するエディットをセット) m_spMove.SetRange(low, up); //レンジのセット //エディットの初期化 m_eMove.SetSpin(&m_spW); //操作されるスピン } 2・数値のセット関数。 void ○○○::SetSpinEdit(float value) { //スピンの数値 m_spMove.SetPos((int)(value * 10.0)); //10倍の値をセット //エディットの数値 CString CStr; CStr.Format("%.1f", value); //小数一桁に絞ってフォーマット m_eMove.SetWindowText(CStr); //エディットにセット } 3.メッセージ「WM_VSCROLL」を処理する。 void ○○○::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { //メッセージ発行主が、目的のコントロールならば if((m_Spin.m_hWnd == pScrollBar->m_hWnd) && (nSBCode == SB_THUMBPOSITION)){ CString CStr; CStr.Format("%.1f", ((float)nPos * 0.1)); //10で割った値を設定 m_eMove.SetWindowText(CStr); //エディットへのセット } CDialog::OnVScroll(nSBCode, nPos, pScrollBar); } 以上。