Доброго времени суток.
Подскажите как мне создать класс в котором я могу объединить несколько контролов?
Например в теле класса хочу создать два CEdit и потом через DDX_Control подцепить в главном окне.
Здравствуйте, Harvat, Вы писали: H>Подскажите как мне создать класс в котором я могу объединить несколько контролов? H>Например в теле класса хочу создать два CEdit и потом через DDX_Control подцепить в главном окне.
Если не брать в расчет всякие windowless решения, то видится два варианта.
1. Дочерний диалог. В редакторе ресурсов делается отдельный диалог со стилем Child.
Также включаются стили Control и Control Parent (в секции Misc) — это нужно, чтобы правильно работал обход по Tab.
На него накидываются требуемые контролы.
Делается соответствующий MFC класс, наследованный от CDialog (можно генерировать ClassWizard'ом).
Биндим контролы к CEdit'ам — полям в классе дочернего диалога, у класса дочернего диалога своя DDX функция.
Тут плюшки этого подхода заканчиваются и начинаются косяки.
Надо как-то на шаблоне целевого диалога обозначить место для вставки дочернего (или нескольких).
Т.к. дочерний диалог — это отдельный шаблон в rc-файле, то напрямую сделать не получится.
Я в таких случаях делал невидимый статик в качестве плейсхолдера.
Второй минус, что создавать окно дочернего диалога придется руками, вызовом Create в OnInitDialog целевого диалога.
Там же придется брать координаты и Z-ордер плейсхолдера и применять их к окну дочернего диалога.
2. Сделать custom контрол. Делаем свое окно на базе CWnd, регистрируем оконный класс с каким-то именем.
Теперь в редакторе ресурсов целевого диалога можно располагать композитный custom-контрол указывая имя класса и стили,
а главное — координаты и Z-ордер. Никакой мороки с плейсхолдерами.
Теперь ложка дегтя. Надо в какой-то момент создавать дочерние окна нашего контрола (например, те же edit'ы).
Казалось бы, OnCreate и вперед. Но в момент создания custom контрола сообщения пойдут в оконную процедуру,
указанную при регистрации класса (Afx-Чего-то-там-Proc).
Для связи HWND контрола и message map нашего MFC класса для этого контрола должен быть вызван subclass, он же DDX_Control.
Как-то автоматизировать создание содержимого можно переопределив виртуальную функцию PreSubclassWindow,
но получается костыльно и не универсально.
Здравствуйте, qaz77, Вы писали:
Q>Здравствуйте, Harvat, Вы писали: H>>Подскажите как мне создать класс в котором я могу объединить несколько контролов? H>>Например в теле класса хочу создать два CEdit и потом через DDX_Control подцепить в главном окне.
Q>Если не брать в расчет всякие windowless решения, то видится два варианта.
Q>1. Дочерний диалог. В редакторе ресурсов делается отдельный диалог со стилем Child. Q>Также включаются стили Control и Control Parent (в секции Misc) — это нужно, чтобы правильно работал обход по Tab.
Q>На него накидываются требуемые контролы. Q>Делается соответствующий MFC класс, наследованный от CDialog (можно генерировать ClassWizard'ом). Q>Биндим контролы к CEdit'ам — полям в классе дочернего диалога, у класса дочернего диалога своя DDX функция.
Q>Тут плюшки этого подхода заканчиваются и начинаются косяки. Q>Надо как-то на шаблоне целевого диалога обозначить место для вставки дочернего (или нескольких). Q>Т.к. дочерний диалог — это отдельный шаблон в rc-файле, то напрямую сделать не получится. Q>Я в таких случаях делал невидимый статик в качестве плейсхолдера. Q>Второй минус, что создавать окно дочернего диалога придется руками, вызовом Create в OnInitDialog целевого диалога. Q>Там же придется брать координаты и Z-ордер плейсхолдера и применять их к окну дочернего диалога.
Q>2. Сделать custom контрол. Делаем свое окно на базе CWnd, регистрируем оконный класс с каким-то именем. Q>Теперь в редакторе ресурсов целевого диалога можно располагать композитный custom-контрол указывая имя класса и стили, Q>а главное — координаты и Z-ордер. Никакой мороки с плейсхолдерами.
Q>Теперь ложка дегтя. Надо в какой-то момент создавать дочерние окна нашего контрола (например, те же edit'ы). Q>Казалось бы, OnCreate и вперед. Но в момент создания custom контрола сообщения пойдут в оконную процедуру, Q>указанную при регистрации класса (Afx-Чего-то-там-Proc). Q>Для связи HWND контрола и message map нашего MFC класса для этого контрола должен быть вызван subclass, он же DDX_Control. Q>Как-то автоматизировать создание содержимого можно переопределив виртуальную функцию PreSubclassWindow, Q>но получается костыльно и не универсально.
Спасибо большое за подсказку. Попробую второй метод