スピンコントロール

スピンコントロールの操作を「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);
}

以上。