Программное создание маски для спрайта

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
CORBA
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 22.11.2003 (Сб) 13:41
Откуда: Ukraine-Crimea-Feodosia

Программное создание маски для спрайта

Сообщение CORBA » 03.06.2005 (Пт) 18:10

Ищу пример как программно создать маску на VB. Подскажите как это сделать. Заранее благодарен.

PS
Что-то похожее нашёл для Делфи. Но в Vb я не могу найти аналог object.Mask

var
Sprite,Mask:TBitmap;
begin
Sprite:=TBitmap.Create;
Sprite.LoadFromFile('G0100219.bmp');
Mask:=TBitmap.Create;
Mask.LoadFromFile('G0100219.bmp');
Mask.Mask(clBlack); // Создание маски
// Преобразование в маску, после этого получится Bitmap, представленный
// на Рис 2
MaskBlt(Form1.Canvas.Handle, 10,10, Sprite.Width, Sprite.Height,
Sprite.Canvas.Handle,0,0,Mask.MaskHandle,0,0,SRCPAINT);
// После вызова этой функции, экран выглядит как на рисунке 3.
BitBlt(Form1.Canvas.Handle, 10, 10, Sprite.Width, Sprite.Height,
Sprite.Canvas.Handle,0,0, SRCPAINT);
end;
У каждой сложной задачи есть множество простых для понимания, но неправильных решений.

Demonx
Бывалый
Бывалый
 
Сообщения: 237
Зарегистрирован: 25.06.2003 (Ср) 0:08
Откуда: Литва/Висагинас

Сообщение Demonx » 03.06.2005 (Пт) 18:23

Но в Vb я не могу найти аналог object.Mask

ИМХО. По моему и не надо, просто используй MaskBlt
Изображение

CORBA
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 22.11.2003 (Сб) 13:41
Откуда: Ukraine-Crimea-Feodosia

Сообщение CORBA » 03.06.2005 (Пт) 19:47

Попробывал. VB вылетел с критической ошибкой.
У каждой сложной задачи есть множество простых для понимания, но неправильных решений.

Jenizix
Географ
Географ
Аватара пользователя
 
Сообщения: 545
Зарегистрирован: 20.04.2004 (Вт) 20:52
Откуда: Москва

Сообщение Jenizix » 03.06.2005 (Пт) 23:27

А тег [code]! использовать не забыл????
Ушел в себя, вернусь не скоро...

Если вам нужно сделать прозрачной только форму, а контролы на ней нет, то вам сюда!!!

ism
Постоялец
Постоялец
 
Сообщения: 337
Зарегистрирован: 12.12.2001 (Ср) 12:59
Откуда: Russia, Saint-Petersburg

Сообщение ism » 04.06.2005 (Сб) 1:10

Если я правильно понял вопрос, то вот http://www.vbnet.ru/faq/showtopic.asp?id=367.

CORBA
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 22.11.2003 (Сб) 13:41
Откуда: Ukraine-Crimea-Feodosia

Сообщение CORBA » 04.06.2005 (Сб) 1:12

Поковырявшись побольше с MaskBlt всё же кое-что получилось.
Груба говоря получилась копия работы функции BitBlt но желаемоего результата так и не получилось. Одна из главных проблем я не знаю принципов работы с этой функцией и приходится всё вычислять методом научного тыка. Гуру, помогите разобраться.

Код: Выделить всё
Private Declare Function MaskBlt Lib "gdi32" (ByVal hdcDest As Long, ByVal nXDest As Long, ByVal nYDest As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hdcSrc As Long, ByVal nXSrc As Long, ByVal nYSrc As Long, ByVal hbmMask As Long, ByVal xMask As Long, ByVal yMask As Long, ByVal dwRop As Long) As Long


Private Sub Command1_Click()
MaskBlt Picture2.hdc, 0, 0, 96, 112, Picture1.hdc, 0, 0, vbBlack, 96, 112, vbSrcCopy
End Sub
' в первом пиктаре находится картинка с чёрным фоном
У каждой сложной задачи есть множество простых для понимания, но неправильных решений.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.06.2005 (Сб) 7:21

http://bbs.vbstreets.ru/viewtopic.php?p=72122#72122

А конкретно,
Код: Выделить всё
'Маска накладываемой картинки -> maskDC
  prevBkColor = SetBkColor(hSrcDC, crTransparent)
  BitBlt tmpMaskDC, 0, 0, nWidth, nHeight, hSrcDC, xSrc, ySrc, vbNotSrcCopy
  SetBkColor hSrcDC, prevBkColor
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

CORBA
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 22.11.2003 (Сб) 13:41
Откуда: Ukraine-Crimea-Feodosia

Сообщение CORBA » 04.06.2005 (Сб) 12:24

После выполнения этого кода у меня получилась не маска, а инвертированое изображение. Маска - это вроде бы монохромный контур обьекта (например, чёрный на белом фоне).
У каждой сложной задачи есть множество простых для понимания, но неправильных решений.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.06.2005 (Сб) 13:34

Я тебе не законченный кусок кода указал, а суть действий.

Если ты посмотришь выше, то увидишь, что tmpMaskDC содержит монохромный битмап.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

CORBA
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 22.11.2003 (Сб) 13:41
Откуда: Ukraine-Crimea-Feodosia

Сообщение CORBA » 06.06.2005 (Пн) 16:43

Извините, если надоел уже с этими масками. Итак маску вывести у меня получилось попытался её сохранить :
Код: Выделить всё
SavePicture Picture2.Picture,"d:\2.bmp"

а она не сохраняется выдаёт ошибку 380 Invalid property value, как быть.
У каждой сложной задачи есть множество простых для понимания, но неправильных решений.

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 06.06.2005 (Пн) 17:00

Попробуй вот так:
Код: Выделить всё
SavePicture Picture2.Image, "d:\2.bmp"
Моду создают модоки, а распространяют модозвоны.

CORBA
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 179
Зарегистрирован: 22.11.2003 (Сб) 13:41
Откуда: Ukraine-Crimea-Feodosia

Сообщение CORBA » 06.06.2005 (Пн) 19:21

hCore, спасибо помогло!
У каждой сложной задачи есть множество простых для понимания, но неправильных решений.


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

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

Сейчас этот форум просматривают: Google-бот и гости: 171

    TopList