Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Почему не удается подключить GDIplus.dll к VBA?

Почему не удается подключить GDIplus.dll к VBA?

Ответ
Поиск в этой теме
Непрочитано 16.02.2023, 17:10
Почему не удается подключить GDIplus.dll к VBA?
МишаИнженер
 
Регистрация: 14.12.2008
Сообщений: 1,079

При подключении библиотеки GDIplus.dll к VBA появляется ошибка.
Почему не удается подключить GDIplus.dll к VBA?
Есть ли способ использовать функции GDIPlus.dll в коде VBA?
Какие еще можно подключить библиотеки чтобы начать рисовать на формах UserForm VBA?

Миниатюры
Нажмите на изображение для увеличения
Название: Подключение GDIplus.dll к VBA.png
Просмотров: 72
Размер:	32.0 Кб
ID:	253424  Нажмите на изображение для увеличения
Название: Ошибка при подключении GDIplus.dll к VBA.png
Просмотров: 71
Размер:	20.2 Кб
ID:	253425  

Просмотров: 3244
 
Непрочитано 20.02.2023, 02:44
1 | #21
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 1,867


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
WorkCanvas - PicturesBox ака холст
Видимо, в нем все и дело. Если рисовать на форме - без буферизации будет дискотека. Два теста во вложении отличаются только свойством DoubleBuffered у формы. Достаточно поводить мышкой поверх. А если накинуть PicturesBox и рисовать в нем - мерцания не будет; видимо, буферизация у него встроенная.
Вложения
Тип файла: zip DoubleBuffered.zip (18.3 Кб, 24 просмотров)
Нубий-IV вне форума  
 
Автор темы   Непрочитано 20.02.2023, 12:25
#22
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


Спасибо большое Сергей812 и Нубий-IV за ответы!
Не все понятно, но очень интересно!
Скажите пожалуйста почему в моей проге Excel не чертится конструкция (после нажатия на кнопке "Начертить конструкцию" на листе "узлы").
Если отключить Msgbox, то конструкция начинает чертится при перетаскивании мышкой, а начальной картинки нет.
Почему так получается?
Ещё вопрос: Где взять метод MouseWheel для UserForm?
Пока меня все устраивает в VBA: быстро открывается, легко программировать и т.д.
Но похоже с масштабированием чертежа на UserForm у меня не получается. Не могу найти метод который бы реагировал на вращение колесика на UserForm.
Из-за этого не получается сделать масштабирование. Может надо другой компонент использовать?
Но на других стандартных тоже такого метода не нашел.
Ещё вопрос: почему у меня опорные реакции вычисляются перепутанными местами?
Может я не учитываю перестановку строк при вычислении обратной матрицы?
Миниатюры
Нажмите на изображение для увеличения
Название: Зачем MsgBox для вычерчивания на форме.png
Просмотров: 33
Размер:	50.7 Кб
ID:	253540  
Вложения
Тип файла: zip Матрица (56КЭ) (v2).zip (197.7 Кб, 23 просмотров)
МишаИнженер вне форума  
 
Непрочитано 20.02.2023, 16:28
#23
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,002


не у всех 32-битный офис вообще то)
Сергей812 вне форума  
 
Непрочитано 21.02.2023, 03:37
1 | #24
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 1,867


Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
начальной картинки нет. Почему так получается?
Она есть, ее иногда даже видно, но потом она пропадает. Очевидно, это конфликт между автоматической перерисовкой формы и ручным рисованием.

В WinApi рисование положено делать при обработке события WM_PAINT. Windows знает, что рисование - это дело тормозное, и оптимизирует перерисовку. Например, если в очереди болтается не обработанная предыдущая прорисовка, новое событие не добавляется в очередь, а объединяется с предыдущим, чтобы не мучить программу лишними рисованиями. Иногда можно создавать свои события через SendMessage или PostMessage (например, отправляя их при обработке события движения мышки), но большинство событий - автоматические. То есть команды на перерисовку приходят в основном от системы в автоматическом порядке. Например, в форму VB при ее создании или растягивании приходит WM_PAINT, и форма в ответ заливает себя серым фоном. Этот ответ формы на WM_PAINT невидим для программиста, событие UserForm_OnPaint почему-то спрятали. Но где-то внутри программы эта функция все равно есть, и события все равно обрабатываются.

