Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.04.26;
Скачать: CL | DM;

Вниз

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

 
DevilDevil   (2008-04-12 06:27) [0]

Наверняка как то можно...
Вот мой и вопрос и состоит в "как это сделать?"

Допустим есть кусок памяти, который я хочу особым образом заподнить, как Битмап.

Заранее спасибо.


 
slow!alfamoon!com   (2008-04-12 11:42) [1]

А в чем собственно проблема? Формируйте битмап в памяти и SetDIBitsToDevice или StretchDIBitsToDevice в требуемый HDC


 
DevilDevil ©   (2008-04-16 15:45) [2]

> slow!alfamoon!com   (12.04.08 11:42) [1]

спасибо.

Тут куча параметров. Непонимаю. Помогите разобраться.

Первый параметр - DC. Т.е. я его сначала должен создать... Как создать DC, который будет использоваться для "изменения моей памяти" О_о?

Смысл следуюшие 6 параметров неясен: XDest, YDest, dwWidth, Height, XSrc, YSrc. Ну... Wisth и Height - стало быть ширина и высота "канваса", стало быть - ширина и высота моего "битмапа". Остальные 4 параметра - смещения - в моём случае наверное нули. Если параметры "смещение в битмапе" мне могут быть ясны, то параметры "смещение в канвасе" мне неясны совсем. Или я неправильно понял? А параметры указываются в пикселах ?

предназначение следующих 2х параметров (ScanLine-ы) тоже не понятны.

указатель на "мою память" и "описание битмапа" ясны.
если изображение беспалитровое, то fuColorUse = DIB_RGB_COLORS ?

Ещё немаловажный вопрос!
в стандартном битмапе память идёт "снизу вверх", т.е. указатель на данные в битмапе указывают на данные в последней строке пикселей битмапа. А возможно ли (без свапа строк) создать HDC по памяти, строки пекселей в которой идут сверху вниз ?

Извиняюсь за нехорошее объяснение :))
Надеюсь на помощь.


 
slow!alfamoon!com   (2008-04-16 17:47) [3]


> Первый параметр - DC. Т.е. я его сначала должен создать.
> .. Как создать DC, который будет использоваться для "изменения
> моей памяти" О_о?
>


Проще всегО вам сделать совместимый c экраном DC. Т.е. CreateCompatibleDC(GetDC(0),...)

конкретно с СreateDC я не работал..


 
DevilDevil ©   (2008-04-16 20:11) [4]

> slow!alfamoon!com   (16.04.08 17:47) [3]

)) а с остальным как быть ?


 
Sapersky   (2008-04-16 20:32) [5]

Допустим есть кусок памяти, который я хочу особым образом заподнить, как Битмап.

A что конкретно требуется? Может, прямо так и заполнить участок памяти, безо всяких битмапов/DC.
Или использовать FastLIB, который позволяет "навесить" TFastDIB на произвольный участок памяти. Никакие DC при этом не создаются, т.е. функции GDI использовать нельзя, но можно использовать работающие через Scanline/Pixels (т.е. практически все) функции FastLIB.


 
DevilDevil ©   (2008-04-17 10:16) [6]

> Sapersky   (16.04.08 20:32) [5]
к слову говоря, вчера-сегодня штудирую исходники AnyDX2D_v0.5 :))

хочу объединить методы Lock и GetDC у поверхности.
в хелпе написано, что GetDC на самом деле использует Lock, стало быть, моя задумка осуществима.

> Никакие DC при этом не создаются
не... вообще говоря, именно Канвас и хочется получить... А "ScanLine" доступен всегда )

P.S. что делать то ??


 
венн ©   (2008-04-17 15:49) [7]

даже не знаю че посоветовать


 
Sapersky   (2008-04-17 17:31) [8]

хочу объединить методы Lock и GetDC у поверхности.
в хелпе написано, что GetDC на самом деле использует Lock, стало быть, моя задумка осуществима.


Не факт, неизвестно, что там ещё используется кроме Lock. Возможно, какие-то доступные только на уровне драйвера функции/данные.

вообще говоря, именно Канвас и хочется получить...

Всё-таки не очень понятно зачем. Что такого может этот канвас, чего нельзя было бы сделать через Scanline? В крайнем случае, всегда можно нарисовать в отдельном битмапе и скопировать в поверхность.
К тому же само по себе интенсивное использование Lock/GetDC в рендере - идеологически неправильно, основная фишка DX - макс. использование аппаратного ускорения, а этот "прямой доступ" в большинстве случаев тормозит всё до уровня GDI.


 
DevilDevil ©   (2008-04-17 17:49) [9]

> Sapersky   (17.04.08 17:31) [8]
привет )

> Не факт, неизвестно, что там ещё используется кроме Lock
ну фиг знает, по описанию в хелпе вроде возможно.
единственная загвоздка - "свап строк"... но тоже наверно как то можно.

