GDI+ Flat API

Тема в разделе "WASM.GDI+", создана пользователем mc black, 4 дек 2008.

  1. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    Возникает куча вопросов по GDI+ Flat API. Решил разобраться с использованием сабжа в программках на ассемблере (использую MASM32 SDK v10), начал с чтения в MSDN Library раздела

    Win32 and COM Development
    Graphics and Multimedia
    GDI+
    Using GDI+
    Getting Started
    Drawing a Line

    Переписывал пример на ассемблер, он естественно не работает как надо. Возник вопрос по поводу типа REAL (в примере на С++). Так как в gdiplus.inc на месте параметров REAL стоит :lol: WORD, то я посчитал, что там REAL4. Написал пример так, как его понял. Код компилируется, работает и трассируется в отладчике без ошибок, но не работает по сути. Помогите найти ошибки.

    Для удобства приведу кусок кода - функцию-обработчик WM_PAINT:
    Код (Text):
    1. OnPaint proc hdc:DWORD
    2.     LOCAL graphics:DWORD
    3.     LOCAL pen:DWORD
    4.     LOCAL dWidth:DWORD
    5.     LOCAL dX1:DWORD
    6.     LOCAL dY1:DWORD
    7.     LOCAL dX2:DWORD
    8.     LOCAL dY2:DWORD
    9.     invoke GdipCreateFromHDC,hdc,addr graphics
    10.     ;.data
    11.     ;rWidth REAL4 5.0
    12.     ;.code
    13.     push rWidth ;это сделано для того, чтобы передавать REAL4
    14.     pop dWidth  ;в функцию, которая требует DWORD
    15.     ;иначе не компилируется
    16.     invoke GdipCreatePen1,0FF0000FFh,dWidth,UnitPixel,addr pen
    17.     push rX1
    18.     pop dX1
    19.     push rY1
    20.     pop dY1
    21.     push rX2
    22.     pop dX2
    23.     push rY2
    24.     pop dY2
    25.     invoke GdipDrawLine,addr graphics,addr pen,dX1,dY1,dX2,dY2
    26.     invoke GdipDeletePen,pen
    27.     invoke GdipDeleteGraphics,graphics
    28.     ret
    29. OnPaint endp
    P.S. Компилятора С++ под руками нет, откомпилировать с генерацией asm-листинга пример не могу, кроме того я не изучал я C++ поэтому прошу меня сильно за это не пинать.
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Код (Text):
    1.     push    ecx
    2.     fld1
    3.     fstp    DWORD PTR [esp]
    4.     push    255                 ; 000000ffH
    5.     push    0
    6.     push    0
    7.     push    255                 ; 000000ffH
    8.     lea ecx, DWORD PTR $T73452[ebp]
    9.     call    ??0Color@Gdiplus@@QAE@EEEE@Z        ; Gdiplus::Color::Color
    10.     push    eax
    11.     lea ecx, DWORD PTR _pen$[ebp]
    12.     call    ??0Pen@Gdiplus@@QAE@ABVColor@1@M@Z  ; Gdiplus::Pen::Pen
    13.     mov BYTE PTR __$EHRec$[ebp+8], 1
    14. ; Line 10
    15.     push    100                 ; 00000064H
    16.     push    200                 ; 000000c8H
    17.     push    0
    18.     push    0
    19.     lea ecx, DWORD PTR _pen$[ebp]
    20.     push    ecx
    21.     lea ecx, DWORD PTR _graphics$[ebp]
    22.     call    ?DrawLine@Graphics@Gdiplus@@QAE?AW4Status@2@PBVPen@2@HHHH@Z ; Gdiplus::Graphics::DrawLine
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    mc black
    Код (Text):
    1. ...
    2. ;; -- invoke GdipDrawLine,addr graphics,addr pen,dX1,dY1,dX2,dY2
    3. invoke GdipDrawLine, graphics, pen,dX1,dY1,dX2,dY2
    4. ...
    hint обрати внимание на количество звездочек в параметрах GdipCreateFromHDC и GdipDrawLine.
     
  4. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    censored, спасибо за asm-листинг. Пора завести C++ компилятор. VC6 для этого пойдет? Значения параметров REAL, как показано, по уму надо как раз инструкциями FPU загонять.

    q_q, спасибо большое, ты нашел мои ошибки!!! Короче там я передавал указатель на Ren по адресу, а нужно было по значению. И то же касается объекта Graphics. Исправленный пример прикладываю.

    Модераторам: Если вы не против, здесь и далее предлагаю продолжить для всех постить вопросы-ответы по GDI+ Flat API.