Как сделать Image в форме рисунка?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
yojik5_67
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 24
Зарегистрирован: 25.09.2007 (Вт) 17:52

Как сделать Image в форме рисунка?

Сообщение yojik5_67 » 25.09.2007 (Вт) 17:59

Проблема в том, что у меня на форме должны быть активные элементы, по нажатию которых происходило нечто...
Но, рисунки объектов неправильной формы, т.е. не прямоугольные и не квадратные, а, например параллелограммы и параллелепипеды.
КАК ???
Да и формы самих картинок не знаю как сделать по их контуру. В Фотошопе чтоль?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 25.09.2007 (Вт) 18:15

Проблема в том, что у меня на форме должны быть активные элементы, по нажатию которых происходило нечто...

В этом нет проблемы.

Но, рисунки объектов неправильной формы, т.е. не прямоугольные и не квадратные...

А квадраты не является частным случаем прямоугольника? :roll:

например параллелограммы и параллелепипеды.

:shock:
3D-форма?

КАК ???

Что именно как?


Да и формы самих картинок не знаю как сделать по их контуру. В Фотошопе чтоль?

Вопрос не ясен.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 26.09.2007 (Ср) 0:14

2 Хакер: Чего ж непонятного. Рисунок рельефный. Надо события нажатия срабатывало только в пределах рельефа.

2 yojik5_67:
В голову приходит идея - создавать регионы для этих объектов и проверять апишной функцией PointInRgn ( как то так она называлась ) пренадлежность точки (координат курсора) региону.

Второй вариант проще, но наверное хуже. Создать чёрнобелую маску объекта в памяти и положить её в CompatibleDC и делать GetPixel из неё по координатам курсора.

А ваще ещё стоит подумать и подождать совета умных )) :roll:

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 26.09.2007 (Ср) 9:45

Хакер
Не пугай так человека, ему станет еще непонятнее.
yojik5_67
Задача делится на две - создание изображения с непрямоугольным контуром и отслеживание нажатия мышки в пределах этого контура.
Первое проще всего делать при помощи GIF с прозрачным цветом, действительно, его можно сделать в фотошопе.
Вторая задача сложнее, первое решение, пришедшее на ум, не очень красивое - параллельно с Image с прозрачным цветом хранить невидимую Picture с таким же изображением и по событию Image.MouseDown опрашивать Picture.Point с соответствующих координат и проверять цвет на прозрачность.

Saturn.65
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 543
Зарегистрирован: 13.10.2006 (Пт) 18:46

Сообщение Saturn.65 » 26.09.2007 (Ср) 11:08

А если попробовать вот такие варианты:
1. Тот же треугольник разрезать на много частей, а потом на форме соединить. Будет не совсем конечно по контуру, но близко к этому. Все зависит, на сколько частей разрезать фигуру. Чем мельче части, тем точнее будет контур.
2. Если плясать от координат мыши.
Код: Выделить всё
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Label1.Caption ="координаты указателя (" & X & ", " & Y & ")"

Сделать привязку к Х и Y.
Только предварительно придется провести мышкой по контуру и считать данные X и Y. А потом уже от этого и делать команду.
По моему реальный вариант, если фигуры не очень уж замысловатые, иначе писать придется много. К тому же в фотошопе не придется резать.

yojik5_67
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 24
Зарегистрирован: 25.09.2007 (Вт) 17:52

Сообщение yojik5_67 » 26.09.2007 (Ср) 21:09

Хакер писал(а):А квадраты не является частным случаем прямоугольника? :roll:

Да ходил я в школу, и букварь-то читал, а не курил его. А так пишу, чтоб понятней было. А то попадаются такие кадры, которые предлагали "не хочешь прямоугольник - сделай квадрат"
ALX_2002 писал(а):создавать регионы для этих объектов и проверять API'шной функцией PointInRgn ( как то так она называлась ) принадлежность точки (координат курсора) региону.

Что за "зверь" такой - регион? Можно поподробней? Или где просветиться?
В моей литературе ничего подобного нет. Хотя, о чём речь - я примерно понимаю. Но как это...
Второй вариант не катит.
Saturn.65 писал(а):А если попробовать ...
Неа!
Mikle писал(а):параллельно с Image с прозрачным цветом хранить невидимую Picture с таким же изображением и по событию Image.MouseDown опрашивать Picture.Point с соответствующих координат и проверять цвет на прозрачность.

Тоже не пойдёт. А если два изображения окажутся рядом и наложатся?
Объект то останется прямоугольным. Углы будут прозрачными, но они будут! И при пересечении (наложении) двух и более объектов ...
Вопрос в том, как их сделать контурными (в смысле, чтобы граница объекта (Image ???) шла по кривому контуру изображения).
Или не Image, а Button исковеркать?