> Всё-таки не очень понятно зачем. Что такого может этот канвас,
>  чего нельзя было бы сделать через Scanline?


понимаешь... Канвас - достаточно удобная универсальная штука. Совсем не плохо было бы временно редактировать текстуру (поверхность) как Битмап!!! Захотел - заюзал его как Канвас, захотел - прямой доступ через ScanLines --- красота!!! :)

Да, отдельное создание битмапа это выход... но зачем использовать такой подход, когда возможен "стандартный", более быстрый ?

P.S. помогите с параметрами SetDIBitsToDevice


 
stab   (2008-04-18 01:45) [10]

Вкратце, dc := CreateCompatibleDC(0), dib := CreateDIBSection(.. твой кусок памяти ..), SelectObject(dc, dib). Теперь рисование через dc будет модифицировать память.


 
DevilDevil   (2008-04-18 02:08) [11]

> stab   (18.04.08 01:45) [10]
спасибо, что пришёл на помощь!

>  CreateDIBSection
О_о? Если мне не изменяет память, CreateDIBSection сам резервирует память, а не использует заданную тобой


 
miek   (2008-04-18 14:38) [12]

ты чего хочешь добиться? сам выделить кусок памяти и на нем создать DC? это невозможно. сначала создаешь dibsection, система сама резервирует память и потом можешь ее использовать.


 
DevilDevil ©   (2008-04-18 14:51) [13]

> miek   (18.04.08 14:38) [12]

как то должно быть можно!!!


 
DevilDevil ©   (2008-04-18 14:59) [14]

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

ЧТО МНЕ ДЕЛАТЬ ???


 
Sapersky   (2008-04-18 16:54) [15]

ИМХО, не забивать голову утопическими идеями и использовать обычные GetDC/Lock :)
А лучше только Lock, т.к. GetDC по моему опыту срабатывает не всегда (вроде бы с мип-уровнем текстуры на Radeon X700 были проблемы).

Если очень хочется - почитай Фень Юаня, там как раз "потроха" GDI/DDraw разобраны. Может, что-то полезное найдёшь или железно убедишься что "низзя":
http://irazin.ru/Downloads/Books/Yuan.rar


 
DevilDevil ©   (2008-04-18 17:22) [16]

> 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 18:42) [17]

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 18:49) [18]

> Кстати, если вопрос ставится как "DC любой ценой"

хех))) это не вариант.

можно, конечно, протейсить Surface.GetDC ... Но я не думаю, что это даст хороший результат...

КАК АССОЦИИРОВАТЬ КАКВАС С МОЕЙ ОБЛАСТЬЮ ПАМЯТИ ???


 
slow!alfamoon!com   (2008-04-21 13:33) [19]

может так?

1.создать совместимый дс
CreateCOmpatibleDC(GetDC(0),...)
2.Создать совместимый битмап
CreateCompatibleBitmap
3.заполнить биты
4.SelectObject


 
Eraser ©   (2008-04-21 17:05) [20]

VCL с исходниками идет.


 
DevilDevil ©   (2008-04-21 17:08) [21]

> slow!alfamoon!com   (21.04.08 13:33) [19]

неа, не прокатит.

В CreateCompatibleBitmap нужен DC с определённым (нужном мне) форматом пиксела. А в CreateCOmpatibleDC(GetDC(0),...) скорее всего будет 32бита.

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


 
DevilDevil ©   (2008-04-21 17:10) [22]

> Eraser ©   (21.04.08 17:05) [20]
sorry ?


 
slow!alfamoon!com   (2008-04-21 17:22) [23]

тогда разбирайся с SetDIBits..


 
DevilDevil ©   (2008-04-21 17:25) [24]

сдаётся мне, SetDIBits/ToDevice - не то что нужно :(
или я ошибаюсь ?
)) треба мастеров WinAPI


 
Eraser ©   (2008-04-21 18:37) [25]

TBitmap тоже с исходниками.


 
slow!alfamoon!com   (2008-04-21 19:04) [26]

Читай уже Фень Юаня, не ленись. Там все написано. Мне лично такая задача просто еще не попадалась.


 
DevilDevil ©   (2008-04-21 19:06) [27]

> Eraser ©   (21.04.08 18:37) [25]
что с того ?



Страницы: 1 вся ветка

Текущий архив: 2009.04.26;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.012 c
2-1237106993
ML
2009-03-15 11:49
2009.04.26
Процедуры


2-1236872136
Бурато
2009-03-12 18:35
2009.04.26
Поиск


15-1232561713
vuk
2009-01-21 21:15
2009.04.26
Ндааааа....


15-1235469134
Boom boom box
2009-02-24 12:52
2009.04.26
Вывод на второй дисплей


6-1202258166
Alex603081
2008-02-06 03:36
2009.04.26
ClientSocket