| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > CEdit'ы в дочернем окне |
| Автор: User008 17.10.2010, 05:28 |
| Создал дочернее окно класса унаследованного от CDialog. Его эдиты не получают фокус от мыши. Как исправить? |
| Автор: Earnest 18.10.2010, 09:07 |
| Что значит "не получают фокус от мыши"? Ты тыкаешь в поле, а курсор (каретка) туда не устанавливается? Тогда проверь активность полей. |
| Автор: Earnest 22.10.2010, 16:40 |
| Кто-то возможно перехватывает клики мыши и они не попадают на обработку в эдиты. Убери весь код (закомментируй обработчики в карте), которые есть в твоем диалоге, а также PreTranslate и убедись, что все нормально. Короче, начни с "голого" диалога - только поля и никакой обработки. И на всякий случай проверь поведение шаблона в тестовом режиме редактора ресурсов - как там себя ведут поля-эдиты в этом смысле? Потом начинай понемногу наращивать функциональность и ищи, что мешает. Добавлено через 1 минуту и 24 секунды На самом деле Спай показывает, что им посылается LBUTTONDOWN, а вот доходит ли, он знать не может. |
| Автор: Dreamer_0x01 14.12.2010, 12:20 |
| Тоже столкнулся с такой проблемой. Если окно создается как Child, и у диалога стоит стиль Border:Dialog Frame, то эдиты действительно фокуса не получают, все так, как говорит автор. Обработчиков сообщений пока еще нет никаких, это голый скелет прогаммы и все что в ней есть - создание дочернего окна через Create() и показ/размещение внутри главного окна с помощью SetWindowPos(). Однако, если у окна поставить стиль Border:none, то эта проблема исчезает. Сам не понимаю, в чем дело. |
| Автор: Earnest 16.12.2010, 09:54 |
| Странно, конечно. Но сочетание DLGFRAME и CHILD само по себе какое-то странное. Если диалог дочерний, то предполагается, что он будет вставлен в какую-то оболочку: в другой диалог, в визард и т.д. Тогда стиль DLGFRAME ему не нужен - там толстая рамка и т.д. Но другой бордюр, Thin, например, скорее всего, будет работать нормально. А если диалог самостоятельный, то он никак не может быть child... Откуда задача-то возникла? |
| Автор: Dreamer_0x01 17.12.2010, 15:23 | ||
Создаем дочерние окошки, по умолчанию без рамок, все торчат внутри главного окна, все отвечают за свой функционал. Короче, это "кирпичики", из которых собирается главное окно приложения. Добавляю возможность настройки пользователем расположения этих "кирпичиков" - кнопочки, по которой окошки обзаводятся рамками, и их можно мышкой перетасовать внутри главного окна. Снова нажимаем кнопочку - окошки "прилипли" на своих местах, рамочки убрались. |
| Автор: Earnest 20.12.2010, 14:44 |
| Ясно. По взрослому, когда окошки вне главного окна, они должны быть в своих отдельных фреймах. Как MFC делает, когда панель между плавающим и прилипшим состоянием переключается: всегда есть фрейм, а дочерняя панель просто меняет парента. В MFC еще есть промежуточный контейнер, то для обеспечения конкретной задачи достаточно и одного слоя. |