В VBA UserForm - это просто пользовательский класс (с некоторыми событиями и свойствами) и со встроенным пользовательским интерфейсом. Я тоже хотел бы создать собственный класс со встроенным пользовательским интерфейсом, но он не тот, который используют пользовательские формы.
Например, я хочу сделать пользовательский интерфейс калькулятора. Мне понадобятся некоторые элементы изображения для фона калькулятора и кнопок, некоторое текстовое поле для экрана, а затем несколько элементов кнопок для прослушивания пользовательских кликов. Затем я связываю все это каким-то образом с классом, который содержит все прослушиватели событий и код инициализации / закрытия, чтобы GUI действительно появился
Мой вопрос: с чего мне начать, если я хочу создать что-то подобное?
метод
Один способ, которым я могу думать, является следующим (в Excel):
- Дизайн внешнего вида интерфейса в редакторе изображений
- Экспортируйте различные элементы в виде отдельных файлов изображений и сохраните их в определенном месте / на скрытом рабочем листе.
- Создайте класс в VBA, в котором есть код для объединения различных элементов изображения, т. Е. Для размещения каждого в заранее указанном месте относительно друг друга.
- Соберите все оставшиеся интерактивные части (кнопки, текстовое поле и т.д.), Используя элементы управления ActiveX, которые невидимы и расположены над соответствующими элементами изображения.
- Инициализируйте эти элементы управления со слушателями событий в моем классе
Это я могу относительно легко сделать. Но у него есть следующие ключевые ограничения, о которых я могу думать:
Проблемы*
- Что касается событий, я ограничен тем, что по умолчанию имеет элемент управления ActiveX
Поскольку мой подход создает интерфейс из элементов изображения, с точки зрения VBA, это будут объекты Shape
(для поддержки прозрачности - закругленные края - так как элементы управления изображения ActiveX не поддерживают это). Они не вызывают никаких событий, поэтому, если я захочу обнаружить, скажем, когда пользователь наводит курсор мыши на рамку калькулятора, мне нужно либо покрыть его невидимыми метками activeX, либо сделать вызовы API, чтобы посмотреть, что делает мышь. Первый недостижим для сложных форм, последний добавляет целую нагрузку дополнительной сложности. В идеале я хотел бы, чтобы какой-то способ указать, какие элементы вызывают какие события из списка доступных мне.
- Изменение размера / редизайн во время выполнения
Если мой интерфейс построен из элементов изображения, я не могу легко изменить дизайн во время выполнения. Если, скажем, я хочу изменить размер элемента frame моего графического интерфейса, тогда стандартные растровые изображения (png, jpeg и т.д.) Станут размытыми, векторные изображения (которые Excel теперь предоставляет ограниченную поддержку) по умолчанию не имеют таких правил, как If the frame height is changed, stretch the sides but do not stretch the toolbar at the top
. Я бы тоже хотел поддержать изменение цвета элементов, но это очень сложно сделать с изображениями, recolor
это опция, но она доступна только для MSPublisher.
- Память / размер файла
Большинство графических элементов моего интерфейса, вероятно, будут довольно простыми. Файлы также лучше подходят для векторных изображений, чем растровые, но элементы управления ActiveX не поддерживают это в качестве фона. Таким образом, размер файла увеличивается, и, возможно, возникло некоторое отставание по сравнению с простой кнопкой, добавленной в пользовательскую форму.
* nb это только для контекста, поэтому можно пропустить, если хотите, или я могу более подробно остановиться на них, если это будет необходимо
Заключение
Я не хочу использовать пользовательские формы, потому что у них уже есть какой-то конкретный интерфейс - рамка, прямоугольная форма, конкретные прослушиватели событий для определенных элементов. Я мог бы спроектировать то, что я хочу в пользовательской форме, но я бы хотел чистый холст с точки зрения внешнего вида. Я уверен, что должен быть лучший способ разработки пользовательских интерфейсов для управления с помощью класса VBA, как это может сделать пользовательская форма?
У меня есть смутное представление о том, что Visual Studio может быть полезен, но я даже не знаю, какие учебники искать. Я могу пока только найти инструкции для Windows Forms (которые мне не нужны по тем же причинам, которые не нужны для пользовательской формы), или надстроек Excel (которые взаимодействуют с Excel, но, похоже, не имеют собственного настраиваемого интерфейса). ). Не то, чего я добиваюсь, так что я думаю, что мне нужно начать с человека, чтобы понять проблему и указать мне правильное направление.