2016-05-09 4 views
2

J'ai essayé de valider et de mettre à jour chaque caractère dans la zone d'édition de propriétés (CMFCPropertyGridCtrl) qui a été entrée par l'utilisateur.J'ai recherché le MSDN et trouver une fonction comme PushChar() etc. Mais ces méthodes n'ont pas résolu mon problème. Fondamentalement, je dois mettre en œuvre la fonction CEdit::OnChar() pour les boîtes d'édition CMFCPropertyGridCtrl.
enter image description hereComment valider chaque caractère saisi par l'utilisateur dans le contrôle de grille de propriétés MFC (CMFCPropertyGridCtrl)

+1

N'est-il pas possible de surcharger PreTranslateMessage et de traiter les messages pour WM_CHAR? Selon la documentation, il prend en charge la méthode PTM: https://msdn.microsoft.com/en-us/library/bb983759.aspx –

+0

'CEdit :: OnChar()' n'est pas ce que vous cherchez, ni son Équivalent 'CMFCPropertyGridCtrl'. Les deux ne parviendraient pas à prendre en compte les entrées provenant de sources autres que le clavier (par exemple, une opération de collage de souris). Vous devez répondre aux notifications de modification. – IInspectable

+0

@IInspectable: Je pense que vous ne pouvez pas le faire via OnChar, même quand il vient du clavier, car il est remplacé par son propre 'CMFCPropertyGridCtrl :: PreTranslateMessage' – sergiol

Répondre

0

Je vais donner l'exemple de code pour cela. En CustomProperties.h, Derive une forme de classe CMFCPropertyGridProperty

class CMyEditProp : public CMFCPropertyGridProperty 
{ 
public: 
    CMyEditProp (const CString& strName, const CString& strValue, LPCTSTR lpszDescr = NULL, DWORD dwData = 0); 

protected: 
    virtual CWnd* CreateInPlaceEdit(CRect rectEdit, BOOL& bDefaultFormat); 
    virtual CString FormatProperty(); 
}; 

tire également une classe de CEdit et mettre en œuvre une méthode OnChar() en elle.

class MyEdit:public CEdit 
{ 
public: 
     void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
     { 
      if(!IsCharAlpha(nChar)) 
      return; 

      CEdit::OnChar(nChar, nRepCnt, nFlags); 
     } 
    DECLARE_MESSAGE_MAP() 
}; 

En CustomProperties.cpp Mettre en oeuvre toutes les méthodes qui ont été déclarés dans le fichier d'en-tête.

CMyEditProp ::CPasswordProp(const CString& strName, const CString& strValue, LPCTSTR lpszDescr, DWORD dwData) 
: CMFCPropertyGridProperty(strName, (LPCTSTR) strValue, lpszDescr, dwData) 
{ 
} 

CWnd* CMyEditProp ::CreateInPlaceEdit(CRect rectEdit, BOOL& bDefaultFormat) 
{ 
    MyEdit pWndEdit; 
    DWORD dwStyle = WS_VISIBLE | WS_CHILD | ES_AUTOHSCROLL ; 

    if (!m_bEnabled || !m_bAllowEdit) 
    { 
     dwStyle |= ES_READONLY; 
    } 

    pWndEdit.Create(dwStyle, rectEdit, m_pWndList, AFX_PROPLIST_ID_INPLACE); 


    bDefaultFormat = TRUE; 
    return &pWndEdit; 
} 

BEGIN_MESSAGE_MAP(MyEdit,CEdit) 
    ON_WM_CHAR() 
END_MESSAGE_MAP() 

Ceci fonctionnera comme un contrôle d'édition et vous pouvez valider tous les caractères entrés par l'utilisateur.

1

Lorsque vous fournissez lpszEditMask ou lpszEditTemplate ou lpszValidChars paramètres au constructeur d'une propriété, le contrôle d'édition de cette propriété sera une CMFCMaskedEdit au lieu d'un CEdit normal. Vous pouvez confirmer ce que j'ai dit sur la mise en œuvre CMFCPropertyGridProperty::CreateInPlaceEdit.

Donc, si j'étais à votre place, je lisais la documentation CMFCMaskedEdit pour savoir comment entrer le masquage, mettre un point d'arrêt sur CMFCPropertyGridProperty::CreateInPlaceEdit pour voir comment il se comporte lorsque vous fournissez les lpsz... arguments et viendrais revenir ici à la page pour rapporter comment les choses s'étaient passées.

+0

CMFCPropertyGridProperty :: CreateInPlaceEdit fonctionne bien pour moi –

+0

' CMFCPropertyGridProperty: : CreateInPlaceEdit' est une fonction virtuelle. L'avez-vous remplacé par une classe dérivée faite par vous? – sergiol