2009-07-27 17 views
3

(j'utilise VS ++ 2005)MFC OnEnChange fonction de gestionnaire - boucle infinie

je mets le contrôle de zone d'édition (avec ID - ID_edit_box) sur ma boîte de dialogue, et associé (avec l'assistant de gestionnaire) deux varibles pour elle : contrôle (c_editbox) et valeur (v_editbox) variable. Aussi j'associe la fonction de gestionnaire OnEnChangeedit_box avec ce contrôle de boîte d'édition. Supposons que nous puissions entrer seulement un chiffre dans la boîte d'édition, et ce chiffre peut être 0 ou 1. Si nous entrons une autre valeur - ce que je veux, c'est que le contenu de cette boîte d'édition est automatiquement effacé, tapez n'importe quoi (en d'autres termes, l'utilisateur ne peut rien entrer sauf 0/1 dans la zone d'édition). Je fais cette vérification dans la fonction onEnChangeedit_box. Voici le code:

void CSDRDlg::OnEnChangeedit_box() 
{ 
    CWnd* pWnd; 
    CString edit_box_temp; 

    pWnd = GetDlgItem(ID_edit_box); 
    pWnd->GetWindowText(edit_box_temp); 

    if ((edit_box_temp == "0" || edit_box_temp == "1") 
    {...do something - i.e. setfocus on some other edit box } 
    else 
    { 
     pWnd->SetWindowText(""); // clear the content of edit box 
     //... any other statement below will not be executed because the 
     //above line cause again call of this function 
    } 
} 

debugger et découvrir cette ligne: pWnd->SetWindowText(""); provoque une boucle infinie parce que nous changeons le contenu du contrôle dans cette fonction qui déclenche à nouveau son appel.

Mais je change code ci-dessus comme ceci:

void CSDRDlg::OnEnChangeedit_box() 
{ 
    UpdateData(TRUE); 
    if ((v_editbox == "0" || v_editbox== "1") 
    {...do something - i.e. setfocus on some other edit box } 
    else 
    { 
     v_editbox = ""; 
     UpdateData(FALSE); 
    } 
} 

et qui fonctionne ce que je veux, mais quelqu'un peut me expliquer pourquoi, lorsque nous appelons

v_editbox = ""; 
    UpdateData(FALSE); 

qui ne provoque pas une boucle infinie .

Répondre

0

Vous devriez probablement le faire en sous-classant CEdit et filtrer les caractères non valides. par exemple:


class CSDREdit public CEdit 
{ 
    afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags); 
    DECLARE_MESSAGE_MAP() 
}; 

BEGIN_MESSAGE_MAP(CSDREdit, CEdit) 
    ON_WM_CHAR() 
END_MESSAGE_MAP() 

void CSDREdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{ 
    if (nChar != _T('0') && nChar != _T('1')) 
     return; 
    CEdit::OnChar(nChar, nRepCnt, nFlags); 
} 
1

Pourquoi ne pas Définir la valeur Min/Max à 0/1 ou Définir le type Valeur bool lorsque vous ajoutez variable pour votre EditBox