Вот тут и начинаются проблемы: сначала вызов "Call НачертитьКонструкцию" что-то рисует на форме, а потом Windows присылает сообщение WM_PAINT, и форма в ответ обновляется, затирая рисунок. А если сначала вызвать MsgBox, то, видимо, событие присылается сразу после него, форма обновляется, потом работает "Call НачертитьКонструкцию", создавая рисунок, а потом Windows считает, что форма уже обновлена, новых событий перерисовки не требуется, и рисунок остается видимым.
Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
Где взять метод MouseWheel
На самом деле все события приходят в так называемую "оконную процедуру", в справке она зовется "WindowProc". На C она пишется вручную, и там можно обработать любые события; если завтра выйдет новая версия Windows с новыми событиями, их обработку можно будет дописать, и программа обзаведется новыми фишками. Обычно эта процедура в ответ на любое событие вызывает соответствующий обработчик. Так вот в бейсике эта процедура фиксированная и спрятана внутри, а наружу торчат всего несколько обработчиков - это те самые UserForm_Click() и т.п. Потому он и обрабатывает всего несколько типов событий - те, которые сочли важными разработчики. Они просто хотели как лучше - т.е. как проще; взамен "как сложнее" можно сделать только через костыли.

В WinApi есть еще понятие "Window Subclassing", это подмена готовой чужой оконной процедуры с целью ее расширить и углубить. Надо написать свою функцию - обработчик событий. В основном она просто вызывает старую через CallWindowProc, и только на несколько новых событий добавляет новые обработчики. Устанавливается она взамен родной вызовом SetWindowLong.

Так можно обработать MouseWheel. Так можно обработать WM_PAINT - сначала вызвать родную функцию, которая заливает форму фоном, а потом дорисовать поверх что надо.

Но я не развлекался таким в бейсике, и не посоветую, как сделать это правильно, это все надо гуглить - WindowProc, Window Subclassing, SetWindowLong, CallWindowProc. Примеры для C есть в справке по WinApi, для бейсика должны найтись на форумах.
Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
меня все устраивает в VBA
Пока все заданные вопросы - это на самом деле проблемы бейсика. Для простоты его огурец обрезали по самые помидоры. Легко делать простое, но тяжело делать сложное. Плюс он уже давно не обновляется. Массовые вызовы WinApi - это уже какая-то имитация C на бейсике получается. Тут уж либо смириться и писать в стиле Win98, либо читать справку WinApi для C и костылить, либо менять язык.
Нубий-IV вне форума  
 
Автор темы   Непрочитано 21.02.2023, 13:45
#25
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,079


Цитата:
Сообщение от Нубий-IV Посмотреть сообщение
если в очереди болтается не обработанная предыдущая прорисовка, новое событие не добавляется в очередь, а объединяется с предыдущим
Это идея стала основой модернизации кода:
Ситуацию выручила строка кода типа me.Repaint:
Код:
[Выделить все]
'Начертим конструкцию из КЭ
   gdМКЧ = 1#: gdDXЧ = 0#: gdDYЧ = 0#
   Set objЧ = New UserForm2
   objЧ.Show
   objЧ.StatusBar1.SimpleText = "Чертеж открыт"
   objЧ.Repaint
Теперь при нажатии кнопки "Начертить конструкцию" конструкция сразу вычерчивается на форме. Спасибо Нубий-IV!!!
МишаИнженер вне форума  
 
Непрочитано 21.02.2023, 14:11
1 | #26
Нубий-IV

Инженер-философ
 
Регистрация: 24.04.2019
Хабаровск
Сообщений: 1,867


Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
Ситуацию выручила
Хорошо, если так. Но подозреваю, что ситуации с пропадающим изображением могут проявляться и при других условиях. На всякий случай можно скачать программу WinSpy или WinSpy++, она для выбранного окна показывает приходящие события в реальном времени. Можно прифигеть от их количества и разнообразия.
Нубий-IV вне форума  
 
Непрочитано 21.02.2023, 14:37
#27
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,002


Цитата:
Сообщение от Нубий-IV Посмотреть сообщение
Пока все заданные вопросы - это на самом деле проблемы бейсика. Для простоты его огурец обрезали по самые помидоры
не для простоты - а чтобы не было конкуренции с отдельной средой разработки VB)
Сергей812 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Почему не удается подключить GDIplus.dll к VBA?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не удается подключить "автоматическое фланцевое соединение"( AutoCAD Plant 3D 2019)? Q_qq Вертикальные решения на базе AutoCAD 1 24.09.2021 16:59
Почему выдает ошибку "не удается найти обозначение детали" из миникаталога ?AutoCAD Plant 3D2019 Q_qq Вертикальные решения на базе AutoCAD 4 24.09.2021 16:42
Можно ли подключить бытовые сантехнические приборы к К3? Viarina Водоснабжение и водоотведение 5 16.10.2014 09:22
Почему при расчёте в Robote простой схемы эпюра My получается неправильной? МишаИнженер Robot 13 02.03.2010 12:26
Почему двутавр 90Б1 высота 893мм ? dextron3 Разное 33 11.03.2009 23:31