Страницы: 1
RSS
Цветной API-прямоугольник на UserForm. Создаем progressbar
 
Здравствуйте.
Используя API-функцию Rectangle из библиотеки "gdi32", рисую на пользовательской форме прямоугольник. Прямоугольник выводится с белой заливкой. Т.к. нужна заливка другого цвета, ничего личше чем по-пиксельную закраску (функция SetPixel) придумать не получилось. В этом варианте процесс заливки прямоугольника просматривается визуально.
Пож-та, подскажите: есть ли возможность заставить функцию Rectangle использовать заливку цветом отличным от белого?
Возможно, что есть более простой вариант нарисовть ЦВЕТНОЙ прямоугольник на экранной форме нужного цвета?
Файлик с примером аттачу.
Заранее, спасибо за помощь.
С уважением,
P.S. Вариант с использованием  контролса Label не подойдёт. Нужен именно "рисунок".
 
AndyGrouve, а в чем проблема закрасить Image?
Код
Image1.BackColor = &H8000&
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit
Спасибо за ваш ответ.
Вставил ваш код ("Image1.BackColor = &H8000&")  вместо цикла где идёт по-пиксельная раскраска.
Переменную "Image1" как нужно определить? Ругается, что эта переменная не определена.....
 
AndyGrouve, нужно создать объект Image на вашей форме с таким именем. Конструктором проще всего. Этот код нужно вставить вместо вашего всего кода в кнопке, не нужен цикл.
Изменено: bedvit - 22.11.2019 14:17:04
«Бритва Оккама» или «Принцип Калашникова»?
 
   
bedvit
Объект Image1 должен быть создан с помощью Toolbox с контролами, так? Подскажите, какой контрол отвечает за "рисование" на UserForm ПРЯМОУГОЛЬНИКА ?
Спасибо.
 
Не используя API, ваш пример сделал проще. Или обрисуйте конечную цель.
Изменено: bedvit - 22.11.2019 15:39:18
«Бритва Оккама» или «Принцип Калашникова»?
 
Можно создать программно
Код
Dim Img
Set Img = UserForm1.Controls.Add("Forms.Image.1", "Image1", Visible)
Img.Height = 50
Img.Width = 430
Img.BackColor = &H8000&
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit
Посмотрел ваш код. Разобрался. Конечно, это тоже решение, согласен. Вставляем на UserForm объект Image и управлем его свойствами.
Останавлюсь на вашем варианте, спасибо вам большое! Здачку можно считать решённой, а тему закрывать.
P.S. C прикладной точки зрения, всё же было бы интересно добится этого же результата с помощью API-рисования. Интересно, есть там функция обеспечивающая заливку нарисованных объектов на экранных формах нужным цветом?   Ну это так - не более чем мысль вслух. :)  
 
Цитата
AndyGrouve написал:
Здравствуйте.Используя API-функцию Rectangle из библиотеки "gdi32", рисую на пользовательской форме прямоугольник. Прямоугольник выводится с белой заливкой. Т.к. нужна заливка другого цвета, ничего личше чем по-пиксельную закраску (функция SetPixel)
Вы в конечном итоге случайно не хотите сделать что то похожее на прогресс бар?  где по мере исполнения задачи увеличивается закрашенная шкала/прогресс выполнения кода?
Если так, то можно абстаргироваться от API функций и реализовать при помощи встроенного контрола типа label на форме.
 
AndyGrouve, думаю можно нарисовать и прямоугольник на API, но это не целесообразно. Я рисовал на API, когда нет другого инструментария, здесь же (VBA), ООП, с кучей свойств, форм, контролов. Причем ваш файл с API, у меня не открылся, потому что сделан под х32, нужно переводить на х64. С встроенными формами нет таких проблем.
«Бритва Оккама» или «Принцип Калашникова»?
 
 Лалыч
Ух! Вы прям в воду глядели  :)
Всё верно. Заготовка именно для этого.
Касаемо Label - я в постскриптуме отписал, что хочется НЕ(!) использовать этот контролс. Про контролс ProgressBar я конечно же знаю, но использовать его в 64-ёх битном Офисе не смогу, т.к. нет 64-битной версии MSCOMCTL.OCX, а Микрософт так и не выпустила (видимо уже и не выпустит) 64-ёх битный вариант  этой библиотеки. Это первое.
+
Всё же прогрессбар в MSCOMCTL.OCX  совсем простенький, ему уже точно более 10-ти лет  8)
Когда-то была задумка попробовать сделать красивый анимированный вариант/ а-ля Windows Vista / с возможностью настроек направления движения (слево на право, справо-налево), цвета индикатора, настройки других параметров.
Наверняка есть OCX-решения и для 64-ёх битного Офиса, но тут добавляется ещё один "подводный камень": на РС пользователей нет возможности регистрить /строгая политика внутри кампании/ эти OCX-библиотеки, а без регистрации контролс на экранной форме, насколько я знаю, не появится.
Иными словами : что бы запустить в 64-ёх битном офисе "красивый" прогресс-бар без регистрации в реестре внешних ocx-библиотек, мысль пошла в сторону API-рисования. Допускаю, что есть и другие варианты, которые я не вижу или не понимаю как реализовать.
Коллеги, всем спасибо за участие и хороших выходных!
 
AndyGrouve, прогресс бар можно наваять вполне годный и стандартным инструментарием без использования сторонних библиотек, в т.ч. API.
«Бритва Оккама» или «Принцип Калашникова»?
 
Я вот без всяких рисований и Winapi наваял прогбессбар, причем с переменным количеством полосок:
https://excelvba.ru/programmes/Parser/manuals/interface/progress_indicator

Описание с примером кода для аналогичного прогрессбара (но попроще) есть здесь:
https://excelvba.ru/code/tools/ProgressIndicator
 
Доброе время суток
Цитата
AndyGrouve написал:
т.к. нет 64-битной версии MSCOMCTL.OCX,
Есть. Файл сделан в Excel 365 64bit. Стоит ли пользоваться? Нет не стоит. Лучше перейти на разработку в VB.NET/C# в VSTO, ExcelDNA и так далее - можно будет сделать более привлекательные элементы управления.
 
Цитата
Андрей VG написал:
Есть. Файл сделан в Excel 365 64bit
но у меня в Excel 2010 (64 бит) при запуске выдает ошибку (что не может загрузить компонент)
Потому, как вы правильно написали, лучше это не использовать
 
Игорь
Спасибо! Буду смотреть/ изучать ваш код... :)
 
Андрей VG
Цитата
"..Лучше перейти на разработку в VB.NET/C# в VSTO, ExcelDNA и так далее - можно будет сделать более привлекательные элементы управления." -
Всегда с большим вниманием читаю ваши сообщения, спасибо!
Скажите, то о чём Вы пишите - будет работать в связке с Экселем? Чем для меня удобен vba, это  тем,  что он интегрирован в Эксель. Про разработку в VB.NET/C#, VSTO и  ExcelDNA конечно же ОЧЕНЬ(!) интересно, но сталкиваться с этим мне не приходилось. Можно Вас попросить пару ссылок? С учётом того, что в этом буду совсем новичком, что проще будет в освоении?
 
Если использовать контрол для Прогрессбара, то ведь необязательно постепенно заливать его: можно закрасить, назначить ему нулевую ширину, а потом в цикле увеличивать её.
Подходит для Image. Можно и TextBox использовать, если Label принципиально нельзя.
Побаловался с обоими - работает/. ))
 
Юрий М
Да. Работает однозначно... :)
 
Змий.  :D

И еще куча от рыбоглода.  :)
 
RAN
Спасибо!
Andy Pope - класика жанра / Экселя  :)
Страницы: 1
Наверх