Быстрое рисование BMP'шки с прозрачностью

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Быстрое рисование BMP'шки с прозрачностью

Сообщение Q2W » 20.07.2005 (Ср) 12:30

Видел я в старых гамесах bmp'шки рисуюцца из файла, в котором есть области закрашенный спец.цвеом (обычно это был какой-то бардовый), который в самом гамесе был прозрачным.

Как сделать также?
Я знаю верный путь

SHURUP
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 440
Зарегистрирован: 15.09.2004 (Ср) 14:24
Откуда: Ирпень, Украина

Сообщение SHURUP » 20.07.2005 (Ср) 12:43

Цвет этот называется странным словом Magenta (чаще всего именно он используется)
А рисовать можно через АПИ TransparentBlt но в некоторых случаях (ЕМНИП) это очень нежелательно. А еще, ходят слухи, что этого можно добиться даже через PaintPicture или BitBlt, но там нужна маска этого изображения и несколько комбинаций параметров наложения... :roll:
Нам чужого не надо, но своё мы возьмем, чьё бы оно ни было...

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

Сообщение GSerg » 20.07.2005 (Ср) 12:48

Через TransparentBlt лучше не рисовать, ибо глючит на 9х.
http://bbs.vbstreets.ru/viewtopic.php?p=72122#72122
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 20.07.2005 (Ср) 14:45

Дык если
Через TransparentBlt лучше не рисовать, ибо глючит на 9х.

, тада чё?
И чё там со слухами что этого можно добиться даже через PaintPicture?
Я знаю верный путь

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

Сообщение GSerg » 20.07.2005 (Ср) 15:06

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

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 20.07.2005 (Ср) 15:13

Дык там как раз TransparentBLT, которым по твоим словам лучше не рисовать!
Я знаю верный путь

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

Сообщение GSerg » 20.07.2005 (Ср) 15:14

Ты разницу между системной TransparentBlt и собственной TransparentBlt понимаешь? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

SHURUP
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 440
Зарегистрирован: 15.09.2004 (Ср) 14:24
Откуда: Ирпень, Украина

Сообщение SHURUP » 20.07.2005 (Ср) 15:14

Вот сразу нашел:
http://www.rsdn.ru/article/gdi/transblt.xml
Там хоть не под Бейсик - зато детально и на русском. И разобраться в теоретических аспектах будет полезно...
Нам чужого не надо, но своё мы возьмем, чьё бы оно ни было...

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 20.07.2005 (Ср) 15:48

Аа, всё теперь дорубил. Ищё вапрос а как этим собсна пользовацца при наличии картинок и пикчербокса, в котром нада рисовать?
Я знаю верный путь

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

Сообщение GSerg » 20.07.2005 (Ср) 15:52

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

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 20.07.2005 (Ср) 16:48

Там hdc, hSrcDC, xSrc, ySrc, crTransparent, tmpMaskDC, tmpInterDC, tmpResultDC непонятно чё такое.
Я знаю верный путь

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 21.07.2005 (Чт) 11:07

hdc - это куда рисовать
hSrcDC - это я так понимаю хэндлер исходного изображения
xSrc - это смещение по х на исходном изображении, ySrc - соотвецтвенно
crTransparent - цвет, который заменяецца на прозрачный
tmpMaskDC, tmpInterDC, tmpResultDC - это непонятно что такое, но надеюсь оно мне не понадобицца.

Я прав с этими параметрами обращения к TransparentBlt?
Я знаю верный путь

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 21.07.2005 (Чт) 11:34

Ругаецца на CreateCompatibleDC, грит что нет такой функции.
Я знаю верный путь

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

Сообщение GSerg » 21.07.2005 (Чт) 11:39

Что это такое - объяснено в комментариях.
Функцию объяви сам.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение Viper » 21.07.2005 (Чт) 11:40

только на CreateCompatibleDC ругается? А ты ее объявил при помощи Declare?
Весь мир матрица, а мы в нем потоки байтов!

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 21.07.2005 (Чт) 11:46

GSerg, не вижу где объяснено. И функции CreateCompatibleDC - то нету. где взять/как объявить.

!Viper! писал(а):только на CreateCompatibleDC ругается? А ты ее объявил при помощи Declare?

Успевает ругацца тока на неё. Вылетает с ошибкой.
Дык функции-то нету, чё её объявлять-то?

Я чёта сёдня ваще ничё не понимаю :)
Я знаю верный путь

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

Сообщение GSerg » 21.07.2005 (Чт) 11:50

Объясняется:
'Если предполагаются интенсивные вызовы, то неэффективно каждый раз
'создавать и удалять DC. Поэтому можно создать их один раз в
'вызывающем модуле, а сюда передавать через параметры. Тогда здесь ничего
'не будет создаваться/удаляться.
'Ответственность за наличие битмапов нужных типов в этих DC несёт вызывающий.


Объявление: http://bbs.vbstreets.ru/viewtopic.php?t=11721
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 21.07.2005 (Чт) 12:04

Дык там объясняются не параметры функции (о чём я как раз спрашивал)
Чёта не могу найти объявление SetBkColor
Я знаю верный путь

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

Сообщение GSerg » 21.07.2005 (Чт) 12:07

Объяснение параметров смотри в BibBlt.
Объявление - скачай apiviewer, а не только apiguide.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 21.07.2005 (Чт) 13:27

Код: Выделить всё
TransparentBlt picMain.hdc, x, y, 96, 96, imgG.hdc, 0, 0, &H808080
'Типа рисуем на picMain по координатам x,y размером 96*96 из imgG, со смещением на исходнике 0*0 и прозрачным цветом &H808080


Рисует картинку первый раз как-то странно. Как будто картинка смещена что-ли.

Во второй раз картинку вообще не рисует.
Я знаю верный путь

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

Сообщение GSerg » 21.07.2005 (Чт) 13:54

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

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 21.07.2005 (Чт) 14:33

Хм, может, AutoRedraw / ScaleMode криво выставлены? :roll:
Нет меня больше

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 21.07.2005 (Чт) 14:39

A.A.Z. писал(а):Хм, может, AutoRedraw / ScaleMode криво выставлены? :roll:

В исходной картинке autoresraw выключен, в той, на которую рисую - включён.
Scalemode везде pixel
Я знаю верный путь

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

Сообщение GSerg » 21.07.2005 (Чт) 14:48

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

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 21.07.2005 (Чт) 14:53

GSerg писал(а):А зачем он включен?..

Да я уж не помню. Тока выключение не помогает. Даже наоборот ничё не рисуецца с выключенным autoRedraw'ом.
Я знаю верный путь

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

Сообщение GSerg » 21.07.2005 (Чт) 14:56

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

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 21.07.2005 (Чт) 15:01

GSerg писал(а):А потом refresh делаешь?..

Не помогает.

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

Вот исходник:
Код: Выделить всё

Public Sub redrawScreen()
    If redrawing Then Exit Sub
    redrawing = True
    picMain.Enabled = False
    picMain.Line (0, 0)-(picMain.width, picMain.height), RGB(128, 128, 128), BF
    For q = 0 To 17
        If showMode > 0 Then
            TransparentBlt picMain.hdc, x, y, 96, 96, frmRes.imgG.hdc, 0, 0, &H808080
        End If
    Next q
    picMain.Enabled = True
    redrawing = False
    DoEvents
End Sub
Я знаю верный путь


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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 66

    TopList