Конференция "WinAPI" » Ассоциировать HDC со своей областью памяти
 
  • DevilDevil (12.04.08 06:27) [0]
    Наверняка как то можно...
    Вот мой и вопрос и состоит в "как это сделать?"

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

    Заранее спасибо.
  • slow!alfamoon!com (12.04.08 11:42) [1]
    А в чем собственно проблема? Формируйте битмап в памяти и SetDIBitsToDevice или StretchDIBitsToDevice в требуемый HDC
  • DevilDevil © (16.04.08 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 (16.04.08 17:47) [3]

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


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

    конкретно с СreateDC я не работал..
  • DevilDevil © (16.04.08 20:11) [4]
    > slow!alfamoon!com   (16.04.08 17:47) [3]

    )) а с остальным как быть ?
  • Sapersky (16.04.08 20:32) [5]
    Допустим есть кусок памяти, который я хочу особым образом заподнить, как Битмап.

    A что конкретно требуется? Может, прямо так и заполнить участок памяти, безо всяких битмапов/DC.
    Или использовать FastLIB, который позволяет "навесить" TFastDIB на произвольный участок памяти. Никакие DC при этом не создаются, т.е. функции GDI использовать нельзя, но можно использовать работающие через Scanline/Pixels (т.е. практически все) функции FastLIB.
  • DevilDevil © (17.04.08 10:16) [6]
    > Sapersky   (16.04.08 20:32) [5]
    к слову говоря, вчера-сегодня штудирую исходники AnyDX2D_v0.5 :))

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

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

    P.S. что делать то ??
  • венн © (17.04.08 15:49) [7]
    даже не знаю че посоветовать
  • Sapersky (17.04.08 17:31) [8]
    хочу объединить методы Lock и GetDC у поверхности.
    в хелпе написано, что GetDC на самом деле использует Lock, стало быть, моя задумка осуществима.


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

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

    Всё-таки не очень понятно зачем. Что такого может этот канвас, чего нельзя было бы сделать через Scanline? В крайнем случае, всегда можно нарисовать в отдельном битмапе и скопировать в поверхность.
    К тому же само по себе интенсивное использование Lock/GetDC в рендере - идеологически неправильно, основная фишка DX - макс. использование аппаратного ускорения, а этот "прямой доступ" в большинстве случаев тормозит всё до уровня GDI.
  • DevilDevil © (17.04.08 17:49) [9]
    > Sapersky   (17.04.08 17:31) [8]
    привет )

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

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


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

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

    P.S. помогите с параметрами SetDIBitsToDevice
  • stab (18.04.08 01:45) [10]
    Вкратце, dc := CreateCompatibleDC(0), dib := CreateDIBSection(.. твой кусок памяти ..), SelectObject(dc, dib). Теперь рисование через dc будет модифицировать память.
  • DevilDevil (18.04.08 02:08) [11]
    > stab   (18.04.08 01:45) [10]
    спасибо, что пришёл на помощь!

    >  CreateDIBSection
    О_о? Если мне не изменяет память, CreateDIBSection сам резервирует память, а не использует заданную тобой
  • miek (18.04.08 14:38) [12]
    ты чего хочешь добиться? сам выделить кусок памяти и на нем создать DC? это невозможно. сначала создаешь dibsection, система сама резервирует память и потом можешь ее использовать.
  • DevilDevil © (18.04.08 14:51) [13]
    > miek   (18.04.08 14:38) [12]

    как то должно быть можно!!!
  • DevilDevil © (18.04.08 14:59) [14]
    если глобально мыслить, DC - это штука универсальная, хочешь - на принтер её навесь, хочешь - на битмап, хочешь - на любое др. Стало быть, нет ничего невозможного.

    ЧТО МНЕ ДЕЛАТЬ ???
  • Sapersky (18.04.08 16:54) [15]
    ИМХО, не забивать голову утопическими идеями и использовать обычные GetDC/Lock :)
    А лучше только Lock, т.к. GetDC по моему опыту срабатывает не всегда (вроде бы с мип-уровнем текстуры на Radeon X700 были проблемы).

    Если очень хочется - почитай Фень Юаня, там как раз "потроха" GDI/DDraw разобраны. Может, что-то полезное найдёшь или железно убедишься что "низзя":
    http://irazin.ru/Downloads/Books/Yuan.rar
  • DevilDevil © (18.04.08 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 (18.04.08 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 © (18.04.08 18:49) [18]
    > Кстати, если вопрос ставится как "DC любой ценой"

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

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

    КАК АССОЦИИРОВАТЬ КАКВАС С МОЕЙ ОБЛАСТЬЮ ПАМЯТИ ???
  • slow!alfamoon!com (21.04.08 13:33) [19]
    может так?

    1.создать совместимый дс
    CreateCOmpatibleDC(GetDC(0),...)
    2.Создать совместимый битмап
    CreateCompatibleBitmap
    3.заполнить биты
    4.SelectObject
  • Eraser © (21.04.08 17:05) [20]
    VCL с исходниками идет.
  • DevilDevil © (21.04.08 17:08) [21]
    > slow!alfamoon!com   (21.04.08 13:33) [19]

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

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

    Кроме того задача состоит в ассоциировании DC с имеющейся областью памяти. А так можно и TBitmap простой создавать, да копировать туда залоченные данные.
  • DevilDevil © (21.04.08 17:10) [22]
    > Eraser ©   (21.04.08 17:05) [20]
    sorry ?
  • slow!alfamoon!com (21.04.08 17:22) [23]
    тогда разбирайся с SetDIBits..
  • DevilDevil © (21.04.08 17:25) [24]
    сдаётся мне, SetDIBits/ToDevice - не то что нужно :(
    или я ошибаюсь ?
    )) треба мастеров WinAPI
  • Eraser © (21.04.08 18:37) [25]
    TBitmap тоже с исходниками.
  • slow!alfamoon!com (21.04.08 19:04) [26]
    Читай уже Фень Юаня, не ленись. Там все написано. Мне лично такая задача просто еще не попадалась.
  • DevilDevil © (21.04.08 19:06) [27]
    > Eraser ©   (21.04.08 18:37) [25]
    что с того ?
 
Конференция "WinAPI" » Ассоциировать HDC со своей областью памяти
Есть новые Нет новых   [134433   +22][b:0][p:0.002]