【问题标题】:How can I validat each character entered by the user in MFC property grid control (CMFCPropertyGridCtrl)如何验证用户在 MFC 属性网格控件 (CMFCPropertyGridCtrl) 中输入的每个字符
【发布时间】:2016-09-03 16:41:04
【问题描述】:

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

【问题讨论】:

  • 是否无法覆盖 PreTranslateMessage 并在那里处理 WM_CHAR 的消息?根据文档,它支持 PTM 方法:msdn.microsoft.com/en-us/library/bb983759.aspx
  • CEdit::OnChar() 不是您想要的,也不是它的 CMFCPropertyGridCtrl 等价物。两者都无法解释来自键盘以外的其他来源的输入(例如鼠标粘贴操作)。您需要响应更改通知。
  • @IInspectable:我认为你不能通过 OnChar 做到这一点,即使它来自键盘,因为它被自己的CMFCPropertyGridCtrl::PreTranslateMessage覆盖了

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


【解决方案1】:

当您向属性的构造函数提供lpszEditMasklpszEditTemplatelpszValidChars 参数时,该属性的编辑控件将是CMFCMaskedEdit,而不是普通的CEdit。您可以确认我在CMFCPropertyGridProperty::CreateInPlaceEdit 实施时所说的话。

所以,如果我在你的位置,我会阅读 CMFCMaskedEdit 文档以了解如何输入掩码,在 CMFCPropertyGridProperty::CreateInPlaceEdit 上放置一个断点以查看当你提供 lpsz... 参数时它的行为,然后会回到这里来报告事情的进展情况。

【讨论】:

  • CMFCPropertyGridProperty::CreateInPlaceEdit 对我来说工作正常
  • CMFCPropertyGridProperty::CreateInPlaceEdit 是一个虚函数。您是否在您创建的派生类上覆盖它?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 2016-06-12
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多