[MFC] CEditとCSpinButtonCtrlとCSliderCtrlの連動

2022年12月21日

スポンサーリンク

概要

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

サンプル

各コントロールの宣言と生成。

CWnd のコントロールにメンバ変数として以下を追加し、OnCreate() で各コントロールを生成します。

int m_value;
CEdit m_edit;
CSpinButtonCtrl m_spin;
CSliderCtrl m_slider; 

CEdit の生成

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

    生成が完了したら文字数の上限設定を行う

    Microsoft Learn – CEdit:: LimitText

    m_edit.LimitText(3);  // 最大値が 100 なので, 3 文字とする.

    CSpinButtonCtrl の生成

    style には、以下を設定しておく。

    • UDS_SETBUDDYINT ・・・ 値が変わった場合に、バディに設定したウィンドウに通知されるようになる。
    style = WS_CHILD | WS_VISIBLE | UDS_ALIGNRIGHT | UDS_SETBUDDYINT;
    m_spin.Create(style, rect, this, IDC_SPIN_BUTTON_1);

    生成が完了したら、設定を行う。

    • 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 の生成

    style = WS_CHILD | WS_VISIBLE;
    m_slider.Create(style, rect, this, IDC_SLIDER_1);

    生成が完了したら、設定を行う。

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

    関連

    おしまい。

    スポンサーリンク

    C++,MFCC++,MFC

    Posted by peliphilo