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
.
Comment valider chaque caractère saisi par l'utilisateur dans le contrôle de grille de propriétés MFC (CMFCPropertyGridCtrl)
Répondre
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.
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.
CMFCPropertyGridProperty :: CreateInPlaceEdit fonctionne bien pour moi –
' CMFCPropertyGridProperty: : CreateInPlaceEdit' est une fonction virtuelle. L'avez-vous remplacé par une classe dérivée faite par vous? – sergiol
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 –
'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
@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