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

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

23.04.2020, 19:16. Показов 6990. Ответов 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
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
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
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
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
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 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
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
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
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
29.04.2020, 21:49
Цитата Сообщение от Argus19 Посмотреть сообщение
Переменные hImage и hWatermark получают хэндлы?
Да, хендлы GDI+.
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
29.04.2020, 22:12  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
хендлы GDI+
Их можно использовать только в GDI+?
Прочитал всё, что смог найти о Ipicture. В этом интерфейсе можно использовать только те методы, которые есть или можно обращаться к нему, используя его хэндл?
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
29.04.2020, 22:28
Цитата Сообщение от Argus19 Посмотреть сообщение
Их можно использовать только в GDI+?
Да.

Цитата Сообщение от Argus19 Посмотреть сообщение
Прочитал всё, что смог найти о Ipicture. В этом интерфейсе можно использовать только те методы, которые есть или можно обращаться к нему, используя его хэндл?
Можно использовать методы интерфейса, можно использовать GDI функции с хендлом.
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
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
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
30.04.2020, 19:55
Цитата Сообщение от Argus19 Посмотреть сообщение
Не получается получить хэндл:
Хендл получается вызовом IPicture.Handle. Это хендл HBITMAP/HICON/HMETAFILE в зависимости от картинки.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 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
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
30.04.2020, 20:20  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Хендл получается вызовом IPicture.Handle
Куда делось "get" из get_Handle?
get_CurDC - "Получает дескриптор текущего контекста устройства. Это свойство действительно только для растровых изображений."
Раз метод заявлен в описании, он должен как-то вызываться и присваивать значение переменной "которая получает контекст устройства."
Это проблемы документации или разница в вызовах из разных ЯП?
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 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
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
30.04.2020, 21:42  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
CurDC и SelectPicture - это два метода которые работают совместно
Видимо, я не точно написал.
Я о CurDC и Handle.

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


Цитата Сообщение от Argus19 Посмотреть сообщение
Где вы взяли такую чудесную картинку?
F2, правой кнопкой ->ShowHiddenMembers
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
02.05.2020, 01:12  [ТС]
Позабавило.
Если Picture.Visible = False, то PaintPicture работает нормально, а GetPixel, TransparentBlt и PlgBlt берут изображение, находящееся под невидимым Picture Box.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
03.05.2020, 10:12
Argus19, потому что PaintPicture работает непосредственно с растром, а не с окном.
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
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
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru