Я пытался проверить и обновить каждый символ в окне редактирования свойств (CMFCPropertyGridCtrl
), который был введен пользователем. Я искал MSDN и найти функцию вроде PushChar()
и т. д. Но эти методы не помогли решить мою проблему. В основном мне нужно реализовать функцию CEdit::OnChar()
для полей редактирования CMFCPropertyGridCtrl
.
Как я могу проверить каждый символ, введенный пользователем в элементе управления сетью свойств MFC (CMFCPropertyGridCtrl)
ответ
Я собираюсь привести пример кода для этого. В 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, и вы можете проверить все символы, введенные пользователем.
Когда вы предоставляете lpszEditMask
или lpszEditTemplate
или lpszValidChars
параметров в конструктор свойства, контроль редактирования этого свойства будет CMFCMaskedEdit
вместо нормального CEdit
. Вы можете подтвердить, что я сказал в версии CMFCPropertyGridProperty::CreateInPlaceEdit
.
Итак, если бы я был на вашем месте, я бы прочитал CMFCMaskedEdit
документации, чтобы узнать, как ввести маскировка, поставить точку останова на CMFCPropertyGridProperty::CreateInPlaceEdit
, чтобы увидеть, как он ведет себя, когда вы поставить lpsz...
аргументов, а затем вернусь сюда в чтобы сообщить, как все прошло.
CMFCPropertyGridProperty :: CreateInPlaceEdit отлично работает для меня –
' CMFCPropertyGridProperty: : CreateInPlaceEdit' - это виртуальная функция. Вы переопределили его на производном классе, сделанном вами? – sergiol
Невозможно переопределить PreTranslateMessage и обработать сообщения для WM_CHAR? Согласно документации, она поддерживает метод PTM: https://msdn.microsoft.com/en-us/library/bb983759.aspx –
'CEdit :: OnChar()' не то, что вы ищете, равно как и его Эквивалент CMFCPropertyGridCtrl. Оба не учитывали бы входные данные, поступающие из других источников, кроме клавиатуры (например, операция вставки мыши). Вам необходимо ответить на уведомления об изменениях. – IInspectable
@Inpectable: Я думаю, что вы не можете сделать это через OnChar, даже если это происходит из-за клавиатуры, потому что он переопределяется собственным 'CMFCPropertyGridCtrl :: PreTranslateMessage' – sergiol