-
Наверняка как то можно... Вот мой и вопрос и состоит в "как это сделать?"
Допустим есть кусок памяти, который я хочу особым образом заподнить, как Битмап.
Заранее спасибо.
-
А в чем собственно проблема? Формируйте битмап в памяти и SetDIBitsToDevice или StretchDIBitsToDevice в требуемый HDC
-
> 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 по памяти, строки пекселей в которой идут сверху вниз ?
Извиняюсь за нехорошее объяснение :)) Надеюсь на помощь.
-
> Первый параметр - DC. Т.е. я его сначала должен создать. > .. Как создать DC, который будет использоваться для "изменения > моей памяти" О_о? >
Проще всегО вам сделать совместимый c экраном DC. Т.е. CreateCompatibleDC(GetDC(0),...)
конкретно с СreateDC я не работал..
-
> slow!alfamoon!com (16.04.08 17:47) [3]
)) а с остальным как быть ?
-
Допустим есть кусок памяти, который я хочу особым образом заподнить, как Битмап.
A что конкретно требуется? Может, прямо так и заполнить участок памяти, безо всяких битмапов/DC. Или использовать FastLIB, который позволяет "навесить" TFastDIB на произвольный участок памяти. Никакие DC при этом не создаются, т.е. функции GDI использовать нельзя, но можно использовать работающие через Scanline/Pixels (т.е. практически все) функции FastLIB.
-
> Sapersky (16.04.08 20:32) [5] к слову говоря, вчера-сегодня штудирую исходники AnyDX2D_v0.5 :))
хочу объединить методы Lock и GetDC у поверхности. в хелпе написано, что GetDC на самом деле использует Lock, стало быть, моя задумка осуществима.
> Никакие DC при этом не создаются не... вообще говоря, именно Канвас и хочется получить... А "ScanLine" доступен всегда )
P.S. что делать то ??
-
даже не знаю че посоветовать
-
хочу объединить методы Lock и GetDC у поверхности. в хелпе написано, что GetDC на самом деле использует Lock, стало быть, моя задумка осуществима.
Не факт, неизвестно, что там ещё используется кроме Lock. Возможно, какие-то доступные только на уровне драйвера функции/данные.
вообще говоря, именно Канвас и хочется получить...
Всё-таки не очень понятно зачем. Что такого может этот канвас, чего нельзя было бы сделать через Scanline? В крайнем случае, всегда можно нарисовать в отдельном битмапе и скопировать в поверхность. К тому же само по себе интенсивное использование Lock/GetDC в рендере - идеологически неправильно, основная фишка DX - макс. использование аппаратного ускорения, а этот "прямой доступ" в большинстве случаев тормозит всё до уровня GDI.
-
> Sapersky (17.04.08 17:31) [8] привет )
> Не факт, неизвестно, что там ещё используется кроме Lock ну фиг знает, по описанию в хелпе вроде возможно. единственная загвоздка - "свап строк"... но тоже наверно как то можно.
> Всё-таки не очень понятно зачем. Что такого может этот канвас, > чего нельзя было бы сделать через Scanline?
понимаешь... Канвас - достаточно удобная универсальная штука. Совсем не плохо было бы временно редактировать текстуру (поверхность) как Битмап!!! Захотел - заюзал его как Канвас, захотел - прямой доступ через ScanLines --- красота!!! :)
Да, отдельное создание битмапа это выход... но зачем использовать такой подход, когда возможен "стандартный", более быстрый ?
P.S. помогите с параметрами SetDIBitsToDevice
-
Вкратце, dc := CreateCompatibleDC(0), dib := CreateDIBSection(.. твой кусок памяти ..), SelectObject(dc, dib). Теперь рисование через dc будет модифицировать память.
-
> stab (18.04.08 01:45) [10] спасибо, что пришёл на помощь!
> CreateDIBSection О_о? Если мне не изменяет память, CreateDIBSection сам резервирует память, а не использует заданную тобой
-
ты чего хочешь добиться? сам выделить кусок памяти и на нем создать DC? это невозможно. сначала создаешь dibsection, система сама резервирует память и потом можешь ее использовать.
-
> miek (18.04.08 14:38) [12]
как то должно быть можно!!!
-
если глобально мыслить, DC - это штука универсальная, хочешь - на принтер её навесь, хочешь - на битмап, хочешь - на любое др. Стало быть, нет ничего невозможного.
ЧТО МНЕ ДЕЛАТЬ ???
-
ИМХО, не забивать голову утопическими идеями и использовать обычные GetDC/Lock :) А лучше только Lock, т.к. GetDC по моему опыту срабатывает не всегда (вроде бы с мип-уровнем текстуры на Radeon X700 были проблемы). Если очень хочется - почитай Фень Юаня, там как раз "потроха" GDI/DDraw разобраны. Может, что-то полезное найдёшь или железно убедишься что "низзя": http://irazin.ru/Downloads/Books/Yuan.rar
-
> Sapersky (18.04.08 16:54) [15]ага... скачал, щас читать буду... Слушайте, а CreateDIBitmap мне не подойдёт ??? HBITMAP CreateDIBitmap(
HDC hdc, CONST BITMAPINFOHEADER *lpbmih, DWORD fdwInit, CONST VOID *lpbInit, CONST BITMAPINFO *lpbmi, UINT fuUsage ); Во-первых, насколько я понял, тут создаётся битмап по имеющимся данным (или эта память тупо копируется? ). Во-вторых, здесь пишут, что если в качестве 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.
-
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 у поверхности будет :)
-
> Кстати, если вопрос ставится как "DC любой ценой"
хех))) это не вариант.
можно, конечно, протейсить Surface.GetDC ... Но я не думаю, что это даст хороший результат...
КАК АССОЦИИРОВАТЬ КАКВАС С МОЕЙ ОБЛАСТЬЮ ПАМЯТИ ???
-
может так?
1.создать совместимый дс CreateCOmpatibleDC(GetDC(0),...) 2.Создать совместимый битмап CreateCompatibleBitmap 3.заполнить биты 4.SelectObject
-
VCL с исходниками идет.
-
> slow!alfamoon!com (21.04.08 13:33) [19]
неа, не прокатит.
В CreateCompatibleBitmap нужен DC с определённым (нужном мне) форматом пиксела. А в CreateCOmpatibleDC(GetDC(0),...) скорее всего будет 32бита.
Кроме того задача состоит в ассоциировании DC с имеющейся областью памяти. А так можно и TBitmap простой создавать, да копировать туда залоченные данные.
-
> Eraser © (21.04.08 17:05) [20] sorry ?
-
тогда разбирайся с SetDIBits..
-
сдаётся мне, SetDIBits/ToDevice - не то что нужно :( или я ошибаюсь ? )) треба мастеров WinAPI
-
TBitmap тоже с исходниками.
-
Читай уже Фень Юаня, не ленись. Там все написано. Мне лично такая задача просто еще не попадалась.
-
> Eraser © (21.04.08 18:37) [25] что с того ?
|