Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/30: Рейтинг темы: голосов - 30, средняя оценка - 4.63
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,526
Записей в блоге: 22

Разместить IPictureDisp в Picture Box с координатами

23.04.2020, 19:16. Показов 7195. Ответов 136
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Visual Basic
1
2
Public TempPic As IPictureDisp
Set TempPic = LoadPicture(FileName)
У объекта IPictureDisp нет свойства Picture поэтому, метод PaintPicture ничего не выводит в Picture Box. При использовании:
Visual Basic
1
Set Picture1 = TempPic
изображение, заведомо меньшее по размеру, чем Picture Box, размещается с нулевыми координатами. Существует ли возможность разместить изображение из IPictureDisp в Picture Box с координатами, отличными от нуля?
Интересно сделать.
Если простой возможности нет, придётся использовать невидимый Picture Box.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.04.2020, 19:16
Ответы с готовыми решениями:

Можно ли динамически создавать Picture Box внутри другого Picture Box?
Можно ли динамически создавать Picture Box внутри другого Picture Box. Если можно то как? Заранее благодарен

Как запретить заход одного объекта (picture box) на другой picture box
Создаю платформер на Windows Forms, как запретить заход одного picture box'a на другой?

Picture box
Нужно создать программу. Суть программы: Небходимо передвинуть картинки чтобы получилось изображение и надпись "портрет". Я...

136
14.05.2020, 19:27
Студворк — интернет-сервис помощи студентам

Не по теме:

Цитата Сообщение от Pro_grammer Посмотреть сообщение
Ясно, пытался уронить мой exe шник, создал хитрый png файл, но exeшник просто его проигнорировал, а не упал :)
И ты обиделся... Не обижайся, VB6 во многих вещах лучше PureBasicа, а ты, вне всяких сомнений, самый выдающийся программист, который умеет делать на VB6 чудеса, я всегда это говорю при любом удобном случае.
Ок, закрываем дискуссию.
Не в этом дело, а в обработке ошибок GDI+. Неважно что оно не падает в 99% времени, важно то что она может упасть т.к. функция может вернуть ошибку, а в коде это никак не обрабатывается. Если ты не согласен с этим - я не собираюсь спорить, тут недавно был похожий случай уже с приложением которое позволяет редактировать карты и падает при неверном формате - это бессмысленно (спорить и что-то доказывать), поэтому я и не хочу обсуждать эту ветку дискуссии дальше, а не потому что я обиделся и т.п.

0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,526
Записей в блоге: 22
24.05.2020, 10:09  [ТС]
Машинный перевод всё-таки приличная гнусь! Долго не мог сообразить, что это означает:
GdipTranslateWorldTransform

Обновляет матрицу преобразования мира этого объекта Graphics с помощью своего продукта и матрицы перевода.
Parameters
graphics
[in] Указатель на объект Graphics.
dx
[in]Простое значение точности, указывающее горизонтальную составляющую перевода.
dy
[in]Простое значение точности, указывающее вертикальный компонент перевода.
order
[in] Элемент перечисления MatrixOrder, указывающий порядок умножения. MatrixOrderPrepend указывает, что матрица перевода находится слева, а MatrixOrderAppend указывает, что матрица перевода находится справа. Значением по умолчанию является MatrixOrderPrepend.
Как-то, с сопеньем и кряхтеньем получилось вращать изображение, использовав пример из интернета и пример The trick Rotate.
Обнаружилось занятное явление. Если использовать совместно с функциями GDI+ для очистки формы:
Visual Basic
1
2
3
Me.Cls
или
Me.Picture = LoadPicture("")
то, функции GDI+перестают работать. Подозреваю, что срабатывает явление, описанное здесь:
https://support.microsoft.com/... di-and-gdi
Из того, что нашёл в интернете, совершенно непонятно, в чём отличие объектов Grapgics, Image и Bitmap?
Вложения
Тип файла: zip 1.ZIP (9.4 Кб, 0 просмотров)
0
Модератор
10052 / 3897 / 884
Регистрация: 22.02.2013
Сообщений: 5,850
Записей в блоге: 79
26.05.2020, 14:57
Цитата Сообщение от Argus19 Посмотреть сообщение
Машинный перевод всё-таки приличная гнусь! Долго не мог сообразить, что это означает:
Все очень просто если ознакомиться с трансформациями и как они работают. В большинстве графических движков трансформации основаны на матрицах.

