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

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Alezis
Сообщения: 98
Зарегистрирован: 16 авг 2004, 01:10
Откуда: Минск
Контактная информация:

Как сделать так что бы при выборе в лист боксе (к примеру) количества создаваемых объёктов ( кнопок, статиков или эдитов)
они создавались чуть пониже (например), т.е. програмно в процессе выполнения программы, потом если захотел поменял количество, т.е. как это сделать, какие массивы для хранения использовать, как инициализировать и т.д.
И ещё вопрос: при вызове метода Create для той же кнопки её идентификатор(который последний параметр в Create) нуно зарегистрировать в ресурсах, так вот как сделать это именно из внутренностей программы?
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Используем 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), по прежнему актуален.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Alezis
Сообщения: 98
Зарегистрирован: 16 авг 2004, 01:10
Откуда: Минск
Контактная информация:

Спасибо большое Romeo. Вот глянул вроде андерстенд - всё вроде понял.
Ответить