Возникает куча вопросов по 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 стоит WORD, то я посчитал, что там REAL4. Написал пример так, как его понял. Код компилируется, работает и трассируется в отладчике без ошибок, но не работает по сути. Помогите найти ошибки. Для удобства приведу кусок кода - функцию-обработчик WM_PAINT: Код (Text): OnPaint proc hdc:DWORD LOCAL graphics:DWORD LOCAL pen:DWORD LOCAL dWidth:DWORD LOCAL dX1:DWORD LOCAL dY1:DWORD LOCAL dX2:DWORD LOCAL dY2:DWORD invoke GdipCreateFromHDC,hdc,addr graphics ;.data ;rWidth REAL4 5.0 ;.code push rWidth ;это сделано для того, чтобы передавать REAL4 pop dWidth ;в функцию, которая требует DWORD ;иначе не компилируется invoke GdipCreatePen1,0FF0000FFh,dWidth,UnitPixel,addr pen push rX1 pop dX1 push rY1 pop dY1 push rX2 pop dX2 push rY2 pop dY2 invoke GdipDrawLine,addr graphics,addr pen,dX1,dY1,dX2,dY2 invoke GdipDeletePen,pen invoke GdipDeleteGraphics,graphics ret OnPaint endp P.S. Компилятора С++ под руками нет, откомпилировать с генерацией asm-листинга пример не могу, кроме того я не изучал я C++ поэтому прошу меня сильно за это не пинать.
Код (Text): push ecx fld1 fstp DWORD PTR [esp] push 255 ; 000000ffH push 0 push 0 push 255 ; 000000ffH lea ecx, DWORD PTR $T73452[ebp] call ??0Color@Gdiplus@@QAE@EEEE@Z ; Gdiplus::Color::Color push eax lea ecx, DWORD PTR _pen$[ebp] call ??0Pen@Gdiplus@@QAE@ABVColor@1@M@Z ; Gdiplus::Pen::Pen mov BYTE PTR __$EHRec$[ebp+8], 1 ; Line 10 push 100 ; 00000064H push 200 ; 000000c8H push 0 push 0 lea ecx, DWORD PTR _pen$[ebp] push ecx lea ecx, DWORD PTR _graphics$[ebp] call ?DrawLine@Graphics@Gdiplus@@QAE?AW4Status@2@PBVPen@2@HHHH@Z ; Gdiplus::Graphics::DrawLine
mc black Код (Text): ... ;; -- invoke GdipDrawLine,addr graphics,addr pen,dX1,dY1,dX2,dY2 invoke GdipDrawLine, graphics, pen,dX1,dY1,dX2,dY2 ... hint обрати внимание на количество звездочек в параметрах GdipCreateFromHDC и GdipDrawLine.
censored, спасибо за asm-листинг. Пора завести C++ компилятор. VC6 для этого пойдет? Значения параметров REAL, как показано, по уму надо как раз инструкциями FPU загонять. q_q, спасибо большое, ты нашел мои ошибки!!! Короче там я передавал указатель на Ren по адресу, а нужно было по значению. И то же касается объекта Graphics. Исправленный пример прикладываю. Модераторам: Если вы не против, здесь и далее предлагаю продолжить для всех постить вопросы-ответы по GDI+ Flat API.