Avatar billede dyrby Nybegynder
09. januar 2002 - 12:52 Der er 13 kommentarer og
1 løsning

Hvorfor bliver min \"OnChar\" ikke trikket

Det er sikkert mig der har overset en detalge :-|
Jeg arbejder i Visual c++ med MFC.

Med classwisarten laver jeg en OnChar ud fra WM_CHAR. mit problem er at den ikke bliver trikket? Hvis jeg laver en PreTranslateMessage() fanger jeg en WM_CHAR men min OnChar fanger ikke noget??

Jeg har nedarvet fra CComboBoxEx og har derfor en klasse MinComboBoxEx.

Hvis dette er for lidt oplysninger så skriv lige en kommentar og så kan jeg fylde lidt mere på... På fårhånd tak.
>> Dyrby
Avatar billede jpk Nybegynder
09. januar 2002 - 13:00 #1
Prøv dette i PreTranslateMessage:

BOOL CMyView::PreTranslateMessage(MSG* pMsg)
{
    if (IsDialogMessage(pMsg))
        return TRUE;
    else
        return CWnd::PreTranslateMessage(pMsg);
}

Avatar billede dyrby Nybegynder
09. januar 2002 - 13:15 #2
BOOL MinMinComboBoxEx::PreTranslateMessage(MSG* pMsg)
{
    if (IsDialogMessage(pMsg))
        return TRUE;
    else
        return CWnd::PreTranslateMessage(pMsg);
}

Har nu lige prøvet... og jeg kan se at IsDialogMessage(pMsg) == TRUE; men det gør nu ikke at:

void MinMinComboBoxEx::OnChar(bla, bla, bla)
{
}

bliver kaldt - er det mig der har misforstået noget?

>> Med tak og vh Dyrby
Avatar billede dyrby Nybegynder
09. januar 2002 - 13:20 #3
Min Headerfile (hvis det skulle hjælpe) ser således ud:

// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(MComboBoxEx)
    public:
    virtual BOOL PreTranslateMessage(MSG* pMsg);
    //}}AFX_VIRTUAL

    // Generated message map functions
    //{{AFX_MSG(MComboBoxEx)
    afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
    //}}AFX_MSG
Avatar billede dyrby Nybegynder
09. januar 2002 - 13:22 #4
MComboBoxEx er selvfølgelig det samme navn som MinMinComboBoxEx i min kode ;)
Avatar billede jpk Nybegynder
09. januar 2002 - 13:39 #5
Du skal lave en handler for ON_CBN_EDITCHANGE istedet!

Avatar billede dyrby Nybegynder
09. januar 2002 - 13:46 #6
Det er korrekt... altså at det viker, men det er IKKE en OnEditChange jeg har brug for... det er en OnChar... Men det er da muligt at jeg er nød til at fange den med PreTranslateMessage i stedet for at det kan lade sig gøre.... men hvorfor skal det være sådan... kan der svares på det er der point.
Avatar billede jpk Nybegynder
09. januar 2002 - 14:13 #7
Om det er en OnChar eller OnEditChange du får er vel ligegyldigt????
(Med mindre du vil fange <ENTER> eller lign.)

Avatar billede dyrby Nybegynder
09. januar 2002 - 14:35 #8
Nej det er det ikke.... Jeg skal filtrere i taste trykkende... og det kan man ikke i OnEditChange, fordi det indtastede allerede er kommet ind i editboxen.
Avatar billede jpk Nybegynder
09. januar 2002 - 14:54 #9
Ahh, så har du nok ikke anden udvej end at implementere det i PreTranslateMessage...

Avatar billede jpk Nybegynder
09. januar 2002 - 14:55 #10
Du kan dog måske anvende accelerators...

Avatar billede dyrby Nybegynder
09. januar 2002 - 15:35 #11
Nej det er udelukket ;-) da det skal lave er alt for omfattende til det. Men tak ellers, desuden bliver der allerede benyttet accelerators andre steder, og det skal jo ikke konfikte med det

>> vh Dyrby
Avatar billede mbulow Nybegynder
15. januar 2002 - 15:35 #12
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
Avatar billede mbulow Nybegynder
15. januar 2002 - 15:37 #13
Hehe... Jeg glemte lige punkt 1.5:

1.5) Jeg \"tegnede\" en combobox i dialog-editoren, der fik ID\'et: IDC_COMBO1
Avatar billede dyrby Nybegynder
15. januar 2002 - 16:13 #14
Tak for det bedste svar jeg har fået endnu her på experten!!!!!! Jeg har afsat lidt flere point for din ulejlighed! endnu engang tak :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester