2016-05-09 9 views
2

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

+1

Невозможно переопределить PreTranslateMessage и обработать сообщения для WM_CHAR? Согласно документации, она поддерживает метод PTM: https://msdn.microsoft.com/en-us/library/bb983759.aspx –

+0

'CEdit :: OnChar()' не то, что вы ищете, равно как и его Эквивалент CMFCPropertyGridCtrl. Оба не учитывали бы входные данные, поступающие из других источников, кроме клавиатуры (например, операция вставки мыши). Вам необходимо ответить на уведомления об изменениях. – IInspectable

+0

@Inpectable: Я думаю, что вы не можете сделать это через OnChar, даже если это происходит из-за клавиатуры, потому что он переопределяется собственным 'CMFCPropertyGridCtrl :: PreTranslateMessage' – sergiol

ответ

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

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

1

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

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

+0

CMFCPropertyGridProperty :: CreateInPlaceEdit отлично работает для меня –

+0

' CMFCPropertyGridProperty: : CreateInPlaceEdit' - это виртуальная функция. Вы переопределили его на производном классе, сделанном вами? – sergiol