Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ассоциировать HDC со своей областью памяти


Страницы:   1 2

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.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо