在派生CToolBar類的時候, 注意如果用VC6的類向導, 類列表里是沒有CToolBar的, 可以選擇CToolBarCtrl, 然后手動改為CToolBar( 參考 http://support.microsoft.com/kb/99161/en-us),
//下面的代碼是直接手寫的
#define?????? IDC_COMBOBOX????? 11111
class CToolBarEx : public CToolBar
{
?? .........//其他的類代碼省略
?? CComboBox?? m_Combo;
?? afx_msg void OnSelectComboBox();
?? DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CToolBarEx, CToolBar)
????? ON_CBN_SELENDOK(ID_COMBOBOX, OnSelectComboBox)
END_MESSAGE_MAP()
void CToolBarEx::OnSelectComboBox()
{
}
????? 在上面的一小段代碼中, 我們添加了對CBN_SELENDOK消息的處理, 這個消息是CComboBox在完成選擇后發送給父窗口的. 處理回車還需要在用戶的VK_RETURN
消息里模擬發送出這個CBN_SELENDOK消息.
????? 所以我們還需要處理PreTranslateMessage函數.函數在類頭文件的聲明略.
BOOL CToolBarEx::PreTranslateMessage(MSG* pMsg)
{
?????? if (pMsg->message == WM_KEYDOWN)
?????? {
????????????? NMHDR nm;??
????????????? nm.hwndFrom = m_hWnd;
????????????? nm.idFrom = GetDlgCtrlID();
????????????? nm.code = NM_RETURN;
????????????? switch (pMsg->wParam)
????????????? {
????????????? case VK_RETURN:
???????????????????? //發送通知消息
???????????????????? if( m_Combo.IsChild(GetFocus()) )
???????????????????? OnSelectComboBox();
???????????????????? GetOwner()->SendMessage(WM_NOTIFY, nm.idFrom, (LPARAM)&nm);
???????????????????? return TRUE;
??}
?}
?return CToolBar::PreTranslateMessage(pMsg);
}