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