Цитата Сообщение от Argus19 Посмотреть сообщение
Из того, что нашёл в интернете, совершенно непонятно, в чём отличие объектов Grapgics, Image и Bitmap?
Image и Bitmap это одно и тоже. Graphics - это на чем рисуешь.
1
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,526
Записей в блоге: 22
26.05.2020, 19:23  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Image и Bitmap это одно и тоже. Graphics - это на чем рисуешь.
Спасибо.
Непонятно. Загружаю изображение
Visual Basic
1
GdipLoadImageFromFile(StrConv(App.Path & "\Êîò.jpg", vbUnicode), wimg)
Т.е. создаётся объект Image из файла, переменная wimg получает указатель на объект.
Получаем hDC по указателю на созданный объект
Visual Basic
1
2
3
4
'.......................
Public wgraphicshdc As Long
'.............................
Label3.Caption = GdipGetDC(wimg, wgraphicshdc)
В метку заносится число 2, что означает "InvalidParameter".
Какой параметр неверен?
0
Модератор
10052 / 3897 / 884
Регистрация: 22.02.2013
Сообщений: 5,850
Записей в блоге: 79
26.05.2020, 21:00
Цитата Сообщение от Argus19 Посмотреть сообщение
Получаем hDC по указателю на созданный объект
Так нельзя. HDC можно получить только у "поверхности", т.е. из объекта Graphics. В данном случае сначала нужно получить Graphics из Image, что делается посредством функции GdipGetImageGraphicsContext.

Цитата Сообщение от Argus19 Посмотреть сообщение
В метку заносится число 2, что означает "InvalidParameter".
Какой параметр неверен?
А для чего HDC нужно? Объект Graphics GDI+ как раз является аналогом GDIшного DC (hDC).
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,526
Записей в блоге: 22
26.05.2020, 21:23  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
А для чего HDC нужно?
GdipDrawImageRect неудобная функция. Гораздо гораздее BitBlt, а она требует hDC.
Я взял только часть возможностей BitBlt. Забавно получается:
Вложения
Тип файла: zip 2.ZIP (132.8 Кб, 2 просмотров)
0
Модератор
10052 / 3897 / 884
Регистрация: 22.02.2013
Сообщений: 5,850
Записей в блоге: 79
26.05.2020, 21:48
Цитата Сообщение от Argus19 Посмотреть сообщение
GdipDrawImageRect неудобная функция.
Почему неудобная?
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,526
Записей в блоге: 22
26.05.2020, 22:07  [ТС]
Она просто копирует, без инверсии, Or, Xor и пр.
Т.е. перед копированием необходимо модифицировать изображение.
0
Модератор
10052 / 3897 / 884
Регистрация: 22.02.2013
Сообщений: 5,850
Записей в блоге: 79
26.05.2020, 22:14
Цитата Сообщение от Argus19 Посмотреть сообщение
Она просто копирует, без инверсии, Or, Xor и пр.
Т.е. перед копированием необходимо модифицировать изображение.
Ты можешь использовать более функциональную GdipDrawImageRectRect, которая принимает объект ImageAttributes. Этот объект позволяет модифицировать изображение перед выводом намного гибче чем растровые операции в GDI. К примеру, там можно применить любую трансформацию к цветам пикселов (и альфы) перед выводом на поверхность + разные дополнительные опции типа ColorKey и т.д. Так что посмотри в эту сторону.
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,526
Записей в блоге: 22
26.05.2020, 22:42  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Так что посмотри в эту сторону.
Пока сложно.
Было бы проще получить hDC объекта Image без "костылей". Непонятно, почему это не реализовано. hDC - логический номер устройства. Вообще непонятно, как он присваивается. С указателем проще. Насколько я понимаю, указатель содержит адрес первого элемента объекта в памяти. Остаётся понять, что им является. Сам растр или сначала некий заголовок, из которого можно получить высоту и ширину объекта. например:
Visual Basic
1
2
 GdipGetImageHeight wimg, wHeight
      GdipGetImageWidth wimg, wWidth
0
Модератор
10052 / 3897 / 884
Регистрация: 22.02.2013
Сообщений: 5,850
Записей в блоге: 79
26.05.2020, 23:02
Цитата Сообщение от Argus19 Посмотреть сообщение
Пока сложно.
Это только так кажется.

Цитата Сообщение от Argus19 Посмотреть сообщение
Было бы проще получить hDC объекта Image без "костылей".
Нельзя, как и в GDI. Из объекта Image можно получить только хендл изображения (HBITMAP).

Цитата Сообщение от Argus19 Посмотреть сообщение
hDC - логический номер устройства.
Нет. Это хендл контекста утройства. Контекст устройства хранит множество информации. Контекст устройства может быть к примеру у принтера, тоже самое относится к объекту Graphics.

Цитата Сообщение от Argus19 Посмотреть сообщение
Вообще непонятно, как он присваивается. С указателем проще. Насколько я понимаю, указатель содержит адрес первого элемента объекта в памяти. Остаётся понять, что им является.
Это хендл. Он присваивается из глобальной таблицы. С указателем не проще. Указатель платформозависим, а хендлы можно передавать между 64 битными и 32 битными приложениями.

Цитата Сообщение от Argus19 Посмотреть сообщение
Сам растр или сначала некий заголовок, из которого можно получить высоту и ширину объекта. например:
Не путай объекты GDI и объекты GDI+. Первые, в большинстве своем, - объекты ядра. Вторые - объекты пользовательского режима.
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,526
Записей в блоге: 22
27.05.2020, 05:23  [ТС]
Обобщённо, всё описанное системная информация, для получения которой простых путей нет?
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,526
Записей в блоге: 22
01.11.2020, 23:12  [ТС]
Нашёл в интернете код и доработал под свои нужды. Копирование происходит неправильно и возникает выход за пределы памяти.
Миниатюры
Разместить IPictureDisp в Picture Box с координатами  
Вложения
Тип файла: zip 1.ZIP (34.2 Кб, 7 просмотров)
0
Модератор
10052 / 3897 / 884
Регистрация: 22.02.2013
Сообщений: 5,850
Записей в блоге: 79
02.11.2020, 22:26
Argus19, не стоит использовать GetBitmapBits поскольку она не позволяет задать формат пикселей. Для получения пикселей нужно использовать GetDiBits. В коде вообще непонятно что творится, размеры буферов разные.
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,526
Записей в блоге: 22
03.11.2020, 05:58  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Для получения пикселей нужно использовать GetDiBits
У интерфейса нет hDC.
0
Модератор
10052 / 3897 / 884
Регистрация: 22.02.2013
Сообщений: 5,850
Записей в блоге: 79
03.11.2020, 10:43
Цитата Сообщение от Argus19 Посмотреть сообщение
У интерфейса нет hDC.
К примеру у тебя 8 цветное изображение, какие пиксели ты желаешь получить? В каком формате?
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,526
Записей в блоге: 22
03.11.2020, 17:12  [ТС]
Исходник взят тут:
http://uchitel-program.ru/code... baza-koda/
Автор утверждает, что программа уверенно работает с 24 - 32 разрядными цветами.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
03.11.2020, 18:18
Цитата Сообщение от Argus19 Посмотреть сообщение
Исходник взят тут:
Этот код есть в сборнике, который Вы активно преобразовали и записали на CD


