如何验证用户在 MFC 属性 网格控件 (CMFCPropertyGridCtrl) 中输入的每个字符
How can I validat each character entered by the user in MFC property grid control (CMFCPropertyGridCtrl)
我一直在尝试验证和更新由 user.I 输入的属性编辑框 (CMFCPropertyGridCtrl
) 中的每个字符搜索 MSDN 并找到 PushChar()
等函数.但是那些方法并没有解决我的问题。基本上我需要为 CMFCPropertyGridCtrl
编辑框实现 CEdit::OnChar()
功能。
当您向 属性 的构造函数提供 lpszEditMask
或 lpszEditTemplate
或 lpszValidChars
参数时,属性 的编辑控件将是CMFCMaskedEdit
而不是正常的 CEdit
。您可以确认我在 CMFCPropertyGridProperty::CreateInPlaceEdit
实施中所说的内容。
所以,如果我处在你的位置,我会阅读 CMFCMaskedEdit
文档以了解如何输入掩码,在 CMFCPropertyGridProperty::CreateInPlaceEdit
上放置一个断点以查看当你提供 lpsz...
争论,然后会回到页面报告事情进展如何。
我将为此提供示例代码。在 CustomProperties.h
中,导出 class 形式 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
派生一个class并在其中实现一个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()
这将像编辑控件一样工作,您可以验证用户输入的所有字符。
我一直在尝试验证和更新由 user.I 输入的属性编辑框 (CMFCPropertyGridCtrl
) 中的每个字符搜索 MSDN 并找到 PushChar()
等函数.但是那些方法并没有解决我的问题。基本上我需要为 CMFCPropertyGridCtrl
编辑框实现 CEdit::OnChar()
功能。
当您向 属性 的构造函数提供 lpszEditMask
或 lpszEditTemplate
或 lpszValidChars
参数时,属性 的编辑控件将是CMFCMaskedEdit
而不是正常的 CEdit
。您可以确认我在 CMFCPropertyGridProperty::CreateInPlaceEdit
实施中所说的内容。
所以,如果我处在你的位置,我会阅读 CMFCMaskedEdit
文档以了解如何输入掩码,在 CMFCPropertyGridProperty::CreateInPlaceEdit
上放置一个断点以查看当你提供 lpsz...
争论,然后会回到页面报告事情进展如何。
我将为此提供示例代码。在 CustomProperties.h
中,导出 class 形式 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
派生一个class并在其中实现一个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()
这将像编辑控件一样工作,您可以验证用户输入的所有字符。