Рисование сплайнов в GDI+ Код (ASM): ; GUI # include win64a.inc cdXPos = 128 cdYPos = 128 cdXSize = 340 cdYSize = 290 SmoothingModeAntiAlias = 4 UnitPixel = 2; пиксели LineJoinMiter = 0;угловое соединение со скосом в 45°. Получается острый или обрезанный угол ;в зависимости от того, превышает ли длина среза ограничение по срезу PointF struct X dd ? Y dd ? PointF ends .code WinMain proc local msg:MSG ;инициализация библиотеки GDIPLUS invoke GdiplusStartup,&gdiplusToken,&gsi,0 xor ebx,ebx mov esi,IMAGE_BASE invoke LoadCursorFromFileA,"br_Rabbit3.cur" mov edi,offset ClassName push rax ;hIconSm push rdi ;lpszClassName push rbx ;lpszMenuName push COLOR_WINDOWTEXT;hbrBackground push rax ;hCursor push rax ;hIcon push rsi ;hInstance push rbx ;cbClsExtra & cbWndExtra pushaddr WndProc ;lpfnWndProc push sizeof WNDCLASSEX;cbSize & style invoke RegisterClassExA,esp ;addr WNDCLASSEX push rbx push rsi ;rsi=400000h push rbx push rbx push cdYSize push cdXSize push cdYPos push cdXPos sub esp,20h invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE lea edi,msg @@: invoke GetMessageA,edi,NULL,0,0 invoke DispatchMessageA,edi jmp @b WinMain endp WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD local ps:PAINTSTRUCT mov hWnd,rcx cmp edx,WM_DESTROY je wmDESTROY cmp edx,WM_CREATE je wmCREATE cmp edx,WM_PAINT je wmPAINT cmp edx,WM_KEYDOWN je wmKEYDOWN leave jmp NtdllDefWindowProc_ wmKEYDOWN:mov al,r8b;wParam cmp al,VK_ESCAPE;user press 'Esc'? jne wmBYE wmDESTROY:invoke GdipDeletePen,hPen invoke GdipDeleteBrush,hBrush ;уничтожить объект GDI+ mov ecx,gdiplusToken invoke GdiplusShutdown invoke RtlExitUserProcess,NULL ;------------------------------------------------------------ wmCREATE:;создать синее перо movd xmm1,const4 invoke GdipCreatePen1,0FF0000FFh,,UnitPixel,&hPen invoke GdipSetPenLineJoin,hPen, LineJoinMiter ;создать красную кисть invoke GdipCreateSolidFill,0FFFF0000h,&hBrush jmp wmBYE wmPAINT:invoke BeginPaint,hWnd,&ps invoke GdipCreateFromHDC,eax,&graphics invoke GdipSetSmoothingMode,graphics, SmoothingModeAntiAlias; Рисование со сглаживанием invoke GdipDrawCurve,graphics, hPen, &mtPuntos[0*8], (sizeof mtPuntos)/(sizeof PointF); xor edi,edi @@: mov eax,7 mov [rsp+28h],rax mov [rsp+20h],rax movd xmm0,mtPuntos[rdi*8].Y subss xmm0,const3_5 cvtss2si r9d,xmm0 movd xmm0,mtPuntos[rdi*8].X subss xmm0,const3_5 cvtss2si r8d,xmm0 invoke GdipFillEllipseI,graphics,hBrush inc edi cmp edi,(sizeof mtPuntos)/(sizeof PointF) jb @b invoke GdipDeleteGraphics,graphics invoke EndPaint,hWnd,&ps wmBYE: leave ret WndProc endp ;--------------------------------------- .data ClassName db 'Рисование сплайнов в GDI+',0 gsi GdiplusStartupInput <1,0,0,0,0> mtPuntos PointF <145.0, 40.0>, <66.0, 170.0>, <205.0, 207.0>, <138.0, 62.0>, <187.0, 65.0>, <84.0, 218.0>,<34.0, 120.0>, <190.0, 234.0>, <125.0, 162.0> const4 dd 4.0 const3_5 dd 3.5 .data? hPen dq ? hBrush dq ? gdiplusToken dd ? ; graphics dq ? end Во вложении asm/exe/cur-файлы
Рисование сплайнов в GDI+ Код (ASM): ; GUI # include win64a.inc cdXPos = 128 cdYPos = 128 cdXSize = 340 cdYSize = 400 SmoothingModeAntiAlias = 4 UnitPixel = 2; пиксели LineJoinMiter = 0;угловое соединение со скосом в 45°. Получается острый или обрезанный угол ;в зависимости от того, превышает ли длина среза ограничение по срезу PointF struct X dd ? Y dd ? PointF ends .code WinMain proc local msg:MSG ;инициализация библиотеки GDIPLUS invoke GdiplusStartup,&gdiplusToken,&gsi,0 xor ebx,ebx mov esi,IMAGE_BASE invoke LoadCursorFromFileA,"br_Rabbit3.cur" mov edi,offset ClassName push rax ;hIconSm push rdi ;lpszClassName push rbx ;lpszMenuName push COLOR_BTNFACE;hbrBackground push rax ;hCursor push rax ;hIcon push rsi ;hInstance push rbx ;cbClsExtra & cbWndExtra pushaddr WndProc ;lpfnWndProc push sizeof WNDCLASSEX;cbSize & style invoke RegisterClassExA,esp ;addr WNDCLASSEX push rbx push rsi ;rsi=400000h push rbx push rbx push cdYSize push cdXSize push cdYPos push cdXPos sub esp,20h invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE lea edi,msg @@: invoke GetMessageA,edi,NULL,0,0 invoke DispatchMessageA,edi jmp @b WinMain endp WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD local ps:PAINTSTRUCT mov hWnd,rcx cmp edx,WM_DESTROY je wmDESTROY cmp edx,WM_PAINT je wmPAINT cmp edx,WM_KEYDOWN je wmKEYDOWN cmp edx,WM_CREATE je wmCREATE leave jmp NtdllDefWindowProc_ wmKEYDOWN:mov al,r8b;wParam cmp al,VK_ESCAPE;user press 'Esc'? jne wmBYE wmDESTROY:invoke GdipDeletePen,hPen ;уничтожить объект GDI+ mov ecx,gdiplusToken invoke GdiplusShutdown invoke RtlExitUserProcess,NULL ;------------------------------------------------------------ wmCREATE:movd xmm1,const4 invoke GdipCreatePen1,0FFFF0000h,,UnitPixel,&hPen invoke GdipSetPenLineJoin,hPen,LineJoinMiter jmp wmBYE wmPAINT:invoke BeginPaint,hWnd,&ps invoke GdipCreateFromHDC,eax,&graphics invoke GdipSetSmoothingMode,graphics,SmoothingModeAntiAlias; Рисование со сглаживанием invoke GdipDrawCurve,graphics, hPen, &mtPuntos[0*8], (sizeof mtPuntos)/(sizeof PointF); invoke GdipDeleteGraphics,graphics invoke EndPaint,hWnd,&ps wmBYE: leave ret WndProc endp ;--------------------------------------- .data ClassName db 'Рисование сплайнов в GDI+',0 gsi GdiplusStartupInput <1,0,0,0,0> mtPuntos PointF <300.0, 40.0>, <100.0, 80.0>, <200.0, 120.0>, <50.0, 160.0>, <90.0, 195.726405817773>, <100.0, 113.562336350022>,<110.0, 180.236093561674>, <120.0, 183.205669204542>, <130.0, 147.408057803263>, <140.0, 179.066485842909>,<150.0, 296.488263212844>, <160.0, 295.763813340541>, <170.0, 330.941617453638>, <180.0, 112.155812175893>,<190.0, 306.762179445474>, <200.0, 55.8951339964604>, <210.0, 230.641779238024>, <220.0, 17.4446966322051> const4 dd 4.0 .data? hPen dq ? gdiplusToken dd ? ; graphics dq ? end Во вложении asm/exe/cur-файлы
Рисование сплайнов и анимация в GDI+ Код (ASM): ; GUI # include win64a.inc cdXPos = 128 cdYPos = 128 IDT_TIMER1 = 1000 WINDOWWIDTH = 380 WINDOWHEIGHT = 400 SmoothingModeAntiAlias = 4 UnitPixel = 2; пиксели LineJoinMiter = 0;угловое соединение со скосом в 45°. Получается острый или обрезанный угол ;в зависимости от того, превышает ли длина среза ограничение по срезу StringAlignmentFar = 2 FontStyleBold = 1 RectF STRUCT Left dd ? Top dd ? Right dd ? Bottom dd ? RectF ENDS PointF STRUCT x dd ? y dd ? PointF ENDS .code WinMain proc local msg:MSG ;инициализация библиотеки GDIPLUS invoke GdiplusStartup,&hGDIplus,&GdiPlusSI,0 xor ebx,ebx mov esi,IMAGE_BASE invoke LoadCursorFromFileA,"br_Rabbit3.cur" mov edi,offset ClassName push rax ;hIconSm push rdi ;lpszClassName push rbx ;lpszMenuName push COLOR_BTNFACE;hbrBackground push rax ;hCursor push rax ;hIcon push rsi ;hInstance push rbx ;cbClsExtra & cbWndExtra pushaddr WndProc ;lpfnWndProc mov rax,((CS_OWNDC or CS_HREDRAW or CS_VREDRAW)shl 32)+sizeof WNDCLASSEX push rax ;cbSize & style invoke RegisterClassExA,esp ;addr WNDCLASSEX push rbx push rsi ;rsi=400000h push rbx push rbx push WINDOWHEIGHT push WINDOWWIDTH push cdYPos push cdXPos sub esp,20h invoke CreateWindowExA,0,edi,edi,WS_CAPTION or WS_SYSMENU or WS_VISIBLE lea edi,msg @@: invoke GetMessageA,edi,NULL,0,0 invoke DispatchMessageA,edi jmp @b WinMain endp WndProc proc <12> hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD local ps:PAINTSTRUCT mov hWnd,rcx cmp edx,WM_DESTROY je wmDESTROY cmp edx,WM_PAINT je wmPAINT cmp edx,WM_KEYDOWN je wmKEYDOWN cmp edx,WM_CREATE je wmCREATE cmp edx,WM_ERASEBKGND je wmERASEBKGND leave jmp NtdllDefWindowProc_ wmKEYDOWN:mov al,r8b;wParam cmp al,VK_ESCAPE;user press 'Esc'? jne wmBYE wmDESTROY:invoke GdipDeleteFont,hFont invoke GdipDeleteStringFormat,hStringFormat invoke GdipDeleteBrush,hBrush invoke GdipDeletePen,hPen invoke GdipDeleteGraphics,memGraphics invoke GdipDisposeImage,hBitmap invoke GdipDeleteGraphics,hGraphics invoke ReleaseDC,hWnd,hDC mov ecx,hGDIplus invoke GdiplusShutdown invoke RtlExitUserProcess,NULL ;------------------------------------------------------------ wmERASEBKGND:mov eax,TRUE jmp wmBYE wmCREATE:invoke GetDC,hWnd mov hDC,rax invoke GdipCreateFromHDC,eax,&hGraphics invoke GdipCreateBitmapFromGraphics,400,400,hGraphics,&hBitmap invoke GdipGetImageGraphicsContext,hBitmap,&memGraphics invoke GdipSetSmoothingMode,memGraphics,SmoothingModeAntiAlias movd xmm1,penWidth invoke GdipCreatePen1,0FFFF0000h,,UnitPixel,&hPen invoke GdipSetPenLineJoin,hPen,LineJoinMiter invoke GdipCreateSolidFill,0FF0000FFh,&hBrush invoke GdipCreateStringFormat, NULL, NULL,&hStringFormat invoke GdipSetStringFormatAlign,hStringFormat,StringAlignmentFar invoke GdipSetStringFormatLineAlign,hStringFormat,StringAlignmentFar invoke GdipCreateFontFamilyFromName,&szFontName,0,&hFontFamily movr qword ptr[rsp+20h],hFont movd xmm1,emSize invoke GdipCreateFont,hFontFamily,,FontStyleBold,2 invoke GdipDeleteFontFamily,hFontFamily ;Set up our frames-per-second counter. invoke QueryPerformanceFrequency,&perfcnt movq xmm0,const1 cvtsi2sd xmm1,perfcnt divsd xmm0,xmm1 movq timefactor,xmm0 invoke QueryPerformanceCounter,&lasttime cvtsi2sd xmm0,lasttime movq lasttime,xmm0 jmp wmBYE wmPAINT:mov eax,animation_counter cmp eax,34*4 jnb @f add eax, 4 jmp @0 @@: xor eax,eax @0: mov animation_counter,eax lea eax,pPoint add eax,animation_counter mov ecx,[rax].PointF.x xchg ecx,[rax].PointF.y mov [rax].PointF.x,ecx ;---------------------------------------------------------- or edx,-1 invoke GdipGraphicsClear,memGraphics invoke GdipSetPenColor,hPen,0FFFF00FFh movd xmm1,rectWidth invoke GdipSetPenWidth,hPen mov eax,myRectangle.Bottom mov [rsp+28h],rax mov eax,myRectangle.Right mov [rsp+20h],rax movd xmm3,myRectangle.Top movd xmm2,myRectangle.Left invoke GdipDrawRectangle,memGraphics,hPen invoke GdipSetPenColor,hPen,0FF008000h invoke GdipDrawCurve,memGraphics,hPen,&pPoint,18 invoke GdipSetPenColor,hPen,0FFFF0000h movd xmm1,penWidth invoke GdipSetPenWidth,hPen invoke GdipDrawLines,memGraphics,hPen,&pPoint,18 mov eax,rect.Bottom mov [rsp+28h],rax mov eax,rect.Right mov [rsp+20h],rax movd xmm3,rect.Top movd xmm2,rect.Left invoke GdipDrawRectangle,memGraphics,hPen ;update FPS counter invoke QueryPerformanceCounter,&curtime ;Read performance counter cvtsi2sd xmm0,curtime;fild curtime movq curtime,xmm0;fstp curtime movq xmm1,xmm0 subsd xmm0,lasttime mulsd xmm0,timefactor movq timespan,xmm0 addsd xmm0,timer movq timer,xmm0 ;scale time value and save : time_span=(cur_time-last_time)*time_factor ;save new time reading for next pass through the loop movq lasttime,xmm1 fninit fld timer fld1 ;fldd 0.50 fxch fcomip st(0),st(1) jbe no_fps_yet and timer,0 movq xmm0,const1 divsd xmm0,timespan movq fps,xmm0 no_fps_yet:invoke sprintf,&szBuffer," FPS: %4.3f ",fps mov qword ptr[rsp+28h],255 movr qword ptr[rsp+20h],uszBuffer invoke MultiByteToWideChar,CP_OEMCP,MB_PRECOMPOSED,&szBuffer, -1 mov rax,hBrush mov [rsp+30h],rax mov rax,hStringFormat mov [rsp+28h],rax movr qword ptr[rsp+20h],rect invoke GdipDrawString,memGraphics,&uszBuffer,20,hFont mov qword ptr[rsp+40h],2 mov eax,400 mov [rsp+38h],rax mov [rsp+30h],rax xor r8,r8 mov [rsp+28h],r8 mov [rsp+20h],r8 invoke GdipDrawImagePointRectI,hGraphics,hBitmap,,0 wmBYE: leave ret WndProc endp ;--------------------------------------- .data ClassName db 'GDI+ Splines, Lines, DoubleBuffer',0 GdiPlusSI GdiplusStartupInput <1,0,0,0,0> perfcnt dq 0.0 timefactor dq 1.0 ;Time Scaling Factor lasttime dq 1.0 ;Previous timer value curtime dq 0 ;current timer value timespan dq 1.0 ;time elapsed since last frame fps dq 1.0 ;frames per second timer dq 1.0 ;accumulate timespan until one second has passed penWidth dd 0.2 rectWidth dd 3.0 const1 dq 1.0 animation_counter dd 0 emSize dd 14.0 align 8 myRectangle RectF <10.0, 10.0, 350.0, 350.0> rect RectF <10.0, 10.0, 350.0, 350.0> pPoint PointF <300.0, 40.0>,<100.0, 80.0>,<200.0, 120.0>,<50.0, 160.0>,<90.0, 195.726405817773>,<100.0, 113.562336350022>, <110.0, 180.236093561674>,<120.0, 183.205669204542>,<130.0, 147.408057803263>,<140.0, 179.066485842909>, <150.0, 296.488263212844>,<160.0, 295.763813340541>,<170.0, 330.941617453638>,<180.0, 112.155812175893>, <190.0, 306.762179445474>,<200.0, 55.8951339964604>,<210.0, 230.641779238024>,<220.0, 17.4446966322051> align 2 szFontName: du <Tahoma> .data? szBuffer db 128 dup(?) uszBuffer db 128 dup(?) hDC dq ? hGDIplus dd ? hGraphics dq ? hBrush dq ? hPath dq ? memGraphics dq ? hBitmap dq ? hPen dq ? hFont dq ? hFontFamily dq ? hStringFormat dq ? end Во вложении asm/exe/cur-файлы
Изменение размера и поворот изображения с помощью GDI+ Код (ASM): ; GUI # include win64a.inc cdXPos = 128 cdYPos = 128 cdXSize = 450 cdYSize = 300 WrapModeTile = 0 SmoothingModeAntiAlias = 5 MatrixOrderPrepend = 0 MatrixOrderAppend = 1 .code WinMain proc local msg:MSG ;инициализация библиотеки GDIPLUS invoke GdiplusStartup,&gdiplusToken,&gsi,0 xor ebx,ebx mov esi,IMAGE_BASE invoke LoadCursorFromFileA,"br_Rabbit3.cur" mov edi,offset ClassName push rax ;hIconSm push rdi ;lpszClassName push rbx ;lpszMenuName push COLOR_BTNFACE;hbrBackground push rax ;hCursor push rax ;hIcon push rsi ;hInstance push rbx ;cbClsExtra & cbWndExtra pushaddr WndProc ;lpfnWndProc push sizeof WNDCLASSEX;cbSize & style invoke RegisterClassExA,esp ;addr WNDCLASSEX push rbx push rsi ;rsi=400000h push rbx push rbx push cdYSize push cdXSize push cdYPos push cdXPos sub esp,20h invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE lea edi,msg @@: invoke GetMessageA,edi,NULL,0,0 invoke DispatchMessageA,edi jmp @b WinMain endp WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD local ps:PAINTSTRUCT mov hWnd,rcx cmp edx,WM_DESTROY je wmDESTROY cmp edx,WM_SIZE je wmSIZE cmp edx,WM_PAINT je wmPAINT cmp edx,WM_KEYDOWN je wmKEYDOWN cmp edx,WM_CREATE je wmCREATE leave jmp NtdllDefWindowProc_ wmKEYDOWN:mov al,r8b;wParam cmp al,VK_ESCAPE;user press 'Esc'? jne wmBYE wmDESTROY:invoke GdipDisposeImage,hBitmap invoke GdipDeleteGraphics,memGraphics ;уничтожить объект GDI+ mov ecx,gdiplusToken invoke GdiplusShutdown invoke RtlExitUserProcess,NULL ;------------------------------------------------------------ wmPAINT:invoke BeginPaint,hWnd, &ps invoke GdipCreateFromHDC,eax, &graphics invoke GdipSetSmoothingMode,graphics, SmoothingModeAntiAlias; Рисование со сглаживанием movd xmm1,const112 invoke GdipRotateWorldTransform,graphics,,MatrixOrderAppend cvtsi2ss xmm1,vdxClient divss xmm1,const2; (float)vdxClient/2.0 cvtsi2ss xmm2,vdyClient divss xmm2,const2;(float)vdyClient/2.0 invoke GdipTranslateWorldTransform,graphics,,,MatrixOrderAppend invoke GdipDrawImageI,graphics, smBitmap,0, 0 invoke GdipResetWorldTransform,graphics invoke GdipDeleteGraphics,graphics invoke EndPaint,hWnd, &ps jmp wmBYE wmCREATE:invoke GdipCreateFromHWND,hWnd, &graphics invoke GdipLoadImageFromFile,&FileName, &hBitmap invoke GdipCreateBitmapFromGraphics,130, 130, graphics, &smBitmap invoke GdipGetImageWidth,hBitmap, &nWidth invoke GdipGetImageHeight,hBitmap, &nHeight invoke GdipGetImageGraphicsContext,smBitmap, &memGraphics mov qword ptr[rsp+28h],122;40 ; x-size mov qword ptr[rsp+20h],130 ; y-size invoke GdipDrawImageRectI,memGraphics, hBitmap, 0, 0; x, y координаты верхней точки, куда поместим изображение invoke GdipDeleteGraphics,graphics jmp wmBYE wmSIZE: mov vdxClient,r9d and vdxClient,0FFFFh;vdxClient = LOWORD (lParam) ; shr r9d,16 mov vdyClient,r9d; vdyClient = HIWORD (lParam) ; invoke InvalidateRect,hWnd, NULL,TRUE wmBYE: leave ret WndProc endp ;--------------------------------------- .data ClassName db 'Поворачиваем изображение с помощью GDI+',0 gsi GdiplusStartupInput <1,0,0,0,0> FileName: du <Comecocos.png> const2 dd 2.0 const112 dd 112.0 .data? gdiplusToken dd ? ; memGraphics dq ? hBitmap dq ? vdxClient dd ? ; vdyClient dd ? ; nWidth dq ? nHeight dq ? smBitmap dq ? graphics dq ? end Во вложении asm/exe/cur/png-файлы
Вращаем изображением с помощью GDI+Используется png-файл с прозрачным фоном Код (ASM): ; GUI # include win64a.inc cdXPos = 128 cdYPos = 128 cdXSize = 450 cdYSize = 350 WrapModeTile = 0 SmoothingModeAntiAlias = 5 .code WinMain proc local msg:MSG ;инициализация библиотеки GDIPLUS invoke GdiplusStartup,&gdiplusToken,&gsi,0 xor ebx,ebx mov esi,IMAGE_BASE invoke LoadCursorFromFileA,"br_Rabbit3.cur" mov edi,offset ClassName push rax ;hIconSm push rdi ;lpszClassName push rbx ;lpszMenuName push COLOR_BTNFACE;hbrBackground push rax ;hCursor push rax ;hIcon push rsi ;hInstance push rbx ;cbClsExtra & cbWndExtra pushaddr WndProc ;lpfnWndProc push sizeof WNDCLASSEX;cbSize & style invoke RegisterClassExA,esp ;addr WNDCLASSEX push rbx push rsi ;rsi=400000h push rbx push rbx push cdYSize push cdXSize push cdYPos push cdXPos sub esp,20h invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE lea edi,msg @@: invoke GetMessageA,edi,NULL,0,0 invoke DispatchMessageA,edi jmp @b WinMain endp WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD local ps:PAINTSTRUCT mov hWnd,rcx cmp edx,WM_DESTROY je wmDESTROY cmp edx,WM_SIZE je wmSIZE cmp edx,WM_PAINT je wmPAINT cmp edx,WM_KEYDOWN je wmKEYDOWN cmp edx,WM_CREATE je wmCREATE leave jmp NtdllDefWindowProc_ wmKEYDOWN:mov al,r8b;wParam cmp al,VK_ESCAPE;user press 'Esc'? jne wmBYE wmDESTROY:invoke GdipDisposeImage,hBitmap invoke GdipDeleteGraphics,memGraphics ;уничтожить объект GDI+ mov ecx,gdiplusToken invoke GdiplusShutdown invoke RtlExitUserProcess,NULL ;------------------------------------------------------------ wmPAINT:invoke BeginPaint,hWnd, &ps invoke GdipCreateFromHDC,eax, &graphics invoke GdipSetSmoothingMode,graphics, SmoothingModeAntiAlias; Рисование со сглаживанием mov edi,180 @@: cvtsi2ss xmm1,edi invoke GdipRotateWorldTransform,graphics,, 1 cvtsi2ss xmm1,vdxClient divss xmm1,const2; (float)vdxClient/2.0 cvtsi2ss xmm2,vdyClient divss xmm2,const2;(float)vdyClient/2.0 invoke GdipTranslateWorldTransform,graphics,,,1 invoke GdipDrawImageI,graphics, smBitmap,0, 0 invoke GdipResetWorldTransform,graphics add edi,20 cmp edi,520 jb @b invoke GdipDeleteGraphics,graphics invoke EndPaint,hWnd, &ps jmp wmBYE wmCREATE:invoke GdipCreateFromHWND,hWnd, &graphics invoke GdipLoadImageFromFile,&FileName, &hBitmap invoke GdipCreateBitmapFromGraphics,130, 130, graphics, &smBitmap invoke GdipGetImageWidth,hBitmap, &nWidth invoke GdipGetImageHeight,hBitmap, &nHeight invoke GdipGetImageGraphicsContext,smBitmap, &memGraphics mov qword ptr[rsp+28h],122;40 ; x-size mov qword ptr[rsp+20h],130 ; y-size invoke GdipDrawImageRectI,memGraphics, hBitmap, 0, 0; x, y координаты верхней точки, куда поместим изображение invoke GdipDeleteGraphics,graphics jmp wmBYE wmSIZE: mov vdxClient,r9d and vdxClient,0FFFFh;vdxClient = LOWORD (lParam) ; shr r9d,16 mov vdyClient,r9d; vdyClient = HIWORD (lParam) ; invoke InvalidateRect,hWnd, NULL,TRUE wmBYE: leave ret WndProc endp ;--------------------------------------- .data ClassName db 'Вращаем изображением с помощью GDI+',0 gsi GdiplusStartupInput <1,0,0,0,0> FileName: du <Comecocos.png> const2 dd 2.0 .data? gdiplusToken dd ? ; memGraphics dq ? hBitmap dq ? vdxClient dd ? ; vdyClient dd ? ; nWidth dq ? nHeight dq ? smBitmap dq ? graphics dq ? end Во вложении asm/exe/cur/png-файлы
Вывод изображений в разных форматах с помощью GDI+Список форматов графических файлов, с которыми могут работать приложения GDI+ ФорматОписаниеbmp, dib, rleРастровые изображения (Device-Independent Bitmap)emfРасширенный формат (Windows Enhanced Metafile). Похож на WMF, но более эффективен, обеспечивает более высокое качество изображения и более быструю обработкуexifФормат для обмена файлами изображений (Exchangeable Image File).gifФормат обмена графическими изображениями (Graphics Interchange Format)icoЗначки Windowsjpg, jpeg, jpe, jfifФормат, созданный объединенной группой экспертов по обработке фотографий (Joint Photographic Experts Group). Растровый графический формат изображений и фотографий с высокой степенью сжатия. Поддерживает цвета с глубиной 24 бита. Используется для хранения фото и загрузки изображений в интернет. Изображения занимают мало места, сохраняя при этом высокое качество.pngФормат переносимых сетевых изображений (Portable Network Graphics). В отличие от JPEG, в PNG сжатие происходит без потерь — изображение сохраняет первоначальное качество даже после многократного редактирования или изменения размера. Особенности формата: возможность поддержки альфа-канала (прозрачности); многослойность; поддержка различных цветовых пространств, включая RGB и индексированный цвет, который позволяет хранить палитру цветов. Размер файла больше, чем в JPEGtiff, tifТеговый формат файлов изображений (Tag Image File Format)wmfМетафайл Windows (Windows metafile) Код (ASM): ; GUI # include win64a.inc cdXPos = 128 cdYPos = 128 cdXSize = 1170 cdYSize = 680 .code WinMain proc local msg:MSG ;инициализация библиотеки GDIPLUS invoke GdiplusStartup,&gdiplusToken,&gsi,0 xor ebx,ebx mov esi,IMAGE_BASE invoke LoadCursorFromFileA,"br_Rabbit3.cur" mov edi,offset ClassName push rax ;hIconSm push rdi ;lpszClassName push rbx ;lpszMenuName push COLOR_BTNFACE;hbrBackground push rax ;hCursor push rax ;hIcon push rsi ;hInstance push rbx ;cbClsExtra & cbWndExtra pushaddr WndProc ;lpfnWndProc push sizeof WNDCLASSEX;cbSize & style invoke RegisterClassExA,esp ;addr WNDCLASSEX push rbx push rsi ;rsi=400000h push rbx push rbx push cdYSize push cdXSize push cdYPos push cdXPos sub esp,20h invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE lea edi,msg @@: invoke GetMessageA,edi,NULL,0,0 invoke DispatchMessageA,edi jmp @b WinMain endp WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD local hGraphics:qword local hBrush:qword local hPen:dword local ps:PAINTSTRUCT mov hWnd,rcx cmp edx,WM_DESTROY je wmDESTROY cmp edx,WM_PAINT je wmPAINT cmp edx,WM_KEYDOWN je wmKEYDOWN cmp edx,WM_CREATE je wmCREATE leave jmp NtdllDefWindowProc_ wmKEYDOWN:mov al,r8b;wParam cmp al,VK_ESCAPE;user press 'Esc'? jne wmBYE wmDESTROY:invoke GdipDisposeImage,hBitmap1 invoke GdipDisposeImage,hBitmap2 invoke GdipDisposeImage,hBitmap3 mov ecx,gdiplusToken invoke GdiplusShutdown invoke RtlExitUserProcess,NULL ;------------------------------------------------------------ wmCREATE:invoke GdipLoadImageFromFile,&FileName1,&hBitmap1 invoke GdipLoadImageFromFile,&FileName2,&hBitmap2 invoke GdipLoadImageFromFile,&FileName3,&hBitmap3 jmp wmBYE wmPAINT:invoke BeginPaint,hWnd, &ps invoke GdipCreateFromHDC,eax,&graphics mov qword ptr[rsp+28h],cdYSize/2 mov qword ptr[rsp+20h],cdXSize invoke GdipDrawImageRectI,graphics,hBitmap1,0,0 mov r9d,cdYSize/2 mov qword ptr[rsp+28h],r9 mov qword ptr[rsp+20h],cdXSize/2 invoke GdipDrawImageRectI,graphics,hBitmap2,0 mov r8d,cdXSize/2 mov r9d,cdYSize/2 mov qword ptr[rsp+28h],r9 mov qword ptr[rsp+20h],r8 invoke GdipDrawImageRectI,graphics,hBitmap3 invoke GdipDeleteGraphics,graphics invoke EndPaint,hWnd, &ps wmBYE:leave ret WndProc endp ;--------------------------------------- .data ClassName db 'Вывод изображений с помощью GDI+',0 gsi GdiplusStartupInput <1,0,0,0,0> FileName1: du <Image1.jpg> FileName2: du <Image2.png> FileName3: du <Image3.bmp> .data? hBitmap1 dq ? hBitmap2 dq ? hBitmap3 dq ? gdiplusToken dd ? graphics dq ? end Во вложении asm/exe/cur/jpg/png/bmp-файлы
Мне вот интересно, "Введение в GDI+" количество просмотров: 851, "Примеры программирования на GDI+" 1912 просмотров. Судя по количеству скачиваний от 30 до 80. А кому-нибудь эти топики помогают осваивать GDI+?
Ну так. Лучше бы просто описание на русском для всех этих функций были по типу статей про файлы и память.
alex_dz, архив какой программы? Запустил ехе прямо из архива? Распаковать в какую-либо папку не пробовал?
Скорее всего помогают, спасибо! Я в свое время на старом васме все уроки прошёл прежде чем зарегаться на форуме. А когда начал закреплять освоенное разными поделками (скриншотер, ещё чего-то...), тада уже регался и выкладывал Такие уроки весьма полезны, особенно начинающим, ведь ассемблер это отправная точка всея коденга. Причём это отправная точка не только вверх но и вниз, к ещё более низкому уровню, но этот путь открывается не всем. Кстати ещё было бы полезным все все уроки оформить в PDF и/или MDX форматах для оффлайна.
Сейчас большинство браузеров могут сохранять страницы в PDF. А те что не могут пользуются печатью на виртуальный PDF принтер
Mikl___ > А кому-нибудь эти топики помогают осваивать GDI+? Мое скромное мнение - примеры весьма интересны, так как просты интерфейсы. Но это интерфейсы.. вызов их сорян за прямоту, корявый/вырвиглазный Не следует делать такое: Код (ASM): cmp edx,WM_CREATE je wmCREATE leave - кто как я протер до дыр как говорится отладчик и архитектурный сдм.. кто это знает не будет такой код читать, другим же он тяжелый для восприятия, не наглядный. В этом фишка скриптов, они наглядны и не нужно держать в уме массив меток Следует использовать разные макросы, условные конструкции, минимум машинных регистров в исходе и тп. Это же не разбор эксплойтов, где нужно показать необходимость той же leave. В целом же затея хорошая
Ahimov, Очень даже следует, важно оставлять простор. В процессе изучения это хорошее приглашение чтобы изменить код, поизучать макросы итд
Ahimov, Давайте создадим отдельный топик, где поделимся своими макросами, размышлением о том, какой код корявый и почему так писать не стоит. Мне кажется это заслуживает отдельной темы
Ahimov, старый стиль в стиле древнего бейсика, того самого с номерами строк и полным отсутствием структурности, процедурности. Хотя современные ассемблеры структурные(.if,.while,.for и тд) и процедурные(proc, вызов в стиле С) ЯП, особенно UASM.