[MFC] CEditとCSpinButtonCtrlとCSliderCtrlの連動
リソースエディタを使用せずにコントロールを追加する場合に、数値の入力ボックスに連動するスピンボタンとスライダーを付けるサンプルです。
- CWnd のコントロールにメンバ変数として以下を追加する
int m_value;
CEdit m_edit;
CSpinButtonCtrl m_spin;
CSliderCtrl m_slider; - OnCreate() で各コントロールを生成する
RECT rect = {10, 10, 100, 30}; DWORD style = WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_LEFT | ES_AUTOHSCROLL; m_edit.Create(style, rect, this, IDC_EDIT_1);
もくじ
Create() が完了したら,設定を行う
- void LimitText(int nChars == 0) ・・・ 入力文字数に制限をかける
m_edit.LimitText(3); // 最大値が 100 なので, 3 文字とする.
CSpinButtonCtrl の Create()
style には,以下を設定する
・UDS_SETBUDDYINT ・・・ 値が変わった場合に,バディに設定したウィンドウに通知されるようになる
style = WS_CHILD | WS_VISIBLE | UDS_ALIGNRIGHT | UDS_SETBUDDYINT; m_spin.Create(style, rect, this, IDC_SPIN_BUTTON_1);
Create() が完了したら,設定を行う
- void SetRange(short nLower, short nUpper) ・・・ コントロールへの最小/最大値の設定
- CWnd* SetBuddy(CWnd* pWndBuddy) ・・・ バディにコントロールを設定する
- int SetPos(int nPos) ・・・ 数値を設定する
m_spin.SetRange(0, 100); m_spin.SetBuddy(&m_edit); m_spin.SetPos(m_value);
CSliderCtrl の Create()
style = WS_CHILD | WS_VISIBLE; m_slider.Create(style, rect, this, IDC_SLIDER_1);
Create() が完了したら,設定を行う
- void SetRange(short nLower, short nUpper) ・・・ コントロールへの最小/最大値の設定
- int SetPos(int nPos) ・・・ 数値を設定する
m_slider.SetRange(0, 100); m_slider.SetPos(m_value);
スライダーの操作中もエディットボックスの数値を連動させる
CSliderCtrl のドラッグ中の値は、 OnHScroll() で取得できます
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
OnHScroll() の pScrollBar には,操作中のコントロールのポインタが渡されるので,
CSliderCtrl を GetDlgItem() で取得し,これを CScrollBar* へキャストしたものを, pScrollBar と比較します
等しい場合には, m_slider を操作しているということなので,必要な処理を行うように実装します
void CChildView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { CScrollBar* pSlider = (CScrollBar*)GetDlgItem(IDC_SLIDER_1); if (pScrollBar == pSlider) { int value = m_slider.GetPos(); if (value != m_value) { m_value = value; m_spin.SetPos(m_value); } return; } CWnd::OnHScroll(nSBCode, nPos, pScrollBar); }
エディットボックスの入力値をスライダーに連動させる
メッセージマップに以下を宣言します。
ON_EN_CHANGE(IDC_EDIT_1, OnEnChangeValue)
OnEnChangeValue() では、エディットボックスの入力値を取得し、スピンボタンとスライダーに設定する処理を行います。
void CChildView::OnEnChangeValue() { int length = m_edit.LineLength(0); WCHAR* pBuffer = new WCHAR[length + 1]; int size = m_edit.GetLine(0, pBuffer); pBuffer[size] = '\0'; int value = _wtoi(pBuffer); delete [] pBuffer; if (m_value != value) { m_value = value; m_slider.SetPos(m_value); m_spin.SetPos(m_value); } }
おしまい。
ディスカッション
ピンバック & トラックバック一覧
[…] 「CEdit と CSpinButtonCtrl と CSliderCtrl の連動」の続き 唐突にでてくるメンバ変数とかは,上記を参照してください […]
[…] CEditとCSpinButtonCtrlとCSliderCtrlの連動 – Pelikan Philosophy […]