несколько контролов в классе
От: Harvat  
Дата: 11.11.20 04:17
Оценка:
Доброго времени суток.
Подскажите как мне создать класс в котором я могу объединить несколько контролов?
Например в теле класса хочу создать два CEdit и потом через DDX_Control подцепить в главном окне.
Re: несколько контролов в классе
От: qaz77  
Дата: 11.11.20 10:03
Оценка:
Здравствуйте, 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,
но получается костыльно и не универсально.
Re[2]: несколько контролов в классе
От: Harvat  
Дата: 11.11.20 10:45
Оценка:
Здравствуйте, 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>но получается костыльно и не универсально.

Спасибо большое за подсказку. Попробую второй метод
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.