Форум программистов, компьютерный форум, киберфорум
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. Показов 7673. Ответов 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
 Аватар для Argus19
1446 / 463 / 78
Регистрация: 24.09.2017
Сообщений: 2,542
Записей в блоге: 24
29.04.2020, 16:09  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Давайте
Кое-как записал основные действия программы:
https://drive.google.com/file/... sp=sharing
Сама программа:
https://drive.google.com/file/... sp=sharing

По прежнему открыт вопрос: как определить hDC IPicture. Не разберусь с описанием:
https://docs.microsoft.com/ru-... -get_curdc
Ерунда получается.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
29.04.2020, 18:33
Цитата Сообщение от Argus19 Посмотреть сообщение
Ошибка Google Диска:
Этот файл нельзя открыть, так как он нарушает Условия использования.
Но по видео в принципе всё понятно. Программка то простая, вроде таких ватермарков, работающих на современных ОС сейчас в ходу не меньше десятка, включая и совершенно бесплатные.
Но самому, конечно, интересней написать.

Добавлено через 21 минуту
Нашёл, установил на win7 x64, работает хорошо. Только надо настроить режим совместимости с XP, обязательно в настройках совместимости отключить композицию рабочего стола.
0
 Аватар для Argus19
1446 / 463 / 78
Регистрация: 24.09.2017
Сообщений: 2,542
Записей в блоге: 24
29.04.2020, 18:53  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Но самому, конечно, интересней написать
Вот именно! Тем более, что новой версии уже не будет. Сайт авторов не работает.
Попробуйте скачать архив:
https://drive.google.com/open?... bAddO8eccI
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
29.04.2020, 19:15
Цитата Сообщение от Argus19 Посмотреть сообщение
Попробуйте скачать архив:
Всё равно не получается:
Файл заражен вирусом

Скачивать зараженные файлы может только владелец.
такие файлы надо упаковывать в архив с паролем, тогда Гугл его проверить не сможет, и даст скачать.
Но мне то уже не надо, я же установил нормальную версию и зарегистрировал.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
29.04.2020, 19:40
Вот код, без проверок ошибок, тут все довольно-таки понятно:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Option Explicit
 
Private Sub Form_Load()
    Dim hToken      As Long
    Dim tGpInput    As GdiplusStartupInput
    Dim hImage      As Long
    Dim hWatermark  As Long
    Dim hImageSurf  As Long
    Dim hWindowSurf As Long
    Dim lWWidth     As Long
    Dim lWHeight    As Long
    
    tGpInput.GdiplusVersion = 1
    
    GdiplusStartup hToken, tGpInput
    GdipLoadImageFromFile App.Path & "\Src.jpg", hImage
    GdipLoadImageFromFile App.Path & "\Watermark.png", hWatermark
    GdipGetImageWidth hWatermark, lWWidth
    GdipGetImageHeight hWatermark, lWHeight
    GdipGetImageGraphicsContext hImage, hImageSurf
    GdipSetSmoothingMode hImageSurf, SmoothingModeHighQuality
    GdipSetInterpolationMode hImageSurf, InterpolationModeBicubic
    
    ' // Поворот относительно центра картинки
    GdipTranslateWorldTransform hImageSurf, -lWWidth / 2, -lWHeight / 2, MatrixOrderAppend
    ' // поворачиваем на 40 градусов
    GdipRotateWorldTransform hImageSurf, 40, MatrixOrderAppend
    ' // Перемещаем в нужную точку (100;100)
    GdipTranslateWorldTransform hImageSurf, 100, 100, MatrixOrderAppend
 
    GdipDrawImageRect hImageSurf, hWatermark, 0, 0, lWWidth, lWHeight
 
    ' // Выводим на форму
    GdipCreateFromHDC Me.hDC, hWindowSurf
    GdipDrawImage hWindowSurf, hImage, 0, 0
    GdipDeleteGraphics hWindowSurf
    GdipDeleteGraphics hImageSurf
    GdipDisposeImage hImage
    GdipDisposeImage hWatermark
    GdiplusShutdown hToken
    
End Sub
Вложения
Тип файла: zip watermark.zip (137.7 Кб, 16 просмотров)
1
 Аватар для Argus19
1446 / 463 / 78
Регистрация: 24.09.2017
Сообщений: 2,542
Записей в блоге: 24
29.04.2020, 20:58  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
нормальную версию и зарегистрировал
Хорошо.
Цитата Сообщение от The trick Посмотреть сообщение
тут все довольно-таки понятно:
Visual Basic
1
2
   GdipLoadImageFromFile App.Path & "\Src.jpg", hImage
    GdipLoadImageFromFile App.Path & "\Watermark.png", hWatermark
Изображения загружаются в память. Переменные hImage и hWatermark получают хэндлы?
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
29.04.2020, 21:49
Цитата Сообщение от Argus19 Посмотреть сообщение
Переменные hImage и hWatermark получают хэндлы?
Да, хендлы GDI+.
0
 Аватар для Argus19
1446 / 463 / 78
Регистрация: 24.09.2017
Сообщений: 2,542
Записей в блоге: 24
29.04.2020, 22:12  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
хендлы GDI+
Их можно использовать только в GDI+?
Прочитал всё, что смог найти о Ipicture. В этом интерфейсе можно использовать только те методы, которые есть или можно обращаться к нему, используя его хэндл?
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
29.04.2020, 22:28
Цитата Сообщение от Argus19 Посмотреть сообщение
Их можно использовать только в GDI+?
Да.

Цитата Сообщение от Argus19 Посмотреть сообщение
Прочитал всё, что смог найти о Ipicture. В этом интерфейсе можно использовать только те методы, которые есть или можно обращаться к нему, используя его хэндл?
Можно использовать методы интерфейса, можно использовать GDI функции с хендлом.
0
 Аватар для Argus19
1446 / 463 / 78
Регистрация: 24.09.2017
Сообщений: 2,542
Записей в блоге: 24
30.04.2020, 17:46  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Можно использовать методы интерфейса, можно использовать GDI функции с хендлом.
Не получается получить хэндл:
Visual Basic
1
2
3
4
5
Public TempPic As IPicture
............
Set TempPic = LoadPicture(FileNam)
Dim phdc As hdc
res = get_CurDC(hdc)
Здесь: https://docs.microsoft.com/ru-... l-ipicture
толком ничего не написано. Что я не так делаю?
Просто хочу понять, как работать с Ipicture, раз уж начал.
Здесь: https://technet.microsoft.com/... 1(v=vs.120) есть строка:
"IID_IPicture is defined as 7BF80980-BF32-101A-8BBB-00AA00300CAB"
Нашёл такое:
PureBasic
1
2
    Const sIID_IPicture = "{7BF80980-BF32-101A-8BBB-00AA00300CAB}"
    Const S_OK = 0     ' indicates successful HRESULT
Понимаю, что это нужно для ocidl, но толком никто не пишет "что, зачем и почему".
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
30.04.2020, 19:55
Цитата Сообщение от Argus19 Посмотреть сообщение
Не получается получить хэндл:
Хендл получается вызовом IPicture.Handle. Это хендл HBITMAP/HICON/HMETAFILE в зависимости от картинки.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
30.04.2020, 20:12
Сделал небольшой проект на GDI+, обернул некоторые сущности в удобные классы. Проект демонстрирует возможность работы с маской и трансформациями цвета:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
Option Explicit
 
Private m_cGDIPlus  As CGDIPlus
 
Private Sub Form_Load()
    Dim cImgBack    As CGDIPImage
    Dim cImgFill    As CGDIPImage
    Dim cImgMask    As CGDIPImage
    Dim cWinSurf    As CGDIPGraphics
    Dim cAttr       As CGDIPImageAttributes
    Dim cColMtx     As CGDIPColorMatrix
    
    On Error GoTo err_handler
    
    Set m_cGDIPlus = New CGDIPlus
    
    Set cImgBack = m_cGDIPlus.LoadImageFromFile(App.Path & "\bg.png")
    Set cImgFill = m_cGDIPlus.LoadImageFromFile(App.Path & "\fill.png")
    Set cImgMask = m_cGDIPlus.LoadImageFromFile(App.Path & "\mask.png")
    
    cImgFill.ResetMask
    cImgFill.ApplyMask cImgMask, 0, 0
    
    Set cWinSurf = m_cGDIPlus.CreateGraphicsFromHDC(Me.hDC)
    
    cWinSurf.InterpolationMode = InterpolationModeHighQuality
    cWinSurf.SmoothingMode = SmoothingModeAntiAlias
    
    ' // Рисуем задний фон
    cWinSurf.DrawImage cImgBack, 0, 0, cImgBack.Width * 2, cImgBack.Height * 2
    
    ' // Трансформация относительно центра картинки
    cWinSurf.TranslateWorldTransform -cImgFill.Width / 2, -cImgFill.Height / 2
    
    ' // Поворот на 65 градусов
    cWinSurf.RotateWorldTransform 65
    
    ' // Смещение, левый верхний угол 100, 100 пикселей
    cWinSurf.TranslateWorldTransform cImgFill.Width / 2 + 200, cImgFill.Height / 2 + 200
    
    ' // Выделяем цвета (увеличиваем интенсивность красного)
    Set cColMtx = New CGDIPColorMatrix
    
    cColMtx.m(0, 0) = 2: cColMtx.m(1, 1) = 1: cColMtx.m(2, 2) = 1: cColMtx.m(3, 3) = 1
    
    Set cAttr = m_cGDIPlus.CreateImageAttributes(cColMtx)
    
    cWinSurf.DrawImage cImgFill, 0, 0, cImgFill.Width, cImgFill.Height, , , , , cAttr
    
    ' // Инверсия маски и синего канала
    cColMtx.m(0, 0) = 1: cColMtx.m(1, 1) = 1: cColMtx.m(2, 2) = -1: cColMtx.m(3, 3) = -1
    cColMtx.m(3, 4) = 1: cColMtx.m(2, 4) = 1
    
    Set cAttr.ColorMatrix = cColMtx
    
    cWinSurf.ResetWorldTransform
    
    cWinSurf.DrawImage cImgFill, 0, 0, cImgFill.Width, cImgFill.Height, , , , , cAttr
    
    Exit Sub
    
err_handler:
    
    MsgBox Err.Source & " " & Err.Description
    
End Sub
Вложения
Тип файла: zip mask.zip (18.8 Кб, 25 просмотров)
2
 Аватар для Argus19
1446 / 463 / 78
Регистрация: 24.09.2017
Сообщений: 2,542
Записей в блоге: 24
30.04.2020, 20:20  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Хендл получается вызовом IPicture.Handle
Куда делось "get" из get_Handle?
get_CurDC - "Получает дескриптор текущего контекста устройства. Это свойство действительно только для растровых изображений."
Раз метод заявлен в описании, он должен как-то вызываться и присваивать значение переменной "которая получает контекст устройства."
Это проблемы документации или разница в вызовах из разных ЯП?
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
30.04.2020, 20:32
Цитата Сообщение от Argus19 Посмотреть сообщение
Куда делось "get" из get_Handle?
Мы же по VB6 говорим, у него одно имя на get/set/putref хендлеры.


Цитата Сообщение от Argus19 Посмотреть сообщение
Раз метод заявлен в описании, он должен как-то вызываться и присваивать значение переменной "которая получает контекст устройства."
Это проблемы документации или разница в вызовах из разных ЯП?
CurDC и SelectPicture - это два метода которые работают совместно:
The CurDC property and the IPicture::SelectPicture method exist to circumvent restrictions in Windows; specifically, that an object can only be selected into exactly one device context at a time. In some cases, a picture object may be permanently selected into a particular device context (for example, a control may use a certain picture for a background). To use this picture property elsewhere, it must be temporarily deselected from its old device context, selected into the new device context for the operation, then reselected back into the old device context. The IPicture::get_CurDC method returns the device context handle into which the picture is currently selected. The IPicture::SelectPicture method selects the picture into a new device context, returning the old device context and the picture's GDI handle. The caller should select the picture back into the old device context when the caller is done with it, as is normal for Windows code.

Notes to Callers
The caller always owns any device contexts passed between it and the picture object. Because the picture object maintains a copy of the HDC, the caller should use a memory device context (created with the CreateCompatibleDC function) and not a screen device context (from GetDC, CreateDC, or BeginPaint), because the screen device contexts are a limited system resource.
0
 Аватар для Argus19
1446 / 463 / 78
Регистрация: 24.09.2017
Сообщений: 2,542
Записей в блоге: 24
30.04.2020, 21:42  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
CurDC и SelectPicture - это два метода которые работают совместно
Видимо, я не точно написал.
Я о CurDC и Handle.

Добавлено через 10 минут
Цитата Сообщение от The trick Посмотреть сообщение
Мы же по VB6 говорим
Где вы взяли такую чудесную картинку?
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
30.04.2020, 21:51
Цитата Сообщение от Argus19 Посмотреть сообщение
Видимо, я не точно написал.
Я о CurDC и Handle.
Я же написал:
Цитата Сообщение от The trick Посмотреть сообщение
Хендл получается вызовом IPicture.Handle. Это хендл HBITMAP/HICON/HMETAFILE в зависимости от картинки.
Handle - это не HDC, это хендл картинки.


Цитата Сообщение от Argus19 Посмотреть сообщение
Где вы взяли такую чудесную картинку?
F2, правой кнопкой ->ShowHiddenMembers
0
 Аватар для Argus19
1446 / 463 / 78
Регистрация: 24.09.2017
Сообщений: 2,542
Записей в блоге: 24
02.05.2020, 01:12  [ТС]
Позабавило.
Если Picture.Visible = False, то PaintPicture работает нормально, а GetPixel, TransparentBlt и PlgBlt берут изображение, находящееся под невидимым Picture Box.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
03.05.2020, 10:12
Argus19, потому что PaintPicture работает непосредственно с растром, а не с окном.
0
 Аватар для Argus19
1446 / 463 / 78
Регистрация: 24.09.2017
Сообщений: 2,542
Записей в блоге: 24
05.05.2020, 09:35  [ТС]
Добрался до использования Ipicture.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Option Explicit
Private TempPic As IPicture
Private FileNam As String
Private x As Long, y As Long, cx As Long, cy As Long, xSrc As Long, ySrc As Long, cxSrc As Long, cySrc As Long
Private res As Long
'---------------
    Set TempPic = LoadPicture(FileNam)              '
'-----------------------
 
Private Sub Command2_Click()                            'Êîïèðîâàíèå IPicture
cx = Picture1.Width
cy = Picture1.Height
    cxSrc = TempPic.Width
    cySrc = TempPic.Height
res = TempPic.Render(Picture1.hDC, 0, 0, cx, cy, 0, 0, cxSrc, cySrc, 0)
End Sub
Ругается на .Render. Пишет, что "ожидается функция или переменная".
Я же вызываю метод и при редактировании он появляется во всплывающей подсказке. Что не так?

Добавлено через 1 час 23 минуты
Разобрался. Нашёл в интернете только в одном месте и только Google.
0
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
05.05.2020, 09:40
Цитата Сообщение от Argus19 Посмотреть сообщение
Ругается на .Render. Пишет, что "ожидается функция или переменная".
Ну. У тебя же процедура Render.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.05.2020, 09:40

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
сукцессия 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