Прозрачные прямоугольники + их перемещение и изменение

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Прозрачные прямоугольники + их перемещение и изменение

Сообщение giaber » 26.12.2017 (Вт) 11:07

Здравствуйте!
Делал на VB6 прогу вырезания из большой картинки "кусков" с последующим их сохранением в отдельные файлы, но, в итоге, сделав на 80%, решил перейти на VB.Net - когда-то ж надо начинать.

Для указания вырезаемых "кусков" нужны прямоугольники с возможностью их передвижения и изменения размеров пользователем с помощью мыши.
Попробовал:
Код: Выделить всё
Label1.BackColor = Color.Transparent

но не устроило - это не реальная прозрачность, при накладке двух и более лейблов получается совсем не то - верхний лейбл показывает часть картинки Parent-a под ним, но рамка нижнего лейбла отсекается верхним лейблом и не показывается.
Получается так: https://ibb.co/dCU0Pm
А надо так: https://ibb.co/jKcbx6

Посоветуйте, как можно решить такую задачу?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Прозрачные прямоугольники + их перемещение и изменение

Сообщение Viper » 26.12.2017 (Вт) 19:32

Что-ли "резиновый" прямоугольник нужен?
Весь мир матрица, а мы в нем потоки байтов!

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Прозрачные прямоугольники + их перемещение и изменение

Сообщение giaber » 26.12.2017 (Вт) 21:11

Хм... В общем-то "резиновый" прямоугольник, да, но после MouseUp остающийся на экране и с которым потом можно манипулировать - перемещать и изменять размеры. Ну, как мы в дизайн-моде контролы на форме рисуем в VB или в VB.Net. Ну, то есть рисовать "резиновый" прямоугольник я умею - скачал примеры с инета, но вот с ними потом ничего не сделать...
Мне кажется, текст бокс прозрачный подходит как раз, без мудрений всяких, но вот проблема прозрачности. В VB6 нормально смотрится всё, а в VB.Net как оказалось совсем по другому выглядит.

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

Re: Прозрачные прямоугольники + их перемещение и изменение

Сообщение Mikle » 29.12.2017 (Пт) 9:15

Можно просто рисовать для прямоугольника четыре линии хоть с помощью Graphics, чтобы не мерцало - двойная буферизация. Я бы, конечно, использовал SR2D вместо Graphics.

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Прозрачные прямоугольники + их перемещение и изменение

Сообщение giaber » 02.01.2018 (Вт) 11:09

Поздравляю всех с Новым Годом! Здоровья, счастья и успехов во всём! Пусть в новом году всё изменится волшебным образом и решатся все проблемы, настроение будет всегда солнечное и радостное, и что бы не задумал, что бы не сделал – пусть делается легко и просто, принося лёгкость - в душу, радость - на сердце, улыбку - на лицо, здоровье и молодость - в тело, деньги - на счёт!


2 Mikle
Программа представляет собой “резалку” больших рисунков (bmp, jpg, gif, png)на меньшие блоки с последующей записью этих блоков в виде отдельных файлов.
Формирование блоков:
1. Горизонтальными и вертикальными линиями – линии рисуются при клике на рисунке, столбцы и строки получаются произвольной ширины-высоты, режим рисования вертикальных и горизонтальных линий – раздельный, у меня так реализовано, поскольку на правую клавишу подвешено стирание, а на среднюю - лупа.
Должна быть возможность последующего изменения цвета линий и и перемещения мышью (в VB6 я пользуюсь XOR-рисованием)

2. Числовое задание грида – пользователь задаёт кол-во столбцов и строк, программа рисует соответствующие линии на равных расстояниях, все столбцы имеют одинаковую ширину, все строки – одинаковую высоту
Должна быть возможность последующего изменения цвета линий и естесственно,их стирания

3. Блоками-прямоугольниками. Пользователь нажимает клавишу мыши и не отпуская, тянет курсор – рисуется прямоугольник. Пользователь должен иметь возможность в любой момент перемещать и стирать любой ранее нарисованный прямоугольник и изменять его размеры, а также степень прозрачности и цвет

4. Блоками-многоугольниками произвольной формы. Кликами на рисунке рисуется многоугольник. Пользователь должен иметь возможность в любой момент перемещать и стирать любой ранее нарисованный многоугольник и изменять его размеры, а также степень прозрачности и цвет

Насколько я понимаю, ваша SR2D позволяет всё это делать, да? И в VB.Net это тоже будет работать, да? Если так то и думать нечего – надо переходить на SR2D! Праздники сбили меня, но сейчас скачаю и попробую разобраться как пользоваться. Хотя боюсь, что как всегда буду тупить 

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Прозрачные прямоугольники + их перемещение и изменение

Сообщение giaber » 11.01.2018 (Чт) 9:07

Mikle, здравствуйте! Извиняюсь за долгое молчание – но эти праздники! Родственникии, друзья…
Скачал я SR2D – ну что сказать – КРУТО! Но, увы, - ничего не могу понять/ сделать своим ламерским умишком.
Проблемы начинаются с первого же шага:
Создал проект, подключил modSR2D и SR2D_Sprite и закинул SR2D.dll в папку проекта.
Беру “Простейший пример использования” из сопутствующего SR2D описания (SR2D_VB6.txt):

Код: Выделить всё
Option Explicit

Dim SprTest As New SR2D_Sprite

Private Sub Form_Load()
  Me.Show
  DoEvents
  Me.ScaleMode = vbPixels
  SprTest.Init Me.ScaleWidth, Me.ScaleHeight
  SprTest.ClearBuffer ARGB(0, 255, 0, 0)
  SprTest.PaintToHDC Me.hDC
End Sub


Но у SprTest нет метода PaintToHDC, выполнение останавливается с соответствующим сообщением, ну и, собственно, я застрял и ничего дальше не смог сделать. Но, впрочем, дальше даже если бы смог, всё равно абсолютно не представляю, как это всё работает:
1. Как сделать спрайт с бордером
2. Как изменять цвет этого бордера
3. Как сделать полупрозрачный спрайт с возможностью динамического контроля цвета
4. Что делать с мышиными событиями – собственных событий спрайт не имеет(?), пересчитывать экранные координаты, чтоб например, определить, мы на спрайте нажали клавишу мыши или нет и изменить размер спрайта при драгинге мыши с нажатой клавишей?
5. Как делать полигоны – обрезать спрайт регионами по известным координатам точек полигона? Это будет работать здесь?
6. В программе должны быть десятки спрайтов – как с ними работать? Я попробовал заранее предопределённый массив с 2мя спрайтами (Dim Sprt(2) As New SR2D_Sprite), но не совсем понимаю, как работать в случае динамически изменяемого массива – ведь заранее неизвестно, на сколько кусков режется картинка, да и какие-то выделенные зоны в процессе работы могут быть удалены пользователем и выделены другие

Mikle, не могли бы вы сделать пример, в котором эти моменты были бы показаны? Ох, как бы я был вам благодарен! Да и вы могли бы этот пример включить в набор “Примеры использования SR2D” – ведь много людей найдутся, которые не программируют игры, но могли бы использовать SR2D в обычных приложениях
Последний раз редактировалось giaber 12.01.2018 (Пт) 7:53, всего редактировалось 1 раз.

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

Re: Прозрачные прямоугольники + их перемещение и изменение

Сообщение Mikle » 11.01.2018 (Чт) 10:09

giaber писал(а):у SprTest нет метода PaintToHDC

В версии 3.2 это называется PaintToDevice.
giaber писал(а):Создал проект, подключил modSR2D и SR2D_Sprite и закинул SR2D.dll в папку проекта.

Подключение к NET немного сложнее, но есть пример, в п.1 темы SR2D я давал ссылку на актуальные версии: http://www.gamedev.ru/community/bycircl ... ?id=162451
Можно просто брать пример DPBM за основу, там всё подключено правильно, а сама работа с SR2D мало отличается в vb6 и в vb.net.
giaber писал(а):Да и вы могли бы этот пример включить в набор “Примеры использования SR2D”

Там есть набор примеров для vb6, для vb.net только DPBM.
giaber писал(а):Как сделать спрайт с бордером

Как вариант, нарисовать по краям спрайта четыре линии, у спрайта есть метод DrawLine, у этого метода есть параметры DotStep (пунктир) и IsXor (XOR рисование), последнее позволяет рисовать прямо на бэкбуфере, повторным рисованием восстанавливать.
giaber писал(а):Как изменять цвет этого бордера

Каким цветом рисуем линии, такой цвет и выйдет (если не использовать IsXor).
giaber писал(а):Как сделать полупрозрачный спрайт с возможностью динамического контроля цвета

Сделать полупрозрачный - куча вариантов, начиная от Op.Add2D (именно 50% прозрачности), можно Op.Blend (задаём любую прозрачность), можно задействовать альфаканал, зависит от ситуации.
Про динамический контроль цвета не очень понял.
giaber писал(а):Что делать с мышиными событиями – собственных событий спрайт не имеет(?), пересчитывать экранные координаты

