Я пытался проверить и обновить каждый символ в поле редактирования свойств (CMFCPropertyGridCtrl
), которое было введено пользователем. Я искал в MSDN и нашел функцию, например PushChar()
и т. д. Но эти методы не решили мою проблему. По сути, мне нужно реализовать функцию CEdit::OnChar()
для полей редактирования CMFCPropertyGridCtrl
.
Как проверить каждый символ, введенный пользователем в элементе управления сеткой свойств MFC (CMFCPropertyGridCtrl)
Ответы (2)
Когда вы предоставляете параметры lpszEditMask
, lpszEditTemplate
или lpszValidChars
конструктору свойства, элементом управления редактирования этого свойства будет CMFCMaskedEdit
вместо обычного CEdit
. Вы можете подтвердить то, что я сказал о реализации CMFCPropertyGridProperty::CreateInPlaceEdit
.
Так что, если бы я был на вашем месте, я бы прочитал документацию CMFCMaskedEdit
, чтобы узнать, как вводить маскирование, поставил бы точку останова на CMFCPropertyGridProperty::CreateInPlaceEdit
, чтобы увидеть, как он ведет себя, когда вы вводите аргументы lpsz...
, а затем вернулся бы сюда, на страницу, чтобы сообщить, как пропали вещи.
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, и вы сможете проверить все символы, введенные пользователем.
CEdit::OnChar()
— это не то, что вам нужно, и это не эквивалентноCMFCPropertyGridCtrl
. Оба не смогут учитывать ввод, поступающий из источников, отличных от клавиатуры (например, операция вставки мышью). Вам нужно ответить на уведомления об изменениях. - person IInspectable   schedule 09.05.2016CMFCPropertyGridCtrl::PreTranslateMessage
- person sergiol   schedule 10.05.2016