BitBlt для новичка

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

BitBlt для новичка

Сообщение Winitar » 15.05.2007 (Вт) 19:05

Я совсем недавно занимаюсь программированием и много слышал о BitBlt, но так и не научился этим пользоваться! Я пробавал изучать пример с использованием этой функции, но так и не врубился... Короче хочу попросить рассказать о ней с самого начала и поподробней :arrow:

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 15.05.2007 (Вт) 19:30

Посмотри мой справочник по API из 'народной литературы'. Там по-русски, более-менее понятно.
Salus populi suprema lex

AxelF
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 10.05.2007 (Чт) 15:48
Откуда: Н.Новгород

Сообщение AxelF » 16.05.2007 (Ср) 9:02

Сходи сюда: www.vbstreets.ru/VB/Articles/65569.aspx
Довольно доходчиво написано.

AD'onis
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 50
Зарегистрирован: 05.10.2006 (Чт) 20:19
Откуда: не секрет, я б сказал, но забаннят

Сообщение AD'onis » 22.08.2007 (Ср) 19:46

В этой статье www.vbstreets.ru/VB/Articles/65569.aspx опечатка, судя по всему. Прошу помощи у более продвинутых людей, VB ругается на функцию, создающую DC:

Function CreateMemHdc(ScreenHdc As Long, Width As Integer, Height As Integer) As Long

ReDim Preserve MemHdc(NumOfDcs)
ReDim Preserve BitMapHdc(NumOfDcs)
ReDim Preserve TrashbmpHdc(NumOfDcs)

MemHdc(NumOfDcs) = CreateCompatibleDC(ScreenHdc)
If MemHdc(NumOfDcs) Then
BitMapHdc(NumOfDcs) = CreateCompatibleBitmap(ScreenHdc, Width, Height)
If BitMapHdc(NumOfDcs) Then
TrashbmpHdc(NumOfDcs) = SelectObject(MemHdc(NumOfDcs), BitMapHdc(NumOfDcs))
CreateMemHdc (NumOfDcs)
End If
End If
NumOfDcs = NumOfDcs + 1
End Function

а конкретно на строку CreateMemHdc (NumOfDcs), пишет Argument not optional. Его я тоже его понимаю - кол-во аргументов не совпадает, но ЧТО ДЕЛАТЬ:?:

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

Сообщение tyomitch » 22.08.2007 (Ср) 19:51

Я полагаю, эту строчку нужно заменить на CreateMemHdc = MemHdc(NumOfDcs)
Изображение

AD'onis
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 50
Зарегистрирован: 05.10.2006 (Чт) 20:19
Откуда: не секрет, я б сказал, но забаннят

Сообщение AD'onis » 22.08.2007 (Ср) 19:54

Пробовал уже. Тоже не катит: пишет Expceted Procedure, not variable

AD'onis
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 50
Зарегистрирован: 05.10.2006 (Чт) 20:19
Откуда: не секрет, я б сказал, но забаннят

Сообщение AD'onis » 22.08.2007 (Ср) 19:56

Айм сорри, все норм, просто неправильно воспринял твою мессагу, спасибо tyomitch :D

AD'onis
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 50
Зарегистрирован: 05.10.2006 (Чт) 20:19
Откуда: не секрет, я б сказал, но забаннят

Сообщение AD'onis » 27.08.2007 (Пн) 14:22

Еще вопрос, если можно, по этому примеру, считываю еще одну картинку, просто добавив код, который считывает имена картинок по строкам из текстового файла. Т.е. прогружается фон, затем одна картинка с маской, после этого еще раз запускается весь код, но исчезает первая картинка. Логически я понимаю, что заново происходит загрузка фона. Но я не могу сохранить DC. Просто не понимаю, почему var1.hdc=var2.hdc не работает. Вопрос, как сохранить контекст устройства?

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

Сообщение tyomitch » 27.08.2007 (Пн) 16:04

вообще-то есть такая функция, SaveDC
Изображение

AD'onis
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 50
Зарегистрирован: 05.10.2006 (Чт) 20:19
Откуда: не секрет, я б сказал, но забаннят

Сообщение AD'onis » 27.08.2007 (Пн) 19:25

Да, спасибо, уже разобрался, только немного по-другому. Не знаю, что обозначает, но если присваивать DC равное 0, то при использовании переменной будет взят последний использованный DC.

AD'onis
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 50
Зарегистрирован: 05.10.2006 (Чт) 20:19
Откуда: не секрет, я б сказал, но забаннят

Сообщение AD'onis » 04.09.2007 (Вт) 0:12

Ну вот, я снова вернулся в эту тему.
Да, и снова у меня возникла бестолковая проблема. В общих чертах:
Считываются картинки из соотв. файлов (т.е. в моем случае - *.bmp), затем они в некоторой описанной последовательности накладываются друг на друга. Т.е.:
Загрузка n-штук картинок
Выкладывание их в PictureBox
Ожидание действия пользователя
Снова загрузка уже других картинок и/или части предыдущих
Выкладывание их в PictureBox
и т.д.
В конце концов все просто перестает работать. Пытаюсь отследить где все теряется уже 2-е сутки. Тишина. Просто вижу, что DC картинки становится равным нулю, хотя я его нигде на ноль не сбрасываю. Что это может быть? В VB (или системе) есть какое-то ограничение? Я забиваю память? Или что-то другое?
З.Ы. Картинки загружаются в массив. Т.е. есть один hDC, в него загружается картинка, а в другом уже есть какие-то картинки, в него она и кладется. Следующая опять загружается в этот hDC, а потом выкладывается в общий.
Прошу совета у гуру :oops:

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

Сообщение tyomitch » 04.09.2007 (Вт) 10:25

Да, есть ограничение на количество DC в процессе.
Если запускаешься из-под IDE, то после достижения предела IDE тоже развалится. Разваливается?
Изображение

AD'onis
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 50
Зарегистрирован: 05.10.2006 (Чт) 20:19
Откуда: не секрет, я б сказал, но забаннят

Сообщение AD'onis » 04.09.2007 (Вт) 11:35

Здравствуй, tyomitch, спасибо за ответ
честно говоря, не понимаю, что такое IDE. Если можно, то поподробней (или ссылку), что это такое, как мне проверить, валится IDE или нет?

ADDED:
Да, и как можно обойти этот момент, чтобы у меня все не падало?

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

Сообщение tyomitch » 04.09.2007 (Вт) 11:52

IDE -- это среда, в которой ты пишешь свою прогу.
Если она разваливается, это видно очень хорошо, невооружённым глазом.
Видимо, не разваливается, раз ты спрашиваешь.
В этом случае то ограничение не при чём, а просто в программе какой-то косяк.
Изображение

AD'onis
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 50
Зарегистрирован: 05.10.2006 (Чт) 20:19
Откуда: не секрет, я б сказал, но забаннят

Сообщение AD'onis » 04.09.2007 (Вт) 11:55

Ясно, спасибо, но косяк найти не могу. А как можно узнать ограничение по кол-ву DC? Уже заинтересовало просто. Насколько много их может быть?

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

Сообщение tyomitch » 04.09.2007 (Вт) 12:27

Мне удалось создать 9700.

В демонстрационных целях: запусти этот код и посмотри, что станет с IDE.

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

Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hDC As Long) As Long

Sub Main()
Dim Count As Long
While CreateCompatibleDC(0)
    Count = Count + 1
Wend
Debug.Print Count
End Sub
Изображение

AD'onis
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 50
Зарегистрирован: 05.10.2006 (Чт) 20:19
Откуда: не секрет, я б сказал, но забаннят

Сообщение AD'onis » 04.09.2007 (Вт) 12:34

Ясненько, такого эффекта я уже добивался в самом начале :). У меня 9690 DC было создано, затем все повисло. Только в моей проге такого нет. Там просто DC сбрасывается на ноль, а где - отследить не могу - код слишком здоровый получился. Не знаю, может будет проще переписать все с нуля...

Sneaks
Обычный пользователь
Обычный пользователь
 
Сообщения: 67
Зарегистрирован: 29.07.2006 (Сб) 12:08

Re: BitBlt для новичка

Сообщение Sneaks » 21.09.2011 (Ср) 15:21

не хочется создавать новые темы по пустякам, займусь некромантией.
Вот прочел статью, все сделал, все работает, спс огромное. Решил потестить на скорость, при 250-300 спрайтов уже чувствуется что притормаживает. Отсюда вопрос, на сколько этот метод эффективный и есть ли другие, более быстрые способы вывода графики с маской на вб6.
ЗЫ интерисует именно 2д. Про вариант отрисовки 2д через д3д знаком.

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

Re: BitBlt для новичка

Сообщение Хакер » 21.09.2011 (Ср) 15:24

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

Некрофилией, а не некромантией.

Sneaks писал(а):Решил потестить на скорость, при 250-300 спрайтов уже чувствуется что притормаживает

Уверен, что тормозит именно BitBlt, а не твой код вокруг неё?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sneaks
Обычный пользователь
Обычный пользователь
 
Сообщения: 67
Зарегистрирован: 29.07.2006 (Сб) 12:08

Re: BitBlt для новичка

Сообщение Sneaks » 21.09.2011 (Ср) 20:28

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


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

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

Сейчас этот форум просматривают: Mail.ru [бот], Yandex-бот и гости: 53

    TopList