и Еще раз про BITBLT

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
BOO
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 126
Зарегистрирован: 06.09.2003 (Сб) 14:23
Откуда: Саратовская обл. г.Энгельс

и Еще раз про BITBLT

Сообщение BOO » 11.01.2004 (Вс) 1:46

Ну немогу я научиться непереносить точки определенного цвета! :oops:
Мне тут написали что видете ли "надо использовать XOR Mask" ,а куда ее тыкать??? :evil: [/b]
Слушайте рок!

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

Сообщение Oxygen » 11.01.2004 (Вс) 12:08

Вот, статья из справочника, тут вроде все понятно.

Функция BitBlt
Declare Function BitBlt Lib "gdi32.dll" (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 dwRop As Long) As Long

Платформа

Windows 95/98: Поддерживается.
Windows NT: Требуется Windows NT 3.1 или выше.
Windows 2000: Поддерживается.
Windows CE: Требуется Windows CE 1.0 или выше.

BitBlt используется для выполнения операции копирования отдельных битов из области источника

изображения в область-получатель.Функция позволяет передавать прямоугольную область из

контекста устройства в контекст другого устройства. Размеры переданного прямоугольника

совершенно сохраняются.

Возвращаемое значение
В случае ошибки функция возвращает 0 (Windows NT, 2000: используйте GetLastError для

получения кода ошибки). В успешном случае функция возвращает значение отличное от нуля.
Параметры


hdcDest
Дескриптор контекста устройства устройства, которое получает переданный блок изображения.
nXDest
Координата x точки верхнего левого угла блока изображения(получатель).
nYDest
Координата y точки верхнего левого угла блока изображения(получатель).
nWidth
Ширина в пикселах блока изображения.
nHeight
Высота в пикселах блока изображения.
hdcSrc
Дескриптор к контексту устройства устройства, которое содержит блок изображения для

копирования.
nXSrc
Координата x точки верхнего левого угла блока изображения(источник).
nYSrc
Координата y точки верхнего левого угла блока изображения(источник).
dwRop
Один из следующих флажков, идентифицирующих растровую операцию для передачи блока

изображения. Каждая растровая операция использует RGB-значение цвета исходного исходного

пиксела, чтобы определить новый цвет пиксела.
BLACKNESS
Заполняет область-получатель черным цветом.
CAPTUREBLT
Windows 98, 2000: Include any windows layered on top of the window being used in the

resulting image.
DSTINVERT
Инвертирует область-получатель.
MERGECOPY
Изображение определяется результатом выполнения операции побитового AND над копируемым

изображением или шаблоном.
MERGEPAINT
Изображение определяется результатом выполнения операции побитового OR над инвертируемым

копируемым и областью-получателем.
NOMIRRORBITMAP
Windows 98, 2000: Предотвращает точечный рисунок от зеркального отражения.
NOTSRCCOPY
Изображение определяется инвертируемым исходным изображением.
NOTSRCERASE
Комбинирование цвета и прямоугольников источника и получателя, использующих поразрядный

оператор OR с последующим инвертированием результирующего цвета.
PATCOPY
Шаблон копируется в область получатель.
PATINVERT
Комбинирование цвета указанного шаблона с цветами прямоугольника адресата, используя

поразрядный оператор XOR.
PATPAINT
Комбинирование цвета указанного образца с цветами перевернутого исходного прямоугольника,

используя поразрядный оператор OR. Комбинируйте результат той операции с цветами

прямоугольника адресата, используя поразрядный оператор OR.
SRCAND
Комбинирование цвета и прямоугольников источника иадресата, использующих поразрядный

оператор AND.
SRCCOPY
Копирование исходного прямоугольника непосредственно в прямоугольник адресата без изменений.
SRCERASE
Комбинирование перевернутых цветов прямоугольника адресата с цветами источника , используя

поразрядный оператор AND.
SRCINVERT
Комбинирование цвета и прямоугольников источника и адресата, использующих поразрядный

оператор XOR.
SRCPAINT
Комбинирование цвета и прямоугольников источника и адресата, использующих поразрядный

оператор OR.
WHITENESS
Заполняет область-получатель белым цветом.

Константы

Const BLACKNESS = &H42
' Const CAPTUREBLT = ???
Const DSTINVERT = &H550009
Const MERGECOPY = &HC000CA
Const MERGEPAINT = &HBB0226
' Const NOMIRRORBITMAP = ???
Const NOTSRCCOPY = &H330008
Const NOTSRCERASE = &H1100A6
Const PATCOPY = &HF00021
Const PATINVERT = &H5A0049
Const PATPAINT = &HFB0A09
Const SRCAND = &H8800C6
Const SRCCOPY = &HCC0020
Const SRCERASE = &H440328
Const SRCINVERT = &H660046
Const SRCPAINT = &HEE0086
Const WHITENESS = &HFF0062

Пример

' Копируем изображение прямоугольника из формы Form1 в форму Form2
' используя SRCCOPY. Прямоугольник имеет ширину 100 и высоту
' 50. Верхний левый угол источника- (350, 250); копия расположится в координатах
' (0,0) формы Form2.
Dim retval As Long ' возвращаемое значение

' Переместим изображение точно как описано выше.
retval = BitBlt(Form2.hDC, 0, 0, 100, 50, Form1.hDC, 350, 250, SRCCOPY

Kostyan
Постоялец
Постоялец
 
Сообщения: 439
Зарегистрирован: 20.09.2002 (Пт) 4:14
Откуда: Россия, Уссурийск

Сообщение Kostyan » 11.01.2004 (Вс) 12:14

Попробуй использовать TransparentBlt.
Тоже самое что и BitBlt, тотлько последним параметром указываешь цвет, который не нужно копировать.

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 11.01.2004 (Вс) 13:14

Kostyan писал(а):Попробуй использовать TransparentBlt.
Тоже самое что и BitBlt, тотлько последним параметром указываешь цвет, который не нужно копировать.

Я бы не советовал использовать её... Очень тормазнутая функция. :wink: Вроде oxygen всё написала...
Последний раз редактировалось Vovik 11.01.2004 (Вс) 16:57, всего редактировалось 1 раз.

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

Сообщение Oxygen » 11.01.2004 (Вс) 13:53

Vovik писал(а): Вроде oxygen всё написал...


НаписаЛА. Извиняюсь, что поправляю, но я женского рода. :D

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

Сообщение A.A.Z. » 11.01.2004 (Вс) 17:15

2 Oxygen:
Не подскажешь, где справочник на русском взяла? :roll:
Нет меня больше

Kostyan
Постоялец
Постоялец
 
Сообщения: 439
Зарегистрирован: 20.09.2002 (Пт) 4:14
Откуда: Россия, Уссурийск

Сообщение Kostyan » 11.01.2004 (Вс) 17:42

Vovik писал(а): Я бы не советовал использовать её... Очень тормазнутая функция. :wink: Вроде oxygen всё написала...


Давай разберем алгоритм переноса киртинки с одного DC на другой с прозрачным цветом:
1) Копируем начальное изображение в буферный DC, содержащий маску с нужным цветом, с использованием какой-то логич. операции (щас не вспомню какой).
2) Полученное изображение из буфера копируем на конечный DC.

Получаем 2 использования BitBlt, да ещё и промежуточный буфер.
Так что же быстрее в данном случае, TransparentBlt или BitBlt?

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 11.01.2004 (Вс) 20:11

Я говорил не для данного случая, а вообще...самая быстрая ф-ция из рода Blt - есть BitBlt, по затрачиваемому времени на выполнение... :roll:
Кстати, ты же не знаешь, как работает этот TransparentBlt. А в него напихали функций в 2 раза больше, чем если ты будешь использовать выше сказанное...там не только промежуточный буфер...кучи всего...поэтому BitBlt - быстрее всего выполняет побитовый перенос.

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

Сообщение Oxygen » 11.01.2004 (Вс) 22:01

A.A.Z. писал(а):2 Oxygen:
Не подскажешь, где справочник на русском взяла? :roll:


Да, даже не помню. Помнится, мне кто-то на форуме кидал его. Вот, лови.
Вложения
___ХЕЛП ПО API НА РУССКОМ___.rar
Хелп по API
(232.52 Кб) Скачиваний: 102

Kostyan
Постоялец
Постоялец
 
Сообщения: 439
Зарегистрирован: 20.09.2002 (Пт) 4:14
Откуда: Россия, Уссурийск

Сообщение Kostyan » 12.01.2004 (Пн) 2:35

Vovik писал(а):Кстати, ты же не знаешь, как работает этот TransparentBlt. А в него напихали функций в 2 раза больше, чем если ты будешь использовать выше сказанное...там не только промежуточный буфер...кучи всего...

Ты распологаешь исходником этой функции? 8)
И вообще, это ещё нужно проверить, что бычтрее.

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

Сообщение Oxygen » 12.01.2004 (Пн) 6:54

Всю эту чушь можно еще и через DX реализовать, работает быстрее, только надо ли это? Ты вообще, что конкретно делаешь, т.е. зачем тебе прозрачность-то нужна? Есть еще один извращенный способ, но на практике (сама проверяла) работает гораздо быстрее, чем BitBlt. Создаешь User Control. Натягиваеешь на него какой надо рисунок, ставишь маску рисунка - такой же рисунок, тока одним цветом то, что надо отображать. Указываешь маску цвета, а в свойствах ставишь прозрачность. Очень извращенно, но просто и быстро..... :D

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 12.01.2004 (Пн) 9:42

Ты распологаешь исходником этой функции? 8)
И вообще, это ещё нужно проверить, что быстрее.

Поверь мне...было дело...я проверял и специально искал подробное описание всех функций... :wink:
Последний раз редактировалось Vovik 12.01.2004 (Пн) 12:57, всего редактировалось 1 раз.

Kostyan
Постоялец
Постоялец
 
Сообщения: 439
Зарегистрирован: 20.09.2002 (Пт) 4:14
Откуда: Россия, Уссурийск

Сообщение Kostyan » 12.01.2004 (Пн) 10:13

2 Vovik: Не мог бы поподробнее описать работу TransparentBlt, мне уже интересно что-же она делает такого тормазного...

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 12.01.2004 (Пн) 13:00

Kostyan писал(а):2 Vovik: Не мог бы поподробнее описать работу TransparentBlt, мне уже интересно что-же она делает такого тормазного...

Честное слов, это было давно и неправда... Я делал прогу, выполнял перенос с помощью этих двух ф-циий (по очереди) ... GetTickCount - замерял время выполнения и вычислял разницу...Она была видна не вооружённым глазом.. :wink:
А по описанию я посмотрел - уже нет... искал на англоязычных сайтах и переводил... 8)

Kostyan
Постоялец
Постоялец
 
Сообщения: 439
Зарегистрирован: 20.09.2002 (Пт) 4:14
Откуда: Россия, Уссурийск

Сообщение Kostyan » 12.01.2004 (Пн) 13:26

Ну в том что BitBlt быстрее любой другой Blt - это неопровержимо. Я имел ввиду что в данном случае всё-таки будет более оправдано использование TransparentBlt. Именно для этой задачи.


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

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

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

    TopList  
cron