如何验证用户在MFC属性网格控件(CMFCPropertyGridCtrl)中输入的每个字符

时间:2016-05-09 06:31:27

标签: visual-c++ mfc mfc-feature-pack

我一直在尝试验证和更新用户输入的属性编辑框(CMFCPropertyGridCtrl)中的每个字符。我搜索了MSDN并找到了PushChar()等函数。但这些方法没有解决我的问题。基本上我需要为CEdit::OnChar()编辑框实现CMFCPropertyGridCtrl功能 enter image description here

2 个答案:

答案 0 :(得分:1)

当您向属性的构造函数提供lpszEditMasklpszEditTemplatelpszValidChars个参数时,该属性的编辑控件将为CMFCMaskedEdit而非普通{ {1}}。您可以确认我在CEdit实施中所说的内容。

所以,如果我在你的位置,我会阅读CMFCPropertyGridProperty::CreateInPlaceEdit文档以了解如何输入屏蔽,在CMFCMaskedEdit上放置一个断点,以查看它在提供{{1}时的行为方式然后会回到页面来报告事情的进展情况。

答案 1 :(得分:0)

我将为此提供示例代码。在CustomProperties.h中,导出课程表单 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();
};  

还从 CEdit 派生一个类,并在其中实现 OnChar() 方法。

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()
}; 

CustomProperties.cpp中实现在头文件中声明的所有方法。

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()

这将像编辑控件一样工作,您可以验证用户输入的所有字符。