Страница 1 из 1

динамическое создание контролов

Добавлено: 20 сен 2004, 23:07
Alezis
Как сделать так что бы при выборе в лист боксе (к примеру) количества создаваемых объёктов ( кнопок, статиков или эдитов)
они создавались чуть пониже (например), т.е. програмно в процессе выполнения программы, потом если захотел поменял количество, т.е. как это сделать, какие массивы для хранения использовать, как инициализировать и т.д.
И ещё вопрос: при вызове метода Create для той же кнопки её идентификатор(который последний параметр в Create) нуно зарегистрировать в ресурсах, так вот как сделать это именно из внутренностей программы?

Добавлено: 21 сен 2004, 12:25
Romeo
Используем CreateWindow[Ex], где в качестве паарметра window class указываем уже зарегистрированные в Windows классы окон "BUTTON", "COMBOBOX", "EDIT", "LISTBOX", "MDICLIENT" и т.д. (см. ремарку к функции CreateWindow в MSDN). Хранить нужно в массиве те самые хэндлы, которые возвращает CreateWindow[Ex]. Зная их можно делать с окном всё, что угодно.

Если нужно установить у динамически созданного контрола resourse ID для дальнейшего message processing'а, используем SetDlgCtrlID. Новые ID в resoure.h запихивать не то, что не стоит, а просто НЕЛЬЗЯ (вообще не рекомендую править этот файл руками, если не понимаешь полностью механизма его создания и модификации редактором ресурсов). Новые ID должны быть просто целыми положительными числами, НИКАК не пересекающимися с уже существующими идентификаторами ресурсов. Для удобства можно сделать кучу define'ов и вынести их в отдельный файлик (например DynamicIDs.h).

Удаляем динамически созданные контролы с помощью Win32 API DestroyWindow.

Приём создания всех контролов статически (т.е. в редакторе ресурсов), а в ходе выполнения программы их простого показывания/скрывания от конечного пользователя (ShowWindow), по прежнему актуален.

Добавлено: 21 сен 2004, 20:09
Alezis
Спасибо большое Romeo. Вот глянул вроде андерстенд - всё вроде понял.