2012-05-04 4 views
1

У меня есть модельный CDialog, который содержит элементы управления, некоторые CButtons и CScrollbar. CDialog отпадает от поля редактирования, которое я хочу постоянно держать в фокусе. Проблема заключается в том, что всякий раз, когда пользователь использует элементы управления, нажав кнопку или на полосе прокрутки, элемент управления крадет фокус из окна редактирования, заставляя как родительское окно рисовать без фокуса (скрытая строка заголовка), так и приводить к тому, что элемент управления возьмите весь ввод с клавиатуры. Есть ли способ, по которому элементы управления могут реагировать на действия мыши, но не крадут фокус?Использовать диалоговые элементы управления без кражи фокуса

Элементы управления и диалог созданы с помощью WS_CHILD. Элементы управления отформатированы в диалоговом окне, и диалог отпадает от поля редактирования.

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

ответ

1

Я долгое время не делал ничего подобного, поэтому я уверен, что есть миллион мелких деталей, но я считаю, что отправной точкой является переопределение обработки WM_MOUSEACTIVATE.

1

Я немного смущен о детях-родительских отношениях, которые вы описали. Можете ли вы объяснить, что вы имеете в виду: CDialog является родительским прочь поле редактирования, что я хочу, чтобы держать внимание во все времена

Любое окно хостинг другие окна внутри клиентской области является родителем тех окна. Невозможно создать окно без WS_CHILD, которое содержится в другом окне. Поэтому все диалоговые элементы управления являются дочерними элементами этого диалога. Также возможно, что дочернее окно содержит другое дочернее окно.

CDialog - это просто MFC-представление диалогового окна; то же самое относится к другим элементам управления. Например, CButton - это класс MFC, который обертывает дескриптор окна окна, который предопределен как управление кнопкой окна.

Диалог никогда не имеет фокуса, если не пуст (не имеет никаких элементов управления). Если в диалоговом окне содержится хотя бы один элемент управления, этот элемент управления всегда имеет фокус.

Что означает, что любое заданное окно получает сообщения мыши и клавиатуры. Только один элемент управления может иметь фокус в любой момент времени. Чтобы полоса прокрутки обрабатывала щелчок мыши или клавиатуру для перемещения слайдера, полоса прокрутки должна иметь фокус; поэтому какой-то другой контроль должен отказаться от него. Коробка с комбинированным полем (я думаю, это то, о чем вы говорите) не является дочерним элементом диалогового окна. Это всплывающее окно, которое на время имеет клавиатурный фокус и захватывает мышь. Когда он падает, диалог деактивируется, и когда выпадающий список скрывается, состояние диалогового окна изменяется на активное, поэтому фокус никогда не изменяется, он возвращается к элементу управления, который имел фокус, когда диалог был деактивирован.

То, что вы пытаетесь сделать, возможно, возможно, но для этого потребуется много кодирования. Вероятно, привязка сообщений будет выполнять эту работу, но я думаю, что это будет идти против потока.

+0

Я думаю, что вопросник означает, что 'hwndParent' диалогового окна является дескриптором окна элемента управления редактирования, который должен оставаться сфокусированным. –

+0

Да, я думаю, что вопрос имел в виду владельца/собственность, а не родителя/ребенка. Это обычное размытие терминологии, даже в документации MSDN. –

Смежные вопросы