Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1035
  • Last Modified:

Combobox events with "CBS_DROPDOWN" style.

Hi,
I derive a a class from CComboBox (CMyComboBox), and in it I capture some events such as OnKillFocus, and PreTranslateMessage (in order to handle Enter-pressing, and Escape-pressing). The combo can be created with CBS_DROPDOWN style or with CBS_DROPDOWNLIST style.
If I create it with CBS_DROPDOWNLIST than everything is fine, but when using CBS_DROPDOWN style, a EditBox is created (as a child of the combobox) and The combobox itself does not get the events.
How can I handle the WM_KILLFOCUS events in CMyComboBox class when using CBS_DROPDOWN style ???

Thanks,
Yoav.
0
yoavo
Asked:
yoavo
  • 3
  • 2
  • 2
  • +1
1 Solution
 
Roshan DavisCommented:
Try this

// The following code shows how to subclass the edit control and list box
// controls inside a combo box. It uses WM_CTLCOLOR for subclassing.
// CSuperComboBox represents the combo box.
HBRUSH CSuperComboBox::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
   if (nCtlColor == CTLCOLOR_EDIT)
   {
      //Edit control
      if (m_edit.GetSafeHwnd() == NULL)
         m_edit.SubclassWindow(pWnd->GetSafeHwnd());
   }
   else if (nCtlColor == CTLCOLOR_LISTBOX)
   {
      //ListBox control
      if (m_listbox.GetSafeHwnd() == NULL)
         m_listbox.SubclassWindow(pWnd->GetSafeHwnd());
   }
   HBRUSH hbr = CComboBox::OnCtlColor(pDC, pWnd, nCtlColor);
   return hbr;
}


GOOD LUCK
0
 
yoavoAuthor Commented:
I dont think I like this solussion...
0
 
Roshan DavisCommented:
It will work
another thing is that, How can I solve a microsoft bug in a direct way....


Regards

Roshmon

0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
mblatCommented:
Did you try to everwrire REFLECTED CBN_KILLFOCUS?
In class wizard it is =CBN_KILLFOCUS?

0
 
yoavoAuthor Commented:
mblat,
You are wtite. this solves me the kill focus problem, but how can I catch enter/escape pressed ?
0
 
mblatCommented:
Did you try to everwrire REFLECTED CBN_KILLFOCUS?
In class wizard it is =CBN_KILLFOCUS?

0
 
mblatCommented:
Ok, it's not that simle actually, at list the way I know how to do it isn't. :-(

1. You need to sublclass CEdit control to CMyEdit.
2. Overwrite CMyEdit::OnGetDlgCode() and return DLGC_WANTALLKEYS from it.
3. Declare
CMyEdit m_edit as member variable of your CMyComboBox;
4. In your CMyComboBox owerwrite CMyComboBox::PreSubclassWindow.
5. After
CComboBox::PreSubclassWindow();
line put the following code:


CWnd* ce = GetWindow(GW_CHILD | GW_HWNDFIRST);
m_edit.SubclassWindow(ce->m_hWnd);

Now you can handle WM_KEYDOWN messages inside CMyEdit class...

Hope it helps...
0
 
DanRollinsCommented:
It's even easier than that:

BOOL CMyCombo::PreTranslateMessage(MSG* pMsg)
{
     if ( pMsg->message == WM_KEYDOWN) {
          if (pMsg->wParam == 27 ) {
               return(1); // eat ESC
          }
          if (pMsg->wParam == 13 ) {
               return(1); // eat Enter
          }
     }
     
     return CComboBox::PreTranslateMessage(pMsg);
}

-- Dan
0

Featured Post

VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

  • 3
  • 2
  • 2
  • +1
Tackle projects and never again get stuck behind a technical roadblock.
Join Now