Да. А можно написать свою надстройку над спрайтом (класс или контрол), которая будет понимать мышиные события.
giaber писал(а):Как делать полигоны – обрезать спрайт регионами по известным координатам точек полигона? Это будет работать здесь?

Для этого может подойти метод MaskDraw.
giaber писал(а):В программе должны быть десятки спрайтов – как с ними работать? Я попробовал заранее предопределённый массив с 2мя спрайтами (Dim Sprt(2) As New SR2D_Sprite), но не совсем понимаю, как работать в случае динамически изменяемого массива – ведь заранее неизвестно, на сколько кусков режется картинка, да и какие-то выделенные зоны в процессе работы могут быть удалены пользователем и выделены другие

Это уже вопрос не по SR2D, а по организации проекта вообще. Можно использовать коллекции, я предпочитаю массивы спрайтов. Но зоны выделение вовсе не обязаны быть отдельными спрайтами, их можно динамически рисовать линиями прямо на бэкбуфере, когда ты в фотошопе делаешь выделение и применяешь к нему разные фильтры, новый слой (спрайт) для выделения не образуется.

PS.
Тут все на "ты" общаются.

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Прозрачные прямоугольники + их перемещение и изменение

Сообщение giaber » 12.01.2018 (Пт) 21:33

Mikle, здравствуй!
Будь добр, покажи, как же правильно сделать Спрайт с Op.Blend на Picture box-e с картинкой. Я не могу врубиться ни в логику ни в синтаксис, кручу всякие варианты,не выходит:
Код: Выделить всё
Option Explicit

Dim SprBack As New SR2D_Sprite
Dim SprOver As New SR2D_Sprite
Dim Op As SR2D_Op ' ?

Private Sub Form_Load()
    DoEvents
    Op = 128 ' ?
    SprOver.Init 100, 100, Op ' ?
    SprOver.ClearBuffer ARGB(0, 0, 0, 255)   
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = 1 Then
        SprBack.LoadFromIPicture Picture1, Picture1.hDC 'это разве я нормально делаю - каждый раз загружать картинку?
        '  SprBack.Draw SprOver, X, Y, 128 ' всякие
        '  SprBack.Draw SprOver, X, Y, Op.Blend = 128 ' варианты
        '  SprBack.Draw SprOver, X, Y, OpBlend = 128 ' которые я
        ' SprBack.Draw SprOver, X, Y, Op ' пробовал
        SprBack.PaintToDevice Picture1.hDC
    End If
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Set SprOver = Nothing
    Set SprBack = Nothing
End Sub

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

Re: Прозрачные прямоугольники + их перемещение и изменение

Сообщение Mikle » 12.01.2018 (Пт) 23:21

Я не понял, тебе на vb6 или vb.net надо? Раздел по vb.net, а код как на vb6.
giaber писал(а):это разве я нормально делаю - каждый раз загружать картинку?

Нет, конечно. Завтра всё покажу, сейчас уже спать надо.

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Прозрачные прямоугольники + их перемещение и изменение

Сообщение giaber » 13.01.2018 (Сб) 8:34

"Виноват! Вспылил, был неправ!" :)
Тут какое дело - я вообще-то на VB6 делал эту прожку и процентов на 75 сделал, но очередной раз столкнулся с какими-то моментами, которые относительно "коряво" в VB6 приходилось решать и всегда действовали мне на нервы - ну, мелочи типа MouseEnter и MouseLeave, изменение позиций и размеров контролов при сайзинге формы и тому подобное и поэтому решил воспользоваться моментом и начать осваивать VB.Net. Но там столкнулся с отсутствием Xor-рисования что и вызвало вопросы и потребность в SR2D. Но поскольку VB6 я знаю намного лучше VB.Net-а, а VB.Net что-то нелегко даётся, я как бы осваиваю SR2D в VB6, а когда разберусь - интегрирую в прогу на VB.Net. Короче, блин! Прога будет, конечно, на VB.Net, но от твоей подсказки и на VB6 я бы не отказался (а морда не треснет? :) )

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

Re: Прозрачные прямоугольники + их перемещение и изменение

Сообщение Mikle » 13.01.2018 (Сб) 9:37

Вот использование OpBlend, этот оператор можно использовать в методе Draw для любого спрайта:
Вложения
Blend.zip
(200.8 Кб) Скачиваний: 391


Вернуться в Visual Basic .NET

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

    TopList  
cron