在派生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);
}