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

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

23.04.2020, 19:16. Показов 7718. Ответов 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
1446 / 463 / 78
Регистрация: 24.09.2017
Сообщений: 2,542
Записей в блоге: 24
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
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
26.05.2020, 14:57
Цитата Сообщение от Argus19 Посмотреть сообщение
Машинный перевод всё-таки приличная гнусь! Долго не мог сообразить, что это означает:
Все очень просто если ознакомиться с трансформациями и как они работают. В большинстве графических движков трансформации основаны на матрицах.

Цитата Сообщение от Argus19 Посмотреть сообщение
Из того, что нашёл в интернете, совершенно непонятно, в чём отличие объектов Grapgics, Image и Bitmap?
Image и Bitmap это одно и тоже. Graphics - это на чем рисуешь.
1
 Аватар для Argus19
1446 / 463 / 78
Регистрация: 24.09.2017
Сообщений: 2,542
Записей в блоге: 24
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
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
26.05.2020, 21:00
Цитата Сообщение от Argus19 Посмотреть сообщение
Получаем hDC по указателю на созданный объект
Так нельзя. HDC можно получить только у "поверхности", т.е. из объекта Graphics. В данном случае сначала нужно получить Graphics из Image, что делается посредством функции GdipGetImageGraphicsContext.

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

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

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

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

Цитата Сообщение от Argus19 Посмотреть сообщение
Сам растр или сначала некий заголовок, из которого можно получить высоту и ширину объекта. например:
Не путай объекты GDI и объекты GDI+. Первые, в большинстве своем, - объекты ядра. Вторые - объекты пользовательского режима.
0
 Аватар для Argus19
1446 / 463 / 78
Регистрация: 24.09.2017
Сообщений: 2,542
Записей в блоге: 24
27.05.2020, 05:23  [ТС]
Обобщённо, всё описанное системная информация, для получения которой простых путей нет?
0
 Аватар для Argus19
1446 / 463 / 78
Регистрация: 24.09.2017
Сообщений: 2,542
Записей в блоге: 24
01.11.2020, 23:12  [ТС]
Нашёл в интернете код и доработал под свои нужды. Копирование происходит неправильно и возникает выход за пределы памяти.
Миниатюры
Разместить IPictureDisp в Picture Box с координатами  
Вложения
Тип файла: zip 1.ZIP (34.2 Кб, 7 просмотров)
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
02.11.2020, 22:26
Argus19, не стоит использовать GetBitmapBits поскольку она не позволяет задать формат пикселей. Для получения пикселей нужно использовать GetDiBits. В коде вообще непонятно что творится, размеры буферов разные.
0
 Аватар для Argus19
1446 / 463 / 78
Регистрация: 24.09.2017
Сообщений: 2,542
Записей в блоге: 24
03.11.2020, 05:58  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Для получения пикселей нужно использовать GetDiBits
У интерфейса нет hDC.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
03.11.2020, 10:43
Цитата Сообщение от Argus19 Посмотреть сообщение
У интерфейса нет hDC.
К примеру у тебя 8 цветное изображение, какие пиксели ты желаешь получить? В каком формате?
0
 Аватар для Argus19
1446 / 463 / 78
Регистрация: 24.09.2017
Сообщений: 2,542
Записей в блоге: 24
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
1446 / 463 / 78
Регистрация: 24.09.2017
Сообщений: 2,542
Записей в блоге: 24
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
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru