CEditとCSpinButtonCtrlとCSliderCtrlの連動

投稿日:2014年6月13日 更新日:


スポンサーリンク

リソースエディタを使用せずにコントロールを追加する場合に、数値の入力ボックスに連動するスピンボタンとスライダーを付けるサンプルです。

  • 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);
    }
}

おしまい。

関連:CSliderCtrl のドラッグ中に値を確定しないようにする

スポンサーリンク

デスクトップ用_記事下_レクタングル

デスクトップ用_記事下_レクタングル

-MFC
-

Copyright© Pelican Philosophy , 2019 All Rights Reserved Powered by STINGER.