Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
15-1235729427
Галинка
2009-02-27 13:10
2009.04.26
SAX или DOM


15-1235651214
Ega23
2009-02-26 15:26
2009.04.26
Подскажите, как понять


15-1235546556
Ega23
2009-02-25 10:22
2009.04.26
Администраторам сайта


15-1235845800
AIRDIGER
2009-02-28 21:30
2009.04.26
как статью поместить


2-1236857943
Руслан
2009-03-12 14:39
2009.04.26
что за ошибка в Turbo Delphi 2006 Explorer





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский