Форум программистов, компьютерный форум, киберфорум
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. Показов 7677. Ответов 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
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
27.04.2020, 12:43
Студворк — интернет-сервис помощи студентам
Argus19, PaintPicture предназначен для рисования в окне. А нужно нарисовать где?
0
 Аватар для Argus19
1446 / 463 / 78
Регистрация: 24.09.2017
Сообщений: 2,542
Записей в блоге: 24
27.04.2020, 17:31  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
А нужно нарисовать где?
В трёх окнах. Одно для предпросмотра фотографии(Form1), второе для её редактирования и третье для предпросмотра водяного знака и его редактирования на Form2. Пока работаю стандартными методами и всё получается кроме записи фотографии в файл. Как вы писали, проблема с окнами.
Опять сделал Ipicture. Осталось нанести на него в соответствии с координатами и масштабом водяной знак и записать в файл. Тоже самое, полагаю, можно сделать средствами GDI+ с Picture1.Picture. Рисование происходит во втором слое Picture№.Image поэтому, запись Picture1.Picture приводит к записи немодифицированного изображения, а запись Picture1.Image записывает только то, что поместилось в окне.
Почитал о GdipDrawImageRect. Точнее, перевёл https://translate.google.ru/ "Для повышения образованности" хочу попробовать использовать функцию для объединения изображений не в Picture1.Image, а в Picture1.Picture. ТОлько не пойму из перевода, сможет ли функция их различить?
GdipDrawImageRect
graphics

[in] Указатель на графический объект.

image

[in] Указатель на объект Image, который определяет изображение для рисования.

x

[in] Простое значение точности, которое определяет x-координату левого верхнего угла прямоугольника назначения, в котором нужно нарисовать изображение.

Y

[in] Простое значение точности, которое указывает y-координату левого верхнего угла прямоугольника назначения, в котором нужно нарисовать изображение.

width

[in] Простое значение точности, которое определяет ширину целевого прямоугольника для рисования изображения.

height

[in] Простое значение точности, указывающее высоту прямоугольника назначения, на котором рисуется изображение.
Из чего непонятно в какую именно область будет производиться запись и каким образом (And, Or или Xor)?
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
27.04.2020, 21:18
Ты определись каким именно методом ты собираешься все реализовывать (GDI, GDI+, Direct2D) и что такое водяной знак? Как он накладывается?
Обычно все манипуляции выполняются в памяти, а в окно выводится предпросмотр. Создается растр, который будет содержать финальную картинку, и с ним все манипуляции выполняешь. Как зависит от способа.

Цитата Сообщение от Argus19 Посмотреть сообщение
Из чего непонятно в какую именно область будет производиться запись и каким образом (And, Or или Xor)?
В GDI+ нет режимов наложения за исключения альфа-наложения.
0
 Аватар для Argus19
1446 / 463 / 78
Регистрация: 24.09.2017
Сообщений: 2,542
Записей в блоге: 24
27.04.2020, 22:02  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
каким именно методом ты собираешься все реализовывать
Пока пытаюсь, как вы советовали объединить картинки с помощью GdipDrawImageRect. Т.е. пока "в процессе".
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
27.04.2020, 22:08
Тут на форуме были посты, у меня в блоге можешь тоже посмотреть, там примеры работы с GDI+ на VB6.
0
 Аватар для Argus19
1446 / 463 / 78
Регистрация: 24.09.2017
Сообщений: 2,542
Записей в блоге: 24
27.04.2020, 22:17  [ТС]
The trick, взял за предварительную основу ваш код "Rotate".
Цитата Сообщение от The trick Посмотреть сообщение
IPicture - это интерфейс. Когда ты загружаешь картинку, то на самом деле создается COM объект который поддерживает интерфейс IPicture. Все объекты в VB6 используют методы этого интерфейса чтобы нарисовать это изображение.
В теме: StdPicture
вы писали:
Picture - интерфейс.
StdPicture - класс.
Если не объявить переменую, как As StdPicture и не присвоить ей Picture№.Picture, будет плохо. Из чего выходит, что GDI+ работает не с интерфейсами, а с классами?
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
27.04.2020, 22:29
Цитата Сообщение от Argus19 Посмотреть сообщение
Если не объявить переменую, как As StdPicture и не присвоить ей Picture№.Picture, будет плохо.
В COM вообще объектами можно управлять только через интерфейсы, поэтому каждый класс имеет интерфейс по умолчанию. У StdPicture это IPicture/Picture:
Code
1
2
3
4
5
6
7
[
  uuid(0BE35204-8F91-11CE-9DE3-00AA004BB851)
]
coclass StdPicture {
    [default] dispinterface Picture;
    interface IPicture;
};
GDI+ вообще работает с сырыми нестандартными хендлами. Если хочется с ними работать как с объектами их необходимо обернуть в объекты. Кстати я даже где-то встречал уже готовую либу https://sourceforge.net/projects/gdiplus-vb6/ .
0
 Аватар для Argus19
1446 / 463 / 78
Регистрация: 24.09.2017
Сообщений: 2,542
Записей в блоге: 24
27.04.2020, 23:00  [ТС]
Попробую, используя ваши примеры. Будет видно.
0
 Аватар для Argus19
1446 / 463 / 78
Регистрация: 24.09.2017
Сообщений: 2,542
Записей в блоге: 24
28.04.2020, 06:39  [ТС]
Попробовал GDI+
Записал изображение водяного знака, предварительно сделав его фон прозрачным на Form1.Picture1.Picture и затем его сохранил:
Visual Basic
1
2
3
    GdipDrawImageRect Graphics, Bitmap, 0, 0, WidthW, HeightW
     Form1.Picture1.Refresh
      SavePicture Form1.Picture1.Picture, "c:\test1.bmp"
Естественно, инициализировав GDI+ и т.д. и при выходе всё закрыл.
Изображение всё-равно записывается в Form1.Picture1.Image и при записи на диск сохраняется без внесённых изменений, т.е. как было. Вечером попробую записать в Ipicture.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
28.04.2020, 06:56
Цитата Сообщение от Argus19 Посмотреть сообщение
при записи на диск сохраняется без внесённых изменений
c:\test1.bmp?
Так ведь формат bmp в принципе не поддерживает прозрачность. Нужен PNG или GIF, как вариант.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
28.04.2020, 10:34
Argus19, работай с растром, а не с окном, в окно выводи уже готовый растр. Это гибче ипозволит к примеру делать скроллинг и масштабирование.
0
 Аватар для Argus19
1446 / 463 / 78
Регистрация: 24.09.2017
Сообщений: 2,542
Записей в блоге: 24
28.04.2020, 19:46  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Так ведь формат bmp в принципе не поддерживает прозрачность.
В выходном файле результат манипуляций.
Цитата Сообщение от The trick Посмотреть сообщение
работай с растром
Вы пишете это уже не первый раз и пока не смог понять каким образом.
Попытки "достучаться" до свойства Picture.Picture провалились. Видимо, разработчики не посчитали это нужным. Как я понимаю, в памяти хранится два изображения: загруженное из файла и видимое в окне. Все действия можно производить только с видимым изображением. Загруженное изменить нельзя, т.к. к нему нет доступа.
Чтобы работать с растром (модифицировать по усмотрению), необходимо его куда-то записать. Например, в Ipictue или IpictereDisp. Для работы необходимо получить его дескриптор. Пока не получилось.
Есть ли нормальные варианты без "плясок возле костра и камланий"?
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
28.04.2020, 21:06
Argus19, Ты напиши пожалуйста какое в итоге ты выбираешь API? Я тебе подскажу как сделать на нем.
0
 Аватар для Argus19
1446 / 463 / 78
Регистрация: 24.09.2017
Сообщений: 2,542
Записей в блоге: 24
28.04.2020, 21:31  [ТС]
Судя по тому, что мне удалось понять на сегодняшний день, в GDI+ нет функции аналогичной BitBlt или я плохо искал.
Функция BitBlt имеет параметр dwRop: "код растровой операции", т.е. эта функция аналог PaintPicture, что мне подходит.
Сейчас не получается получить hDC IPicture. Для этого предусмотрено 2 функции: SelectPicture Selects и get_CurDC. Пока не разобрался, как сделать.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
28.04.2020, 21:42
Argus19, а растровая операция это необходимость? Просто хочу понять что в итоге хочешь получить? Просто пример приведи изображений. Просто имея небольшой опыт работы с графикой я бы подсказал возможно лучшее решение/API.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
28.04.2020, 21:52
Может что то подобное?
Берём один рисунок, загружаем в первый слой, потом второй загружаем во второй слой, затем сохраняем этот пирог в файл?



в итоге такой файл

0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
29.04.2020, 05:20
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Так ведь формат bmp в принципе не поддерживает прозрачность.
32 битный поддерживает(сохранить туда можно). Просто какие-то программы открывают альфу, какие-то нет.
Например стандартная библиотека FB(FbGfx) - загружает(но не сохраняет) 32 битные с прозрачностью.
Некоторые редакторы могут открыть, вроде PixBuilder и старые фотошопы могут, но точно не скажу, не помню.
GIMP раньше мог, сейчас нет. Т.е. данные альфы туда положить можно, всё зависит от того, как их
интерпретирует принимающая сторона. Если ей альфа не нужна - эта компонента игнорируется,
если нужна - соотв. используется. В принципе 32 бита уже означает, что там альфа. 24 и ниже - нет альфы.

Вот курсор например с альфой:
Вложения
Тип файла: zip Курсор 1.zip (2.4 Кб, 3 просмотров)
1
 Аватар для Argus19
1446 / 463 / 78
Регистрация: 24.09.2017
Сообщений: 2,542
Записей в блоге: 24
29.04.2020, 05:45  [ТС]
Загружаем рисунок, загружаем второй, накладываем его на первый, вращаем, регулируем его местоположение на первом рисунке, яркость прозрачность, резкость , вращаем. При необходимости накладываем маски на всё. И потом:
Цитата Сообщение от Pro_grammer Посмотреть сообщение
затем сохраняем этот пирог в файл?
Цитата Сообщение от The trick Посмотреть сообщение
Просто пример приведи изображений.
Это примитив. Мне было надо так для защиты авторских прав:
http://valvelab.al.ru/6p14p-k.htm
Если у вас стоит Win XP могу дать портативную версию программы. Она не работает под Win 7 и далее и сайт разработчиков не работает. Все остальные программы, существующие на сегодняшний день, неудобны.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
29.04.2020, 07:12
Цитата Сообщение от Quiet Snow Посмотреть сообщение
32 битный поддерживает(сохранить туда можно). Просто какие-то программы открывают альфу, какие-то нет.
Ну да, как раз VB6 не работает с BMP 32бит, по крайней мере если штатными ср-ми загружать в Image или Picture


Цитата Сообщение от Argus19 Посмотреть сообщение
могу дать портативную версию программы.
Давайте, интересно посмотреть к чему стремиться.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
29.04.2020, 14:01
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Ну да, как раз VB6 не работает с BMP 32бит, по крайней мере если штатными ср-ми загружать в Image или Picture
Замечу что приведенная альфа грузится стандартными функциями, но не отображается. Проверить это можно Aero функциями - в этом случае контролы отображаются с альфой верно. Т.е. грузить такие изображения можно стандартными функциями, только выводить их нужно через соответствующие функции или библиотеки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.04.2020, 14:01

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
сукцессия 9. Математика подлости: как растения предали грибных друзей
anaschu 27.06.2026
Статья 2. Глобальная фосфорная война: эволюционно-экономические механизмы распределения биомов Земли Введение: Экологический рынок как игра с нулевой суммой Традиционная экология долгое время. . .
сукцессия 8. Как я спорил с ИИ, которые - агенты растений и ненавистники грибов!
anaschu 27.06.2026
Статья 1. Хроники грибного восстания: как Сократов диалог разрушил академические догмы ИИ Введение: Синдром «цифрового учебника» Современные большие языковые модели (LLM) обладают колоссальным. . .
Главный вопрос моделирования сукцессии
anaschu 27.06.2026
главный вопрос. Если эктомикориза лучше добывает недоступный фосфор. И ее масса максимальна из всех. А широколиственный лес тоже имеет самую крутую биомассу. То почему не возникло их симбиоза? Это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru