Глюки с BitBlt

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Глюки с BitBlt

Сообщение Oxygen » 18.07.2003 (Пт) 23:49

Привет всем. Проблема такая - есть текст есть прога и есть в ней глюк. Пол-бессонной ночи в попытках его найти ни к чему не привели. Может кто поможет? При использовании API-функции BitBlt почему-то за место нормального перемещения шарика по PictureBox'у откуда-то берется черный квадрат.
Код: Выделить всё
'Picture1 - PictureBox с основным рисунком
'Picture2 - PictureBox с шариком на белом фоне
'Picture3 - PictureBox c маской
'Picture4 - PictureBox, в который копируется фон
'везде свойство autoredraw=true, измерение стоит в пикселах.
Public x, y As Integer


Private Sub Form_Load()
' установка начальных координат
x = 10
y = 10
' копирование фона который будет скрыт шариком
Call BitBlt(Picture4.hDC, 0, 0, 50, 50, Picture1.hDC, x, y, vbSrcCopy)
Picture4.Refresh
' включение таймера
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
' копирование фона, скрытого шариком на основную картинку
Call BitBlt(Picture1.hDC, x, y, 50, 50, Picture4.hDC, 0, 0, vbScrCopy)
Picture1.Refresh
' сдвижение шарика
x = x + 1
y = y + 1
' копирование фона который будет скрыт шариком
Call BitBlt(Picture4.hDC, 0, 0, 50, 50, Picture1.hDC, x, y, vbSrcCopy)
Picture4.Refresh
' копирование маски и шарика на основную картинку
Call BitBlt(Picture1.hDC, x, y, 50, 50, Picture3.hDC, 0, 0, vbMergePaint)
Call BitBlt(Picture1.hDC, x, y, 50, 50, Picture2.hDC, 0, 0, vbSrcAnd)
Picture1.Refresh
End Sub

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

Сообщение GSerg » 19.07.2003 (Сб) 6:37

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

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 19.07.2003 (Сб) 8:45

Спасибо за сылку - посмотрела я этот пример. Он у меня глючит так же как и моя прога - заместо прозрачности я получаю черный квадрат с изображением. Может дело не в моей проге а в самой функции? Или в Windows - VB5, Windows2000Pro. Люди, подскажите что можно сделать. В архиве сам глюк, вернее его рисунок.

Tauron
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 187
Зарегистрирован: 14.07.2002 (Вс) 17:43
Откуда: Kazakhstan

Сообщение Tauron » 19.07.2003 (Сб) 13:54

Вместо Form_Load сделай Initialize или еще лучше Click. Во время загрузки у тебя может быть в PictureBox нифига нет.
Трезвая голова, холодный ум и ледяное сердце.

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

Сообщение GSerg » 20.07.2003 (Вс) 4:14

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

GoGosha
Постоялец
Постоялец
 
Сообщения: 642
Зарегистрирован: 02.08.2002 (Пт) 9:14
Откуда: Russia

Сообщение GoGosha » 20.07.2003 (Вс) 9:28

А вот мой вариант этой длл(только он чисто тестовый и использует картинки с моего диска)

SHAN
Обычный пользователь
Обычный пользователь
 
Сообщения: 70
Зарегистрирован: 07.09.2002 (Сб) 22:26
Откуда: Киберляндия

Сообщение SHAN » 20.07.2003 (Вс) 12:05

По поему опыту, первое изображение должно быть с черным фоном и рисоватться с помощью vbSrcPaint, а второе изображение - с белым фоном и рисуется с помощью vbSrcAnd. Я так всегда делал - всегда работало (и работает 8) ).
$HAN

GoGosha
Постоялец
Постоялец
 
Сообщения: 642
Зарегистрирован: 02.08.2002 (Пт) 9:14
Откуда: Russia

Сообщение GoGosha » 20.07.2003 (Вс) 12:45

У моей библы, да и у Alpha24 куча преимуществ перед BitBlt
Во первых чтоб рисовать необязательно помещать картинку в пикчебокс. Во-вторых там моно рисовать куда угодно, даже в переменную типа IPictureDisp в-третьих маска осуществляется простым вызовом функции с заданием прозрачного цвета(требуется одна картинка, а в BitBlt-две: маска и картинка, а следовательно два пикчабокса) и в третьих замечательная функция Alpha позволяющая зделать прозрачную картинку
http://poetry.mooo.com
http://poetry.myboard.info
«Человек есть нечто, что до́лжно превзойти» (Ф. Ницше)

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 24.07.2003 (Чт) 8:23

А никто не подскажет, что быстрее работает при анимации (перемещении)? Если объектов много BitBlt немного тормозит.


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

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

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

    TopList  
cron