![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ассоциировать HDC со своей областью памяти
DevilDevil © (2008-04-12 06:27:00)Наверняка как то можно...
Вот мой и вопрос и состоит в "как это сделать?"
Допустим есть кусок памяти, который я хочу особым образом заподнить, как Битмап.
Заранее спасибо.
DevilDevil (2008-04-21 19:06:00) [1]> Eraser © (21.04.08 18:37) [25]
что с того ?
slow!alfamoon!com (2008-04-21 19:04:00) [2]Читай уже Фень Юаня, не ленись. Там все написано. Мне лично такая задача просто еще не попадалась.
Eraser (2008-04-21 18:37:00) [3]TBitmap тоже с исходниками.
DevilDevil (2008-04-21 17:25:00) [4]сдаётся мне, SetDIBits/ToDevice - не то что нужно :(
или я ошибаюсь ?
)) треба мастеров WinAPI
slow!alfamoon!com (2008-04-21 17:22:00) [5]тогда разбирайся с SetDIBits..
DevilDevil (2008-04-21 17:10:00) [6]> Eraser © (21.04.08 17:05) [20]
sorry ?
DevilDevil (2008-04-21 17:08:00) [7]> slow!alfamoon!com (21.04.08 13:33) [19]
неа, не прокатит.
В CreateCompatibleBitmap нужен DC с определённым (нужном мне) форматом пиксела. А в CreateCOmpatibleDC(GetDC(0),...) скорее всего будет 32бита.
Кроме того задача состоит в ассоциировании DC с имеющейся областью памяти. А так можно и TBitmap простой создавать, да копировать туда залоченные данные.
Eraser (2008-04-21 17:05:00) [8]VCL с исходниками идет.
slow!alfamoon!com (2008-04-21 13:33:00) [9]может так?
1.создать совместимый дс
CreateCOmpatibleDC(GetDC(0),...)
2.Создать совместимый битмап
CreateCompatibleBitmap
3.заполнить биты
4.SelectObject
DevilDevil (2008-04-18 18:49:00) [10]> Кстати, если вопрос ставится как "DC любой ценой"
хех))) это не вариант.
можно, конечно, протейсить Surface.GetDC ... Но я не думаю, что это даст хороший результат...
КАК АССОЦИИРОВАТЬ КАКВАС С МОЕЙ ОБЛАСТЬЮ ПАМЯТИ ???
Sapersky (2008-04-18 18:42:00) [11]The CreateDIBitmap function creates a device-dependent bitmap (DDB) from a device-independent bitmap (DIB) and, optionally, sets the bitmap bits.
DDB это, грубо говоря, поверхность в видеопамяти (у NT-систем, у 9x скорее тот же DIB). Т.е. явно отдельный битмап, с опциональным "тупым копированием" в него данных.
если в качестве Height указать отрицательное число, то данные будут располагаться сверху вниз, а не снизу вверх...
Да, что-то такое слышал. Вроде бы это и к DIB относится.
Кстати, если вопрос ставится как "DC любой ценой", то можно, наоборот, сначала создать DIB с DC, потом на его основе поверхность (см. client memory surfaces). Правда, никакого аппаратного ускорения с такой поверхностью не получишь, и зачем в этом случае вообще DX - непонятно, но зато DC у поверхности будет :)
DevilDevil (2008-04-18 17:22:00) [12]> Sapersky (18.04.08 16:54) [15]
ага... скачал, щас читать буду...
Слушайте, а CreateDIBitmap мне не подойдёт ???
HBITMAP CreateDIBitmap(
HDC hdc, // handle to device context
CONST BITMAPINFOHEADER *lpbmih, // pointer to bitmap size and format data
DWORD fdwInit, // initialization flag
CONST VOID *lpbInit, // pointer to initialization data
CONST BITMAPINFO *lpbmi, // pointer to bitmap color-format data
UINT fuUsage // color-data usage
);
Во-первых, насколько я понял, тут создаётся битмап по имеющимся данным (или эта память тупо копируется? ). Во-вторых, здесь пишут, что если в качестве Height указать отрицательное число, то данные будут располагаться сверху вниз, а не снизу вверх...
the function uses the BITMAPINFOHEADER structure to obtain the desired width and height of the bitmap as well as other information. Note that a positive value for the height indicates a bottom-up DIB while a negative value for the height indicates a top-down DIB. This scenario is compatible with the CreateDIBitmap function.
Sapersky (2008-04-18 16:54:00) [13]ИМХО, не забивать голову утопическими идеями и использовать обычные GetDC/Lock :)
А лучше только Lock, т.к. GetDC по моему опыту срабатывает не всегда (вроде бы с мип-уровнем текстуры на Radeon X700 были проблемы).
Если очень хочется - почитай Фень Юаня, там как раз "потроха" GDI/DDraw разобраны. Может, что-то полезное найдёшь или железно убедишься что "низзя":
http://irazin.ru/Downloads/Books/Yuan.rar
DevilDevil (2008-04-18 14:59:00) [14]если глобально мыслить, DC - это штука универсальная, хочешь - на принтер её навесь, хочешь - на битмап, хочешь - на любое др. Стало быть, нет ничего невозможного.
ЧТО МНЕ ДЕЛАТЬ ???
DevilDevil (2008-04-18 14:51:00) [15]> miek (18.04.08 14:38) [12]
как то должно быть можно!!!
miek (2008-04-18 14:38:00) [16]ты чего хочешь добиться? сам выделить кусок памяти и на нем создать DC? это невозможно. сначала создаешь dibsection, система сама резервирует память и потом можешь ее использовать.
DevilDevil (2008-04-18 02:08:00) [17]> stab (18.04.08 01:45) [10]
спасибо, что пришёл на помощь!
> CreateDIBSection
О_о? Если мне не изменяет память, CreateDIBSection сам резервирует память, а не использует заданную тобой
stab (2008-04-18 01:45:00) [18]Вкратце, dc := CreateCompatibleDC(0), dib := CreateDIBSection(.. твой кусок памяти ..), SelectObject(dc, dib). Теперь рисование через dc будет модифицировать память.
DevilDevil (2008-04-17 17:49:00) [19]> Sapersky (17.04.08 17:31) [8]
привет )
> Не факт, неизвестно, что там ещё используется кроме Lock
ну фиг знает, по описанию в хелпе вроде возможно.
единственная загвоздка - "свап строк"... но тоже наверно как то можно.
> Всё-таки не очень понятно зачем. Что такого может этот канвас,
> чего нельзя было бы сделать через Scanline?
понимаешь... Канвас - достаточно удобная универсальная штука. Совсем не плохо было бы временно редактировать текстуру (поверхность) как Битмап!!! Захотел - заюзал его как Канвас, захотел - прямой доступ через ScanLines --- красота!!! :)
Да, отдельное создание битмапа это выход... но зачем использовать такой подход, когда возможен "стандартный", более быстрый ?
P.S. помогите с параметрами SetDIBitsToDevice
Sapersky (2008-04-17 17:31:00) [20]хочу объединить методы Lock и GetDC у поверхности.
в хелпе написано, что GetDC на самом деле использует Lock, стало быть, моя задумка осуществима.
Не факт, неизвестно, что там ещё используется кроме Lock. Возможно, какие-то доступные только на уровне драйвера функции/данные.
вообще говоря, именно Канвас и хочется получить...
Всё-таки не очень понятно зачем. Что такого может этот канвас, чего нельзя было бы сделать через Scanline? В крайнем случае, всегда можно нарисовать в отдельном битмапе и скопировать в поверхность.
К тому же само по себе интенсивное использование Lock/GetDC в рендере - идеологически неправильно, основная фишка DX - макс. использование аппаратного ускорения, а этот "прямой доступ" в большинстве случаев тормозит всё до уровня GDI.