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

Visual c++ 如何验证用户在MFC属性网格控件(CMFCPropertyGridCtrl)中输入的每个字符,visual-c++,mfc,mfc-feature-pack,Visual C++,Mfc,Mfc Feature Pack,我一直在尝试验证和更新用户输入的属性编辑框(CMFCPropertyGridCtrl)中的每个字符。我搜索了MSDN并找到了类似PushChar()等函数。但这些方法并没有解决我的问题。基本上,我需要为CMFCPropertyGridCtrl编辑框实现CEdit::OnChar()函数。 当您向属性的构造函数提供lpszEditMask或lpszEditTemplate或lpszValidChars参数时,该属性的编辑控件将是CMFCMaskedEdit而不是正常的CEdit。您可以确认我在CM

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

当您向属性的构造函数提供
lpszEditMask
lpszEditTemplate
lpszValidChars
参数时,该属性的编辑控件将是
CMFCMaskedEdit
而不是正常的
CEdit
。您可以确认我在
CMFCPropertyGridProperty::CreateInPlaceEdit
实现中所说的话


因此,如果我在你的位置,我会阅读
CMFCMaskedEdit
文档,了解如何输入掩蔽,在
CMFCPropertyGridProperty::CreateInPlaceEdit上放置一个断点,以查看当您提供
lpsz…
参数时它的行为,然后返回到页面报告事情是如何进行的。

我将为此提供示例代码。在
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()

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

是否无法覆盖预翻译消息并在此处处理WM_CHAR的消息?根据文档,它支持PTM方法:
CEdit::OnChar()
不是您想要的,它的
CMFCPropertyGridCtrl
等价物也不是。两者都无法解释来自键盘以外来源的输入(例如鼠标粘贴操作)。您需要响应更改通知。@IInspectable:我认为您无法通过OnChar进行响应,即使它来自键盘,因为它被自己的
CMFCPropertyGridCtrl::PreTranslateMessage
CMFCPropertyGridProperty::CreateInPlaceEdit覆盖,所以对我来说,它工作正常
CMFCPropertyGridProperty::CreateInPlaceEdit
是一个虚拟函数。您是否在自己创建的派生类上重写了它?