|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » VB 6.0: Быстрый вывод на экран |
|
VB 6.0: Быстрый вывод на экран
|
Новый участник Сообщения: 5 |
Профиль | Сайт | Отправить PM | Цитировать Нужно заполнить по точкам экран 1024х768 не более чем за 100 милисекунд, не используя DirectDraw.
Я уже пробовал функцию API PutPixel(), но для моих целей она очень медленная. Видел такой способ: с помощью GetObjectA извлекается BitMap(из памяти) в переменную-структуру, затем в массив копируется какие-то данные с помощью RtlMoveMemory. Теперь этот массив - массив цветов. Вот код: Private Declare Function VarPtrArray Lib "msvbvm50.dll" Alias "VarPtr" (Ptr() As Any) As Long Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long) Private Declare Function GetObjectAPI Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long Sub PictArrayInit2D(xPicture As Image, filepath As String, sa As SAFEARRAY2D, bmp As BITMAP, data() As Byte) *' *' Load picture into image box *' *If filepath <> "" Then * *' * *xPicture.Picture = LoadPicture(filepath) * *' *End If *' *' Get bitmap info from image box *' *GetObjectAPI xPicture.Picture, Len(bmp), bmp 'dest *' *' Exit if not a supported bitmap *' *If bmp.bmPlanes <> 1 Or bmp.bmBitsPixel <> 8 Then * *MsgBox " 8-Bit Bitmaps Only!", vbCritical * *Exit Sub *End If *' *' Have the local matrix point to bitmap pixels *' *With sa * *.cbElements = 1 * *.cDims = 2 * *.Bounds(0).lLbound = 0 * *.Bounds(0).cElements = bmp.bmHeight * *.Bounds(1).lLbound = 0 * *.Bounds(1).cElements = bmp.bmWidthBytes * *.pvData = bmp.bmBits *End With *' *' Copy bitmap data into byte array *' *CopyMemory ByVal VarPtrArray(data), VarPtr(sa), 4 *' End Sub Вопрос, как это переориентировать на 16 и 32х битные битмэпы, *вот эта процедура только для 8-и битных. А для остальных действительно не работает(если выкинуть "Exit Sub" |
|
------- Отправлено: 20:25, 12-11-2003 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Если задача ручками попиксельно заполнить картинку - без кэширования тебе не жить. PutPixel работает очень медленно. PutPixelV гораздо быстрее. Ещё быстрее создать битмап нужных параметров, заполнить его биты как массив и отправить на экран SetDIBitsToDevice. Если ты расчитываешь использовать картинку несколько раз, быстрее создать CompatibleDC, отправить биты в него, а затем использовать BitBlt. Картинка, которая будет лежать в CompatibleDC гарантированно совпадёт по параметрам (цвета, кодировка) с экраном, поэтому Винда при возможности попытается использовать аппаратное ускорение. Не забывай полностью заполнить структуры, иначе винда забрыкается.
|
Отправлено: 15:51, 04-12-2003 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] вывод текста на экран | antoniospb | Скриптовые языки администрирования Windows | 6 | 23-04-2010 13:40 | |
CMD/BAT - [решено] вывод текстового файла на экран cmd | idsp | Скриптовые языки администрирования Windows | 6 | 06-04-2009 07:18 | |
[решено] Быстрый ли "быстрый запуск"? | truvo | Хочу все знать | 7 | 30-04-2008 04:49 | |
Assm - assembler вывод содержимого регистра на экран | Guest | Программирование и базы данных | 1 | 16-07-2004 16:32 | |
JavaScript вывод на экран | KHEXT | Вебмастеру | 1 | 26-01-2004 23:31 |
|