![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| mekhanikus |
|
||||
|
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
Попытаюсь обьяснить, чего я хочу.
Имеем диалог из ресурса:
Где "DateWnd" - свой класс окна. Хочу создать диалог:
Где "MonthWnd" - диалог из предыдущего примера. Пока пытаюсь осмыслить метод, предложенный GremlinProg в теме. |
||||
|
|||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
а я пока не понял проблемы,
что мешает создать диалог на основе второго листинга? это же обычный ресурс диалога Добавлено @ 06:46 а, начинаю понимать, т.е. надо первый диалог разместить на втором Добавлено @ 06:53 так не получится, нужно у второго перехватить событие WM_INITDIALOG и вызвать CreateDialog с параметрами первого но если уж очень хочется автоматизировать дизайнерский процесс расстановки компонент на втором диалоге, то можно временно поставить STATIC на то место, где должен быть размещен первый диалог и на WM_INITDIALOG получить его координаты, чтобы подставить их в CreateDialog Это сообщение отредактировал(а) GremlinProg - 4.4.2011, 06:54 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| mekhanikus |
|
|||
|
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
Для начала сделал так:
Регистрирую класс окна "MonthWnd" и в его WM_CREATE создаю дочерний диалог:
Чувствую - на тернистый путь встал. |
|||
|
||||
| mekhanikus |
|
||||||||||||
|
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
Регистрирую класс окна:
В процедуре инициализации переназначаю процедуру окна, прописываю USERDATA:
В основной процедуре считываю USERDATA, и вызываю DefDlgProc.
Ресурсы как в первом топике:
Диалог "YearWnd" запускается как обычно:
На месте "MonthWnd" рисуются пустые квадратики без контролов. Что я делаю не так? |
||||||||||||
|
|||||||||||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| mekhanikus |
|
||||||
|
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
Просто, понятно, лаконично... Пойдем другим путем. Регистрируем класс окна:
В момент создания окна делаем следующее:
Так работает, диалоги появляются. Теперь надо убить окно инициализации диалога (желательно самоубийство Первый пункт, думаю, освою сам. А, вот со вторым пунктом пока проблемы, надо листать букварь. |
||||||
|
|||||||
| mekhanikus |
|
||||
|
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
Со вторым пунктом разобрался:
Окно инициализации убиваю на очистке фона:
Может быть это правильней делать где-нибудь в другом месте? Пока все устраивает. |
||||
|
|||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
если я правильно понял вопрос, вот такая обработка WM_CREATE просто не создаст окно, и не придется его удалять а место и в самом деле неподходящее, не надо так делать -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| mekhanikus |
|
|||
|
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
||||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
а в какой процедуре обрабатывается WM_ERASEBKGND? закрывается, значит одно из двух: 1. это главное окно и у него в WM_DESTROY стоит PostQuitMessage, который завершает цикл обработки сообщений, т.е. в таком случае надо пересмотреть логику программы, либо перенести PostQuitMessage в то окно, закрытие которого действительно должно завершить приложение 2. при создании окна, после CreateWindow/Ex стоит проверка на валидность возвращенного дескриптора, т.е. в таком случае эту проверку надо убрать например "отложенная" посылка (PostMessage) самому себе сообщения закрытия, типа WM_CLOSE -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| mekhanikus |
|
||||||
|
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
Нет, это окно инициализации диалога MonthDlg. Дочернее от диалога YearWnd - главного окна. Все сообщения, кроме WM_CREATE и WM_ERASEBKGND, передаются в DefWindowProc.
Наверно такая проверка спрятана в процедуре CreateDialogParam. Типа если один контрол не получился, значит - все ф топку.
Попробую. Когда её посылать? |
||||||
|
|||||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
ну, опять же, если я правильно понял, то самоуничтожиться должен дочерний диалог вот на счет дочерних окон, не уверен, удалит ли WM_CLOSE такой диалог (по документации на DefWindowProc - да, а вот на DefDlgProc - по моему, все таки нет), хотя всегда можно перехватить в процедуре этого дочернего диалога WM_CLOSE и вызвать из него DestroyWindow, тогда точно удалит либо придумать какое-нить другое сообщение для удаления а посылать непосредственно в тот момент, когда требуется этот дочерний диалог удалить, сообщение будет обработано сразу, как только завершат обработку все остальные сообщения в очереди, т.е. не по возвращении PostMessage, а после всех запланированных действий окна, а значит - без каких-либо логических конфликтов -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| mekhanikus |
|
|||
|
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: 1 Всего: 1 |
Поставил PostMessage в конце обработки WM_CREATE в InitMonthProc.
Вроде бы все работает как надо: диалог создается, лишнее окно убирается. Респект GremlinProg. Вопрос можно считать решенным! |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |