CComboBoxのCEditの操作

ComboBoxをドロップダウンスタイルで利用すると、エディットコントロールが利用できます。
このエディットコントロールは、通常操作できません。
PreTranslateMessage()関数を利用することで、エディットコントロールが操作できます。

最初に例を・・・
BOOL CComboBoxTest::PreTranslateMessage(MSG* pMsg) {
    char *lpClassName = new char[MAX_PATH];
    CString cName;
    CEdit *lpEdit = NULL;

    if(pMsg->message == WM_KEYDOWN){                            ←1

        CWnd *cWnd = GetFocus();                                ←2

        GetClassName(pMsg->hwnd,lpClassName ,MAX_PATH);         ←┐
        cName = CString(lpClassName);                             │
        if((cName == "Edit") && (cWnd->GetParent() == this)){     3
            //コンボボックスのエディットのポインタを取得          │
            lpEdit = (CEdit*)cWnd;                                │
        }                                                       ←┘

        switch( pMsg->wParam )  {
            case VK_ESCAPE:
                ・・・・処理・・・
                break;
            case VK_RETURN:
                ・・・・処理・・・
                break;
                ・・・・いろんなケース・・・
            default:
                break;
        }
    }
    delete lpClassName;
    return CComboBox::PreTranslateMessage(pMsg);
}
1.まず、pMsgのメンバ変数、message がWM_KEYDOWNメッセージかどうかを検証します。
2.次に、現在、フォーカスのあるコントロールのCWndのポインタをGetFocus()関数で取得します。
3.pMsgのメンバ変数hwndが何のコントロールであるかを調査します。
pMsg->hwndがEditでかつ、CWndの親がCComboBoxの派生クラスであれば、CWndをCEditにキャストします。

これで、ComboBoxのCEditを操作することが可能になります。

同じ様なことを他のコントロールに行えばいろいろな機能を実装したり、制御したりできるようになります。