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