Hejsa :)
Du skal huske at den kontrol du indtaster tingene i, IKKE er comboboxen selv, men derimod en CEdit, så det er der du skal fange din OnChar.
Så hvis ikke det er et problem for dig, ud over at arbejde med din nedarvede MyComboBoxEx, også at arbejde med en nedarvet CEdit (Jeg kalder den MyEdit), så læs endelig videre.
Nu har jeg aldrig arbejdet med MFC og ClassWuzzard, så bær over med mig hvis det bliver lidt rodet :) Men jeg forklarer hvordan jeg selv har gjort, step-by-step, og så kan du jo se om du kan bruge det til noget.
1) Jeg oprettede et projekt af typen \"MFC AppWizard (exe)\", og valgte at den skal være Dialog-baseret.
2) Jeg brugte ClassWizard til at oprette to nye klasser \"MyComboBoxEx\" og \"MyEdit\" (Hvad de nedarver fra skulle være tydeligt nok ;) Hehe
3) I \"MyEdit\" tilføjede jeg MessageHandleren: WM_CHAR, så jeg fik OnChar funktionen (Jeg testede ved at sætte et break-point i OnChar)
4) I \"MyComboBoxEx\" tilføjede jeg en variabel af typen \"MyEdit\" kaldet m_MyEdit
5) Jeg tilføjede også MessageHandleren (i MyComboBoxEx): WM_CTLCOLOR
Det virker lidt underligt, men det var en løsning jeg fandt i Microsofts \"Knowledge-Base\". Det er noget med at finde et sted hvor man kan få fat i et HWND til CEdit-objectet.
(Se linket til microsoft artikel i bunden af svaret)
6) Jeg ændrede MyComboBoxEx::OnCtlColor til at se således ud:
HBRUSH MyComboBoxEx::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){
HBRUSH hbr = CComboBoxEx::OnCtlColor(pDC, pWnd, nCtlColor);
if(nCtlColor == CTLCOLOR_EDIT)
if(m_MyEdit.GetSafeHwnd() == NULL)
m_MyEdit.SubclassWindow(pWnd->GetSafeHwnd());
return hbr;
}
(Har fjernet kommentarer fra ClassWuzzard for at spare plads)
7) I \"LetsCaptureOnCharDlg\" tilføjede jeg en variabel af typen \"MyComboBoxEx\" kaldet m_MyCombo
8) I LetsCaptureOnCharDlg::OnInitDialog() tilføjede jeg følgende linje lige før \"return TRUE;\":
m_MyCombo.SubclassDlgItem(IDC_COMBO1, this);
URL til MS-artikel:
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q174667