Здравствуйте, 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,
но получается костыльно и не универсально.