| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Класс окна на основе диалога. |
| Автор: mekhanikus 2.4.2011, 04:29 | ||||
| Попытаюсь обьяснить, чего я хочу. Имеем диалог из ресурса:
Где "DateWnd" - свой класс окна. Хочу создать диалог:
Где "MonthWnd" - диалог из предыдущего примера. Пока пытаюсь осмыслить метод, предложенный GremlinProg в http://forum.vingrad.ru/topic-268171.html#st_0_view_0. |
| Автор: GremlinProg 4.4.2011, 06:45 |
| а я пока не понял проблемы, что мешает создать диалог на основе второго листинга? это же обычный ресурс диалога Добавлено @ 06:46 а, начинаю понимать, т.е. надо первый диалог разместить на втором Добавлено @ 06:53 так не получится, нужно у второго перехватить событие WM_INITDIALOG и вызвать CreateDialog с параметрами первого но если уж очень хочется автоматизировать дизайнерский процесс расстановки компонент на втором диалоге, то можно временно поставить STATIC на то место, где должен быть размещен первый диалог и на WM_INITDIALOG получить его координаты, чтобы подставить их в CreateDialog |
| Автор: mekhanikus 4.4.2011, 14:57 | ||
| Для начала сделал так: Регистрирую класс окна "MonthWnd" и в его WM_CREATE создаю дочерний диалог:
Чувствую - на тернистый путь встал. |
| Автор: mekhanikus 10.4.2011, 13:45 | ||||||||||||
Регистрирую класс окна:
В процедуре инициализации переназначаю процедуру окна, прописываю USERDATA:
В основной процедуре считываю USERDATA, и вызываю DefDlgProc.
Ресурсы как в первом топике:
Диалог "YearWnd" запускается как обычно:
На месте "MonthWnd" рисуются пустые квадратики без контролов. Что я делаю не так? |
| Автор: GremlinProg 10.4.2011, 19:57 |
| Автор: mekhanikus 11.4.2011, 11:37 | ||||||
Просто, понятно, лаконично... Пойдем другим путем. Регистрируем класс окна:
В момент создания окна делаем следующее:
Так работает, диалоги появляются. Теперь надо убить окно инициализации диалога (желательно самоубийство Первый пункт, думаю, освою сам. А, вот со вторым пунктом пока проблемы, надо листать букварь. |
| Автор: mekhanikus 12.4.2011, 10:53 | ||||
Со вторым пунктом разобрался:
Окно инициализации убиваю на очистке фона:
Может быть это правильней делать где-нибудь в другом месте? Пока все устраивает. |
| Автор: GremlinProg 12.4.2011, 11:31 |
если я правильно понял вопрос, вот такая обработка WM_CREATE просто не создаст окно, и не придется его удалять а место и в самом деле неподходящее, не надо так делать |
| Автор: mekhanikus 12.4.2011, 11:40 | ||
Попробовал сделать
Приложение сразу закрывается. А как надо? Интересует именно самоуничтожение. |
| Автор: GremlinProg 12.4.2011, 12:02 |
а в какой процедуре обрабатывается WM_ERASEBKGND? закрывается, значит одно из двух: 1. это главное окно и у него в WM_DESTROY стоит PostQuitMessage, который завершает цикл обработки сообщений, т.е. в таком случае надо пересмотреть логику программы, либо перенести PostQuitMessage в то окно, закрытие которого действительно должно завершить приложение 2. при создании окна, после CreateWindow/Ex стоит проверка на валидность возвращенного дескриптора, т.е. в таком случае эту проверку надо убрать например "отложенная" посылка (PostMessage) самому себе сообщения закрытия, типа WM_CLOSE |
| Автор: GremlinProg 13.4.2011, 06:39 |
ну, опять же, если я правильно понял, то самоуничтожиться должен дочерний диалог вот на счет дочерних окон, не уверен, удалит ли WM_CLOSE такой диалог (по документации на DefWindowProc - да, а вот на DefDlgProc - по моему, все таки нет), хотя всегда можно перехватить в процедуре этого дочернего диалога WM_CLOSE и вызвать из него DestroyWindow, тогда точно удалит либо придумать какое-нить другое сообщение для удаления а посылать непосредственно в тот момент, когда требуется этот дочерний диалог удалить, сообщение будет обработано сразу, как только завершат обработку все остальные сообщения в очереди, т.е. не по возвращении PostMessage, а после всех запланированных действий окна, а значит - без каких-либо логических конфликтов |
| Автор: mekhanikus 14.4.2011, 14:31 |
| Поставил PostMessage в конце обработки WM_CREATE в InitMonthProc. Вроде бы все работает как надо: диалог создается, лишнее окно убирается. Респект GremlinProg. Вопрос можно считать решенным! |