Как проверить каждый символ, введенный пользователем в элементе управления сеткой свойств MFC (CMFCPropertyGridCtrl)

Я пытался проверить и обновить каждый символ в поле редактирования свойств (CMFCPropertyGridCtrl), которое было введено пользователем. Я искал в MSDN и нашел функцию, например PushChar() и т. д. Но эти методы не решили мою проблему. По сути, мне нужно реализовать функцию CEdit::OnChar() для полей редактирования CMFCPropertyGridCtrl.
введите здесь описание изображения


person Suman Reddy    schedule 09.05.2016    source источник
comment
Нельзя ли переопределить PreTranslateMessage и там обрабатывать сообщения для WM_CHAR? Согласно документации, он поддерживает метод PTM: msdn.microsoft.com/en- нас/библиотека/bb983759.aspx   -  person Andrew Truckle    schedule 09.05.2016
comment
CEdit::OnChar() — это не то, что вам нужно, и это не эквивалентно CMFCPropertyGridCtrl. Оба не смогут учитывать ввод, поступающий из источников, отличных от клавиатуры (например, операция вставки мышью). Вам нужно ответить на уведомления об изменениях.   -  person IInspectable    schedule 09.05.2016
comment
@IInspectable: я думаю, что вы не можете сделать это с помощью OnChar, даже если он исходит с клавиатуры, потому что он переопределяется собственным CMFCPropertyGridCtrl::PreTranslateMessage   -  person sergiol    schedule 10.05.2016


Ответы (2)


Когда вы предоставляете параметры lpszEditMask, lpszEditTemplate или lpszValidChars конструктору свойства, элементом управления редактирования этого свойства будет CMFCMaskedEdit вместо обычного CEdit. Вы можете подтвердить то, что я сказал о реализации CMFCPropertyGridProperty::CreateInPlaceEdit.

Так что, если бы я был на вашем месте, я бы прочитал документацию CMFCMaskedEdit, чтобы узнать, как вводить маскирование, поставил бы точку останова на CMFCPropertyGridProperty::CreateInPlaceEdit, чтобы увидеть, как он ведет себя, когда вы вводите аргументы lpsz..., а затем вернулся бы сюда, на страницу, чтобы сообщить, как пропали вещи.

person sergiol    schedule 09.05.2016
comment
CMFCPropertyGridProperty::CreateInPlaceEdit отлично работает для меня - person Suman Reddy; 17.05.2016
comment
CMFCPropertyGridProperty::CreateInPlaceEdit — виртуальная функция. Вы переопределили его в производном классе, созданном вами? - person sergiol; 18.05.2016

Я собираюсь дать пример кода для этого. В 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()

Это будет работать как элемент управления Edit, и вы сможете проверить все символы, введенные пользователем.

person Suman Reddy    schedule 06.06.2016