Форум: "WinAPI";
Текущий архив: 2009.04.26;
Скачать: [xml.tar.bz2];
ВнизАссоциировать 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2009.04.26;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.006 c