コンボボックスのエディットサブクラス化で、コンボボックスのエディットのフォーカスを失うイベントを取得する方法のメモです。 エディットの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); }。 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(); } |