У меня есть пользовательский элемент управления MFC, полученный из CWnd, который работает следующим образом:
- элемент управления имеет собственный OnPaint и черный фон
- нажатие в любом месте элемента управления приводит к тому, что элемент управления редактирования появляется в этом месте, без полей и с черным фоном, поэтому он сливается в
- пользователь вводит данные в это поле и нажимает клавишу ввода, поле исчезает, а пользовательская функция рисования элемента управления отображает один и тот же текст в той же позиции на фоне.
Таким образом, наш элемент управления владеет CCustomEdit, когда вы нажимаете на фон, элемент управления либо создается, либо перемещается и становится видимым:
CCustomEdit::Show(Rect &rc,CCustomControl *pParent)
{
if ( !::IsWindow( m_hWnd ) )
{
Create( ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | ES_NOHIDESEL | ES_CENTER | ES_UPPERCASE, rc, pParent, 999 );
}
else
MoveWindow( &rc );
}
Основные части на самом деле работают нормально (и мы застряли с подходом). Но одна вещь, которая не работает, это то, что CCustomEdit
самостоятельно регистрируется для событий EN_CHANGE
и так далее. Когда CCustomEdit
создается как обычный диалоговый элемент управления (CEdit
в шаблоне диалога, связанный с DDX переменной CCustomEdit
), они работают, но в CCustomControl
они не являются.
CCustomEdit::PreSubclassWindow()
звонит SetEventmask()
, а называется вызываемым. И обработчик CCustomEdit
ON_CHAR
также вызывается для нажатия клавиш в окне редактирования, однако обработчики для сообщений окна редактирования, такие как EN_CHANGE
, не являются.
Есть ли очевидные вещи, такие как изменение флагов стиля? Иначе, почему мой пользовательский элемент управления останавливает эти события, достигая содержащегося в нем элемента редактирования?