Как найти адрес массива Pixels?

Тема в разделе "WASM.BEGINNERS", создана пользователем Andrik, 28 апр 2007.

  1. Andrik

    Andrik New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    19
    Столкнулся в Builder'е 6 с такой непоняткой. У Canvas'а есть свойство Pixels, который явно описан в Graphics.hpp как массив TColor, но вот чего-то я не пойму. Сам по себе Pixels указателем не является (как хотелось бы), да и фишка вроде &Pixels[0][0] не проходит. Отладил функцию SetPixel, но так и не нашел, куда идет запись (хотя, наверное, плохо искал). Как все-таки узнать адрес этого массива?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    а чем? я vcl не знаю. если это сразу массив, то просто &Pixels будет адресом
     
  3. Andrik

    Andrik New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    19
    К сожалению, не получается. Обращение к Pixels передается на функцию GetPixel, которая принимает 2 параметра (координаты). Вот и выскакивает ошибка - слишком мало параметров...
     
  4. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    А там и нет никакого массива :) В отладчике видно, что Canvas.SetPixel внутренне вызывает Gdi32!SetPixel (HDC hdc, int X, int Y, COLORREF crColor) - никаких массивов там нет, только хэндл.
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Andrik
    Массив можно получить через GetDIBits. Где-то есть тема, в которой подробно обсуждались тонкости данной функции.
     
  6. Andrik

    Andrik New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    19
    Спасибо, будем искать. :)
     
  7. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Да вот так!
    Ну, проще не бывает.

    GetBMpBits proc hBmp:HBITMAP
    LOCAL DIBInfo:lol: IBSECTION
    ;Узнаем какой BM
    invoke GetObject,hBmp,sizeof(DIBSECTION),NULL
    .if eax==sizeof(DIBSECTION)
    .elseif eax==sizeof(BITMAP)
    .else
    invoke MessageBox,NULL,$TA0('Unknown'),$TA0('Unknown'),MB_OK
    xor eax, eax
    ret
    .endif
    invoke GetObject,hBmp,sizeof(DIBSECTION),ADDR DIBInfo
    mov eax, DIBInfo.dsBm.bmBits
    ret
    GetBMpBits endp

    Удачи.
     
  8. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    S_Alex
    Этот метод будет работать только если картинка создана через CreateDIBSection, а для обычных картинок нужно юзать GetDIBits. Причём даже если использовать dib-section, память, на которую будет указывать dsBm.bmBits, может быть недоступна для записи.