[kaze's test] プログラミングメモ →目次


コンボボックスのエディット

 サブクラス化で、コンボボックスのエディットのフォーカスを失うイベントを取得する方法のメモです。 エディットのMFCクラスCEditの派生クラスCEditInCmbを作成します。
 
class CEditInCmb : public CEdit
{
 DECLARE_DYNAMIC(CEditInCmb)

public:
 CEditInCmb();
 virtual ~CEditInCmb();

protected:
 DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnKillFocus(CWnd* pNewWnd);
};

フォーカスを失うイベントを処理する為に、afx_msg void OnKillFocus(CWnd* pNewWnd)を実装します。
 
// CEditInCmb メッセージ ハンドラー
void CEditInCmb::OnKillFocus(CWnd* pNewWnd)
{
    CEdit::OnKillFocus(pNewWnd);

    // TODO: ここにメッセージ ハンドラー コードを追加します。
    CString strText;
    GetWindowTextW(strText);
    AfxMessageBox(strText);
}。 

コンボボックスのMFCクラスCComboBoxの派生クラスCCmbBoxを作成し、CEditInCmb m_EditInCmb;をクラスに追加します。
 
class CCmbBox : public CComboBox
{
 DECLARE_DYNAMIC(CCmbBox)

public:
 CCmbBox();
 virtual ~CCmbBox();

    CEditInCmb m_EditInCmb;

protected:
 DECLARE_MESSAGE_MAP()
public:
    afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
    afx_msg void OnDestroy();
};

OnCtlColor()で、エディットをサブクラス化します。 OnDestroy()で、エディットのサブクラス化を解除します。
 
HBRUSH CCmbBox::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
   if (nCtlColor == CTLCOLOR_EDIT)
   {
      if (m_EditInCmb.GetSafeHwnd() == NULL)
      {
          m_EditInCmb.SubclassWindow(pWnd->GetSafeHwnd());
      }
   }

    HBRUSH hbr = CComboBox::OnCtlColor(pDC, pWnd, nCtlColor);

    // TODO:  ここで DC の属性を変更してください。

    // TODO:  既定値を使用したくない場合は別のブラシを返します。
    return hbr;
}


void CCmbBox::OnDestroy()
{
    CComboBox::OnDestroy();

    // TODO: ここにメッセージ ハンドラー コードを追加します。
    if (m_EditInCmb.GetSafeHwnd() != NULL)
      m_EditInCmb.UnsubclassWindow();
}