Кстати, быстро он работает потому, что изображение очень маленькое.
Попробуйте поставить реальный размер, который обычно редактируют, и заметны будут тормоза.
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,526
Записей в блоге: 22
03.11.2020, 18:48  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
который Вы активно преобразовали и записали на CD
И который я не доделал до полного объёма DVD. Присылайте мне ваши коды. Язык программирования не важен. Там же есть проекты на PB.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Кстати, быстро он работает потому, что изображение очень маленькое.
Это пока не важно. Главное, IpictureDisp может существовать независимо и его можно использовать.
Проблемы возникают потому, что при вычислении получаются дробные значения с "длинным хвостом" после запятой.
В коде:
Visual Basic
1
2
3
4
5
6
7
  Picture1.Picture = LoadPicture(App.Path & "\ball1.jpg")
     GetObject Picture1.Image, Len(SBuffer.Info), SBuffer.Info
        BufIn = SBuffer.Info.bmWidthBytes / SBuffer.Info.bmWidth
 
     ReDim SBuffer.Bits(0 To BufIn - 1, _
                       0 To SBuffer.Info.bmWidth - 1, _
                       0 To SBuffer.Info.bmHeight - 1) As Byte
И для Picture1.Image, и для Picture2.Image, BufIn = 3. Для тех же вычислений для IpictureDisp получается полное безобразие. Из-за чего изображение копируется в выходной буфер кое-как и программа "падает".
0
Модератор
10052 / 3897 / 884
Регистрация: 22.02.2013
Сообщений: 5,850
Записей в блоге: 79
03.11.2020, 19:46
Цитата Сообщение от Argus19 Посмотреть сообщение
Автор утверждает, что программа уверенно работает с 24 - 32 разрядными цветами.
Я другое имел в виду. Ты говоришь что у интерфейса нет hdc, но функция GetBitmapBits извлекает данные DDB изображения, тогда как нужно извлекать данные DIB изображения. Чтобы извлечь DIB данные из DDB изображения нужно использовать GetDiBits которая позволяет указать формат. HDC здесь нужен для правильной трансляции цветов т.к. битмап совместимый.
Более того, можно вообще не извлекать биты изображения если это DIB секция, они и так хранятся в пользовательской памяти. Для этого просто используешь функцию GetObject которая вернет указатель на пиксели. Это еще больше ускорит производительность т.к. не нужно копировать пиксели.

Добавлено через 21 минуту
Цитата Сообщение от Argus19 Посмотреть сообщение
Это пока не важно. Главное, IpictureDisp может существовать независимо и его можно использовать.
Я вообще не понимаю смысл в этом. Если нужно напрямую манипулировать пикселями, есть много оптимальных вариантов. GDI+ вообще позволяет создать изображение основываясь на массиве и изменяя данные в этом массиве будет изменяться и изображение.

Добавлено через 2 минуты
Цитата Сообщение от Argus19 Посмотреть сообщение
Проблемы возникают потому, что при вычислении получаются дробные значения с "длинным хвостом" после запятой.
Потому что IPicture как раз и предназначался чтобы работать с физическими величинами, а не с логическими пикселями.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.11.2020, 19:46
Помогаю со студенческими работами здесь

Picture Box
как сделать так, чтобы один PictureBox был поверх другого??? вот пример на картинке.

Отображение Picture Box
У меня есть два Picture Box, расположенных "вплотную". Но когда я запускаю программу, изображения, которые находятся в них, отображаются...

работать с picture box
Как вывести в picture box текст в определенных координатах и линию с одной заданой точки в другую?

перемещение элипса на picture box
как можно сделать, анимацию чтоли, короче чтобы элипс по прямой прошел, ?

Инструмент рука в Picture Box
Возникла задача сделать такой инструмент. Есть Picture Box в котором рисуется график функции, хочу увеличивать картинку и рассматривать в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
120
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru