Пользовательский элемент управления MFC содержит другой элемент управления - сообщения не проходят - PullRequest
1 голос
/ 23 февраля 2010

У меня есть пользовательский элемент управления MFC, полученный из CWnd, который работает следующим образом:

  1. элемент управления имеет собственный OnPaint и черный фон
  2. нажатие в любом месте элемента управления приводит к тому, что элемент управления редактирования появляется в этом месте, без полей и с черным фоном, поэтому он сливается в
  3. пользователь вводит данные в это поле и нажимает клавишу ввода, поле исчезает, а пользовательская функция рисования элемента управления отображает один и тот же текст в той же позиции на фоне.

Таким образом, наш элемент управления владеет 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, не являются.

Есть ли очевидные вещи, такие как изменение флагов стиля? Иначе, почему мой пользовательский элемент управления останавливает эти события, достигая содержащегося в нем элемента редактирования?

Ответы [ 2 ]

1 голос
/ 24 февраля 2010

Я не уверен, что понимаю ситуацию, но у меня есть ряд элементов управления, которые работают примерно так же, как то, что, как я думаю, происходит, и все они работают, это возможно.

EN_CHANGE для элемента управления редактирования отправляется на ваш CWnd-производный элемент управления. Вы отражаете сообщения? Вы пробовали, если EN_CHANGE попадает в пользовательский элемент управления? Исходя из того, что вы описываете, вы ожидаете, что EN_CHANGE автоматически попадет в цепочку макросов диспетчера сообщений CCustomEdit, но это не так; Вам нужна помощь содержащего окна. Теперь MFC делает большую часть этого для вас в CDialog, но если вы катите свой собственный, вам нужно сделать это вручную или использовать макросы отражения сообщений.

0 голосов
/ 24 февраля 2010

Я нашел это ... так или иначе, мой SetEventMask () был переопределен. Я не знаю, как и где, но когда я позже добавил дополнительный вызов для проверки, большинство обработчиков событий стали вызывать.

Я могу только предположить, что ответственна только часть кода инициализации в MFC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...