Признаюсь в теме обсуждения:
пытаюсь сделать карту района с активными (по нажатию) объектами - зданиями.
Здания, как сами понимаете, не все прямо стоят, да и размерами разные.
Вот и вся проблема!
Может вот так, представив себе, какой мне надо результат, что на ум придёт?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 26.09.2007 (Ср) 21:22

А если два изображения окажутся рядом и наложатся?

Ладно, читаем дальше:

пытаюсь сделать карту района с активными (по нажатию) объектами - зданиями.
Здания, как сами понимаете, не все прямо стоят, да и размерами разные.


Ээээ...мм..м.. Прости? Каким образом здания могут наложиться друг-на-друга? Угол одного здания будет постоен на угле крыши другого, да?

А вообще - Image-ы не нужны тебе. Рисуй всё просто, как графику а затем отдельно разбирайся с кликами.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 26.09.2007 (Ср) 22:10

А вот регионы как раз были бы к месту. Почитать на этом же форуме в поиске по region / регион / rgn.
label:
cli
jmp label

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 26.09.2007 (Ср) 23:19

Думаю вот это тебе подойдёт ))
Вложения
Regions.zip
(1.84 Кб) Скачиваний: 59

yojik5_67
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 24
Зарегистрирован: 25.09.2007 (Вт) 17:52

Сообщение yojik5_67 » 28.09.2007 (Пт) 19:12

Хакер писал(а):Ээээ...мм..м.. Прости? Каким образом здания могут наложиться друг-на-друга? Угол одного здания будет построен на угле крыши другого, да?

А вообще - Image-ы не нужны тебе. Рисуй всё просто, как графику а затем отдельно разбирайся с кликами.

1. Прикрепляю рисунок для наглядности.
2. Насколько я понял, ты предлагаешь на форме с фоновым рисунком проверять координаты курсора на соответствие их координатам зданий?
Но, позвольте, у одного здания порядка двух-трёх сотен пикселей в периметре (не говоря уже об внутренних), перемножить это всё на четыре -пять десятков зданий... Даже если ЭТО всё собрать в массивы, всё равно получается мартышкин труд, который я к пенсии закончу.
Это даже хуже SpectrumBasic'а, где я рисовал картинку, описывая чуть ли не каждый пиксел.
Не, не пойдёт.

А вообще, всем огромное спасибо, особенно за "регионы".
Буду пробовать, если что - сообщу.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 28.09.2007 (Пт) 19:57

Насколько я понял, ты предлагаешь [1] на форме с фоновым рисунком проверять координаты курсора на соответствие их координатам зданий[2]?
Но, позвольте, у одного здания порядка двух-трёх сотен пикселей в периметре (не говоря уже об внутренних), перемножить это всё на четыре -пять десятков зданий... Даже если ЭТО всё собрать в массивы, всё равно получается мартышкин труд, который я к пенсии закончу.


[1] - Нет, это не я предлагал.
[2] - Ну можно и так.
[] - Периметр изменеять в пикселях - это оригинально. Что всё "ЭТО" ты собрался "собирать в массивы" и зачем?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

yojik5_67
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 24
Зарегистрирован: 25.09.2007 (Вт) 17:52

Сообщение yojik5_67 » 29.09.2007 (Сб) 18:00

Хакер писал(а):1. Периметр измерять в пикселях - это оригинально.
2. Что всё "ЭТО" ты собрался "собирать в массивы" и зачем?

1. А как ещё измерить периметр нарисованной на компьютере (не на листе бумаги или на асфальте) фигуры? В см на мониторе?:)
2. Своевременный вопрос, потому, как я вот что надумал:
Я себе так представляю всю эту процедуру (теперь уже):
чёрно-белая картинка с изображёнными на ней прямоугольниками и параллелепипедами (залитыми внутри тоже чёрным). Создать прогу для сканирования картинки.
Я, зная общий размер картинки, задаю ей (проге) задачку, чтобы она построчно считывала цвета пикселей и заносила в динамический массив координаты чёрных пикселей.
Потом, в своей окончательной программе я использую этот массив для проверки на соответствие черному цвету "кликнутого" пиксела (есть ли его координаты в массиве).

Теперь мне нужна помощь в создании :
- Как занести в массив результат опроса цвета пиксела (пример команды: "записать в ячейку массива координаты 123,234")?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 29.09.2007 (Сб) 18:51

yojik5_67
1) Зачем вообще тебе периметр. К чему он тебе?
2) Исключи из этой схемы массив. Потому что твоя картинка - уже двухмерный массив. Зачем плодить двухмерные массивы, и при этом изобретать ещё какие-то сложные схемы порождения одного массива от другого?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 30.09.2007 (Вс) 17:33

Можно же создать юзерконтрол, и засунуть ему в MaskPicture что душе угодно.
Те же регионы, только гораздо нагляднее и проще.
Или я чего-то пропустил?
Изображение

yojik5_67
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 24
Зарегистрирован: 25.09.2007 (Вт) 17:52

Сообщение yojik5_67 » 30.09.2007 (Вс) 19:08

Хакер писал(а):yojik5_67
1) Зачем вообще тебе периметр. К чему он тебе?
2) Исключи из этой схемы массив. Потому что твоя картинка - уже двухмерный массив. Зачем плодить двухмерные массивы, и при этом изобретать ещё какие-то сложные схемы порождения одного массива от другого?

1. Да не нужен мне периметр!
Я про него заикнулся просто в тот момент рисовал эти долбаные параллелепипеды... Для понятности, что ли, не знаю ляпнул.
Короче они тут не при чем.
2. Массивы мне нужны трёх-мерные. Первые два индекса - координаты точки дома, третий индекс - номер дома. Иначе как программе знать куда переходить по нажатию на разные дома?
А про картинку в качестве "уже двухмерного массива" я понимаю, но как программе это объяснить... Как она различит клики на разные дома?

Вот сейчас мучуюсь с GetPixel'ом на предмет сканирования картинки. Он чегойто все ошибается и ошибается, то одно ему не так, то...

tyomitch писал(а):Можно же создать юзерконтрол, и засунуть ему в MaskPicture что душе угодно.
Те же регионы, только гораздо нагляднее и проще.
Или я чего-то пропустил?

Кому чего и куда засунуть?
Я далеко не профессионал, поэтому ничего не понял.
Если есть дельный совет, большая просьба пиши с примерным синтаксисом (или хотя бы по русски и поконкретней, попонятней) или где прочесть, ссылку, плиз.
Последний раз редактировалось yojik5_67 01.10.2007 (Пн) 19:21, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 30.09.2007 (Вс) 19:22

yojik5_67
Раз и на всегда: если ты ещё раз позволишь себе, даже заменив одну букву астериском, сматериться, наказание последует незамедлительно.

2. Ума не приложу, зачем здесь трёхмерный массив.
Ну досутим, Buildings(x,y,z), x,y - координаты на местности, а z - что? высота? этаж?

Но даже если нужен двухмерный [ НомерДома = Массив(КоордИкс, КоордИгрек) ], то это величайший абсурд и пустая трата памяти.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 30.09.2007 (Вс) 19:54

yojik5_67 писал(а):Если есть дельный совет, большая просьба пиши с примерным синтаксисом (или хотя бы по русски и поконкретней, попонятней) или где прочесть, ссылку, плиз.

Поищи MaskPicture по форуму.

Я полагал, ты сам можешь выделять ключевые слова из постов. Видимо, нет.
Изображение

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Сообщение netdemon » 30.09.2007 (Вс) 23:06

Берёшь свой сисунок. Делаешь монотонный фон цветом, которого нет в рисунке. Создаёшь пустой регион. Используя Getpixel проверяешь цвет точки и если это НЕ фон то создаёшь регион этой точки и комбинируешь с пустым и так пока все пикселы не проверишь. ПОтом накладываешь регион на свой PicBox и удаляешь регион.

По клику событие picBox_Click()


Качай используй и радуйся! :D

Не забудь свойство Autoredraw контрола PixtureBox ставить в True
Вложения
imASim.zip
(3.34 Кб) Скачиваний: 58

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.10.2007 (Пн) 0:11

netdemon, цикл с GetPixel -- это очень плохо и медленно. Тем более, что более простые и быстрые способы есть.

А ещё мне не нравится наличие урла на твоей новой аватаре. Если тебя не затруднит его замазать, буду благодарен.
Изображение

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Сообщение netdemon » 01.10.2007 (Пн) 0:17

tyomitch писал(а):netdemon, цикл с GetPixel -- это очень плохо и медленно. Тем более, что более простые и быстрые способы есть.

А ещё мне не нравится наличие урла на твоей новой аватаре. Если тебя не затруднит его замазать, буду благодарен.


Это не реклама. Аватар был одобрен.

Насчёт цикла в коде скачай пример и попробуй запустить. У него на карте картинки будут маленькие и перебрать все пикселы всех картинок будет не так медленно как ты думаешь. К тому же эти действия можно сделать в фоне с отображением диалога с прогрессом типа "Инициализация карты.. Х%"

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.10.2007 (Пн) 0:22

Да гонял я все эти циклы с GetPixel. Даже писал свой вариант, который быстрее стандартного в несколько раз, и выкладывал его здесь на форуме. Но я вновь спрашиваю: зачем вся эта премудрость, когда можно обойтись стандартными встроенными средствами VB?

Что аватар был одобрен одним из членов администрации, я в курсе.
Изображение

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Сообщение netdemon » 01.10.2007 (Пн) 0:26

tyomitch писал(а):Да гонял я все эти циклы с GetPixel. Даже писал свой вариант, который быстрее стандартного в несколько раз, и выкладывал его здесь на форуме. Но я вновь спрашиваю: зачем вся эта премудрость, когда можно обойтись стандартными встроенными средствами VB?

Что аватар был одобрен одним из членов администрации, я в курсе.



Ему нужен рабочий вариант. Я дал ему его. Пускай пробует, набирается опыта. Я ему и на Ассемблере могу тоже самое сделать, но ему это нафиг сейчас не нужно. Пускай этот вариант попробует или даёт более подробное ТЗ. :D

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 01.10.2007 (Пн) 0:32

netdemon писал(а):Ему нужен рабочий вариант. Я дал ему его. Пускай пробует, набирается опыта. Я ему и на Ассемблере могу тоже самое сделать, но ему это нафиг сейчас не нужно.

Гы, какие понты :-)
Давай на ассемблере, мне интересно поглядеть ;-)
Изображение

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Сообщение netdemon » 01.10.2007 (Пн) 0:34

tyomitch писал(а):
netdemon писал(а):Ему нужен рабочий вариант. Я дал ему его. Пускай пробует, набирается опыта. Я ему и на Ассемблере могу тоже самое сделать, но ему это нафиг сейчас не нужно.

Гы, какие понты :-)
Давай на ассемблере, мне интересно поглядеть ;-)



Я имел ввиду dll на ассемблере.
Тебе к спеху.? Это займёт приличное время.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 01.10.2007 (Пн) 1:08

tyomitch
Он мне ещё грозился свою димпломную работы по С++ показать.

А насчёт аватары: ссылка нечитабельна. Чем она тебя раздражает?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

netdemon
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 179
Зарегистрирован: 04.09.2007 (Вт) 15:51

Сообщение netdemon » 01.10.2007 (Пн) 6:58

да его помоему всё раздражает, даже он сам. :roll:

yojik5_67
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 24
Зарегистрирован: 25.09.2007 (Вт) 17:52

Сообщение yojik5_67 » 01.10.2007 (Пн) 19:10

Во первых прошу прощения за вольность. Виноват. :oops:
Во вторых всем огромное спасибо за советы!
Буду пробовать.
Ещё один вопросик по GetPixel:
Код: Выделить всё

'в модуле
Public Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
'в программе
q = GetPixel (GetDC(0), x, y)

GetDC(0), оказывается "заказывает" работу с экраном, т.е. программа начинает сканировать рабочий стол. А как ей написать, чтобы она активное окно "обрабатывала", или скажем Picture или Image?
В справке башку сломал об аглицкий язык, но так и не увидел ничего...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 01.10.2007 (Пн) 19:21

yojik5_67
С Picture - заменить GetDC(0) на mypicture.hDC.
С Image - Никак.
C контроллом, у которого нет свойства hDC (например с кнопкой) - GetDC(MyCommandButton.hDC).

Если интересует также неклиентская область окна:
GetWindowDC(something.hWnd)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

yojik5_67
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 24
Зарегистрирован: 25.09.2007 (Вт) 17:52

Сообщение yojik5_67 » 01.10.2007 (Пн) 19:34

Заработало !!!
Ещё раз ВСЕМ огромное спасибо.
Если получится стоящий вариант, выложу.

P.S. Может из готового продукта будет понятней, зачем мне трехмерные, да и вообще массивы... А может выяснится, что мартышкин труд делал, а можно было и проще и надёжней... посмотрим. Дал бы Бог терпения и времени.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 01.10.2007 (Пн) 20:21

C контроллом, у которого нет свойства hDC (например с кнопкой) - GetDC(MyCommandButton.hDC).
Имелось в виду .hWnd

Кстати, если уж тебе так понравились регионы, есть ф-ция PtInRegion, проверяющая соответствие координат точки определенному региону..
Тогда тебе нужен вообще одномерный массив - с номерами регионов...
label:
cli
jmp label

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 90

    TopList