Last Updated 2003/03/26
Programming Tips Visual C++ MFC 他のコントロール  索 引 
コンボボックスの背景色変更
2003/03/26

フォーカスを取得したら背景を白,フォーカスを失ったら背景をグレーにする.
コンボボックスはコントロールが複合されたものなので,ちょっと工夫が必要になる.
コンボボックスをサブクラス化して実現させる.

(特記部分だけを抽出)

---- CMyComboBox.h -----
class CMyComboBox : public CComboBox
{

private:
    BOOL   m_bFocused;

    afx_msg void OnKillfocus();
    afx_msg void OnSetfocus();
    afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
    afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
};

---- CMyComboBox.c -----
static COLORREF m_clrText = RGB(0, 0, 0);
static COLORREF m_clrBkgnd[2] = { RGB(255, 255, 255), RGB( 220, 220, 220) };

CMyComboBox::CMyComboBox()
{
    m_bFocused = FALSE;
}


BEGIN_MESSAGE_MAP(CMyComboBox, CComboBox)
    //{{AFX_MSG_MAP(CMyComboBox)
    ON_CONTROL_REFLECT(CBN_KILLFOCUS, OnKillfocus)
    ON_CONTROL_REFLECT(CBN_SETFOCUS, OnSetfocus)
    ON_WM_CTLCOLOR_REFLECT()
    ON_WM_CTLCOLOR()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()


void CMyComboBox::OnKillfocus() 
{
    m_bFocused = FALSE;
    Invalidate(TRUE);
}


void CMyComboBox::OnSetfocus() 
{
    m_bFocused = TRUE;
    Invalidate(TRUE);
}


HBRUSH CMyComboBox::CtlColor(CDC* pDC, UINT nCtlColor)
{
    pDC->SetTextColor( m_clrText );
    pDC->SetBkColor( m_bFocused ? m_clrBkgnd[0] : m_clrBkgnd[1] );
    return CreateSolidBrush( m_bFocused ? m_clrBkgnd[0] : m_clrBkgnd[1] );
}


HBRUSH CMyComboBox::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    pDC->SetTextColor( m_clrText );
    pDC->SetBkColor( m_bFocused ? m_clrBkgnd[0] : m_clrBkgnd[1] );
    return CreateSolidBrush( m_bFocused ? m_clrBkgnd[0] : m_clrBkgnd[1] );
}


参照
エディットコントロールの背景色
前後のTips
コンボボックスの背景色変更

DSS ProgrammingTipsCGI Ver2.02