Рисуем линии Код (ASM): ; GUI # include win64a.inc ColorsGreen equ 0FF00FF00h;прозрачный - красный - зеленый - синий ColorsBlack equ 0FF000000h ColorsYellow equ 0FFFFFF00h ColorsRed equ 0FFFF0000h UnitWorld equ 0 PenAlignmentCenter equ 0 PenAlignmentInset equ 1 LineCapRoundAnchor equ 12h LineCapArrowAnchor equ 14h LineJoinBevel equ 1 .code WinMain proc local msg:MSG ;инициализация библиотеки GDIPLUS invoke GdiplusStartup,&gdiplusToken,&gsi,0 xor ebx,ebx mov esi,IMAGE_BASE invoke LoadCursorFromFileA,&FileName mov edi,offset ClassName push rax ;hIconSm push rdi ;lpszClassName push rbx ;lpszMenuName push COLOR_WINDOW ;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 shl esi,9 ;rsi=CW_USEDEFAULT push rbx push rbx push 400 push 400 push rsi push rsi sub esp,20h invoke CreateWindowExA,WS_EX_TOOLWINDOW,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 leave jmp NtdllDefWindowProc_ wmDESTROY:;уничтожить перья invoke GdipDeletePen,nativePen invoke GdipDeletePen,blackPen invoke GdipDeletePen,greenPen invoke GdipDeletePath,path ;уничтожить объект GDI+ invoke GdipDeleteGraphics,graphics mov ecx,gdiplusToken invoke GdiplusShutdown invoke RtlExitUserProcess,NULL wmPAINT:invoke BeginPaint,hWnd,&ps ;зеленая линия invoke GdipDrawLineI,graphics,nativePen,40,40, 200, 100 ;x1,y1,x2,y2 ;"Странная" линия invoke GdipDrawLineI,graphics,greenPen,230,200,300,150 invoke GdipDrawLineI,graphics,blackPen,230,200,300,150 ;Прямоугольник с выравниванием линии по центру invoke GdipDrawRectangleI,graphics,greenPen,210,220,100,100 invoke GdipDrawRectangleI,graphics,blackPen,210,220,100,100 ;Прямоугольник с выравниванием линии по краю invoke GdipSetPenMode,greenPen,PenAlignmentInset invoke GdipDrawRectangleI,graphics,greenPen,250,250,100,100 invoke GdipDrawRectangleI,graphics,blackPen,250,250,100,100 ;Стрелка invoke GdipDrawLineI,graphics,hPen,12,92,60,80 ;Соединение линий invoke GdipAddPathLineI,path,10,200,100,200 invoke GdipAddPathLineI,path,100,200,100,300 invoke GdipAddPathLineI,path,100,300,150,300 invoke GdipSetPenLineJoin,hPen,LineJoinBevel invoke GdipDrawPath,graphics,hPen,path ;Прерывистая линия invoke GdipDrawLineI,graphics,hPen0,100,50,200,50 invoke GdipDrawLineI,graphics,hPen0,100,70,300,70 ;------------------------------------------------------------ invoke EndPaint,hWnd,&ps jmp wmBYE wmCREATE:invoke GdipCreateFromHWND,hWnd,&graphics ;------------------------------------------------------------ movd xmm1,EpaisseurStylo invoke GdipCreatePen1,0FF00FF00h,,0,&nativePen movd xmm1,wi1 invoke GdipCreatePen1,ColorsBlack,,UnitWorld,&blackPen movd xmm1,wi2 invoke GdipCreatePen1,ColorsGreen,,UnitWorld,&greenPen invoke GdipSetPenMode,greenPen,PenAlignmentCenter movd xmm1,wi3 invoke GdipCreatePen1,ColorsYellow,,UnitWorld,&hPen invoke GdipSetPenStartCap,hPen,LineCapRoundAnchor invoke GdipSetPenEndCap,hPen,LineCapArrowAnchor invoke GdipCreatePath,0,&path invoke GdipStartPathFigure,path movd xmm1,wi3 invoke GdipCreatePen1,ColorsRed,,UnitWorld,&hPen0 invoke GdipSetPenStartCap,hPen0,LineCapRoundAnchor invoke GdipSetPenEndCap,hPen0,LineCapArrowAnchor invoke GdipSetPenDashArray,hPen0,&dash,2 wmBYE: leave ret WndProc endp ;--------------------------------------- .data ClassName db 'GDI+ рисование линий',0 FileName db "br_Rabbit3.cur",0 gdiplusToken dd ? gsi GdiplusStartupInput <1,0,0,0,0> graphics dq ? nativePen dq ? blackPen dq ? greenPen dq ? hPen dq ? hPen0 dq ? path dq ? EpaisseurStylo REAL4 3.0;толщина пера в формате float wi1 real4 1.0 wi2 real4 10.0 wi3 real4 8.0 dash REAL4 1.0,0.5 end Во вложении asm/exe/cur-файлы
Рисуем круги, окружности и эллипсы Код (ASM): ; GUI # include win64a.inc ColorsGreen equ 0FF00FF00h .code WinMain proc local msg:MSG ;инициализация библиотеки GDIPLUS invoke GdiplusStartup,&gdiplusToken,&gsi,0 xor ebx,ebx mov esi,IMAGE_BASE invoke LoadCursorFromFileA,&FileName mov edi,offset ClassName push rax ;hIconSm push rdi ;lpszClassName push rbx ;lpszMenuName push COLOR_WINDOW;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 shl esi,9 ;rsi=CW_USEDEFAULT push rbx push rbx push 500 push 500 push rsi push rsi sub esp,20h invoke CreateWindowExA,WS_EX_TOOLWINDOW,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 leave jmp NtdllDefWindowProc_ wmDESTROY:;уничтожить путь invoke GdipDeletePath,path invoke GdipDeleteBrush,hBrush invoke GdipDeleteBrush,hBrush0 invoke GdipDeleteBrush,hBrush1 invoke GdipDeleteBrush,hBrush2 invoke GdipDeletePen,hPen ;уничтожить объект GDI+ invoke GdipDeleteGraphics,graphics mov ecx,gdiplusToken invoke GdiplusShutdown invoke RtlExitUserProcess,NULL wmPAINT:invoke BeginPaint,hWnd,&ps ;Нелинейный градиент - эллипс invoke GdipAddPathEllipseI,path,-150,-150,600,600 invoke GdipCreatePathGradientFromPath,path,&hBrush invoke GdipSetPathGradientCenterColor,hBrush,900000FFh invoke GdipFillRectangleI,graphics,hBrush,0,0,700,700 ;нарисовать закрашенную окружность invoke GdipFillEllipseI,graphics,hBrush0,50,138,200,200 invoke GdipFillEllipseI,graphics,hBrush1,173,138,200,200 invoke GdipFillEllipseI,graphics,hBrush2,108,59,200,200 ;нарисовать незакрашенную окружность invoke GdipDrawEllipseI,graphics,hPen,250,100,200,200 ;------------------------------------------------------------ invoke EndPaint,hWnd,&ps jmp wmBYE wmCREATE:invoke GdipCreateFromHWND,hWnd,&graphics ;------------------------------------------------------------ ;создать кисть invoke GdipCreateSolidFill,09000FFFFh,&hBrush0;голубой invoke GdipCreateSolidFill,090FFFF00h,&hBrush1;желтый invoke GdipCreateSolidFill,090FF00FFh,&hBrush2;малиновый ;создать перо movd xmm1,EpaisseurStylo;толщина пера в формате float invoke GdipCreatePen1,ColorsGreen,,0,&hPen; цвет пера invoke GdipCreatePath,0,&path wmBYE: leave ret WndProc endp ;--------------------------------------- .data ClassName db 'GDI+ рисование эллипсов',0 FileName db "br_Rabbit3.cur",0 gdiplusToken dd ? gsi GdiplusStartupInput <1,0,0,0,0> graphics dq ? EpaisseurStylo REAL4 6.0 path dq ? hPen dq ? hBrush dq ? hBrush0 dq ? hBrush1 dq ? hBrush2 dq ? end Во вложении asm/exe/cur-файлы
Полупрозрачное окно круглой формы Окно перемещается по рабочему столу, если нажать на него левой клавишей мыши. Правый клик внутрь окна -- это окно закроет. Код (ASM): ; GUI # include win64a.inc PixelFormat32bppPARGB = 0E200Bh AC_SRC_OVER = 0 AC_SRC_ALPHA = 1 .code WinMain proc local msg:MSG ;инициализация библиотеки GDIPLUS invoke GdiplusStartup,&gdiplusToken,&gsi,0 xor ebx,ebx mov esi,IMAGE_BASE invoke LoadCursorFromFileA,&FileName mov edi,offset ClassName push rax ;hIconSm push rdi ;lpszClassName push rbx ;lpszMenuName push COLOR_WINDOW ;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 600 push 600 push rbx push rbx sub esp,20h invoke CreateWindowExA,WS_EX_LAYERED,edi,edi,WS_POPUP or WS_VISIBLE ;WS_EX_LAYERED=80000h 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 hDC:HDC local memDC:HDC LOCAL hBmp:HBITMAP LOCAL OldBmp:HBITMAP LOCAL blend:BLENDFUNCTION LOCAL rect:RECT mov hWnd,rcx mov wParam,r8 mov lParam,r9 cmp edx,WM_DESTROY je wmDESTROY cmp edx,WM_CREATE je wmCREATE cmp edx,WM_RBUTTONDOWN je wmRBUTTONDOWN cmp edx,WM_LBUTTONDOWN je wmLBUTTONDOWN leave jmp NtdllDefWindowProc_ wmDESTROY:invoke ReleaseDC,hDC invoke GdipDisposeImage,bitmap0 ;уничтожить объект GDI+ mov ecx,gdiplusToken invoke GdiplusShutdown invoke RtlExitUserProcess,NULL wmLBUTTONDOWN:invoke SendMessageA,hWnd,WM_NCLBUTTONDOWN,HTCAPTION,lParam jmp wmLBUTTONUP wmRBUTTONDOWN:;invoke GetWindowLongPtrA,hWnd,GWL_EXSTYLE ; sub rax,WS_EX_LAYERED invoke SetWindowLongPtrA,hWnd,GWL_EXSTYLE,0 invoke SetLayeredWindowAttributes,hWnd,0,255,LWA_ALPHA invoke PostMessageA,hWnd,WM_CLOSE,0,0 jmp wmBYE wmCREATE:invoke GdipCreateBitmapFromFile,&pngfile,&bitmap0 invoke GetWindowRect,hWnd,&rect mov blend.BlendOp,AC_SRC_OVER mov blend.BlendFlags,0 mov blend.AlphaFormat,AC_SRC_ALPHA mov blend.SourceConstantAlpha, 255 invoke GetDC,0 mov hDC,rax wmLBUTTONUP: mov ecx,rect.right sub ecx,rect.left mov rect.right,ecx mov edx,rect.bottom sub edx,rect.top mov rect.bottom,edx lea eax,bitmap mov [rsp+28h],rax and qword ptr[rsp+20h],0 invoke GdipCreateBitmapFromScan0,,,0,PixelFormat32bppPARGB invoke GdipGetImageGraphicsContext,bitmap,&graphics invoke GdipDrawImage,graphics,bitmap0,0,0 mov ecx,rect.right mov edx,rect.bottom invoke GdipCreateBitmapFromGraphics,,,graphics,&bitmap10 invoke GdipCreateHBITMAPFromBitmap,bitmap,&hBmp,0 invoke CreateCompatibleDC,hDC mov memDC,rax invoke SelectObject,eax,hBmp mov OldBmp,rax mov qword ptr[rsp+40h],ULW_ALPHA lea eax,blend mov [rsp+38h],rax and qword ptr[rsp+30h],0 lea eax,ptZero mov [rsp+28h],rax mov rax,memDC mov [rsp+20h],rax invoke UpdateLayeredWindow,hWnd,0,&rect,&rect.right invoke DeleteObject,OldBmp invoke DeleteDC,memDC wmBYE: leave ret WndProc endp ;--------------------------------------- .data bitmap dq ? bitmap0 dq ? bitmap10 dq ? Hbitmap HBITMAP ? graphics dq ? ClassName db 'GDI+ полупрозрачный шар',0 FileName db "br_Rabbit3.cur",0 gdiplusToken dd ? gsi GdiplusStartupInput <1,0,0,0,0> pngfile: du <crystal-ball.png> ptZero POINT <> end Во вложении asm/exe/png/cur-файлы
GIF-анимация Код (ASM): ; GUI # include win64a.inc PropertyTagFrameDelay equ 5100h cdIdTimer equ 1 .code WinMain proc local msg:MSG ;инициализация библиотеки GDIPLUS invoke GdiplusStartup,&gdiplusToken,&gsi,0 xor ebx,ebx mov edi,offset ClassName invoke LoadCursorFromFileA,&FileName push rax ;hIconSm push rdi ;lpszClassName push rbx ;lpszMenuName push COLOR_WINDOWTEXT ;hbrBackground push rax ;hCursor push rax ;hIcon push IMAGE_BASE ;hInstance push rbx ;cbClsExtra & cbWndExtra pushaddr WndProc ;lpfnWndProc push sizeof WNDCLASSEX;cbSize & style invoke RegisterClassExA,esp ;addr WNDCLASSEX push rbx push IMAGE_BASE push rbx push rbx push rbx ; nHeight push rbx ; nWidth push 127; Y push 127; X sub esp,20h invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE lea edi,msg @@: invoke GetMessageA,edi,NULL,0,0 cmp msg.wParam,VK_ESCAPE;user press 'Esc'? je wmDESTROY invoke DispatchMessageA,edi jmp @b WinMain endp WndProc proc hWnd:qword,umsg:qword,wParam:qword,lParam:qword local graphics:qword local ptDiff:POINT local rctWnd:RECT local rctClient:RECT local tmp:qword local pDimensionIDs:qword local count:qword local ps:PAINTSTRUCT mov hWnd,rcx cmp edx,WM_DESTROY je wmDESTROY cmp edx,WM_CREATE je wmCREATE cmp edx,WM_SIZE je wmSIZE cmp edx,WM_PAINT je wmPAINT cmp edx,WM_TIMER je wmTIMER leave jmp NtdllDefWindowProc_ wmDESTROY::invoke KillTimer,hWnd,cdIdTimer invoke GdipDisposeImage,hImage invoke GdipFree,pPropertyItem invoke GdiplusShutdown,gdiplusToken invoke RtlExitUserProcess,NULL ;DrawFrameGIF--------------------- wmPAINT:invoke BeginPaint,hWnd,&ps invoke GdipCreateFromHDC,eax,&graphics mov eax,dword ptr vdyClient mov [rsp+28h],rax mov eax,dword ptr vdxClient mov [rsp+20h],rax invoke GdipDrawImageRectI,graphics,hImage,0,0 invoke GdipImageSelectActiveFrame,hImage,&pageGuid,nFramePosition inc nFramePosition mov eax,nFrameCount sub rax,nFramePosition jnz @f mov nFramePosition,rax ;------------------------------- @@: invoke GdipDeleteGraphics,graphics invoke EndPaint,hWnd,&ps jmp wmBYE wmTIMER:invoke InvalidateRect,hWnd,0,0 jmp wmBYE wmCREATE:; Загрузить картинку из файла invoke GdipLoadImageFromFile,&szfilename,&hImage ; Проверить количество пространств invoke GdipImageGetFrameDimensionsCount,hImage,&count mov rcx,count test ecx,ecx jz @f shl ecx,4 invoke GdipAlloc mov pDimensionIDs,rax ; Получить идентификатор первого пространства invoke GdipImageGetFrameDimensionsList,hImage,eax,count ; Получить количество кадров в первом пространстве invoke GdipImageGetFrameCount,hImage,pDimensionIDs,&nFrameCount ; Получить значение задержек между кадрами invoke GdipGetPropertyItemSize,hImage,PropertyTagFrameDelay,&tmp mov rcx,tmp shl ecx,2 invoke GdipAlloc mov pPropertyItem,rax invoke GdipGetPropertyItem,hImage,PropertyTagFrameDelay,tmp,eax invoke GdipFree,pDimensionIDs @@:;------------------------------------ invoke GdipGetImageWidth,hImage,&nWidth invoke GdipGetImageHeight,hImage,&nHeight invoke GetClientRect,hWnd,&rctClient invoke GetWindowRect,hWnd,&rctWnd mov eax,rctWnd.right sub eax,rctWnd.left sub eax,rctClient.right mov ptDiff.x,eax mov eax,rctWnd.bottom sub eax,rctWnd.top sub eax,rctClient.bottom mov ptDiff.y,eax mov qword ptr [rsp+28h],TRUE ; bRepaint mov ecx,nHeight add ecx,ptDiff.y mov [rsp+20h],rcx ;nHeight mov r9d,nWidth add r9d,ptDiff.x invoke MoveWindow,hWnd,127,127 invoke SetTimer,hWnd,cdIdTimer,tmp,0 jmp wmBYE wmSIZE: mov rax,r9;lParam mov vdxClient,ax shr eax,10h mov vdyClient,ax wmBYE: leave retn WndProc endp ;----------------------------------- .data ClassName db "GDI+ gif animation",0 FileName db "br_Rabbit3.cur",0 gsi GdiplusStartupInput <1,0,0,0,0> pageGuid GUID <6AEDBD6Dh,3FB5h,418Ah,<83h,0A6h,7Fh,45h,22h,9Dh,0C8h,72h>> szfilename: du <movie.gif> vdxClient dw 0,0 vdyClient dw 0,0 nFramePosition dq 0 .data? gdiplusToken dq ? nWidth dd ? nHeight dd ? nFrameCount dd ? pPropertyItem dq ? hImage dq ? end Во вложении asm/exe/gif/cur-файлы
Интересная на мой взгляд идея: нарисовать график функций для данных --- Сообщение объединено, 7 янв 2025 --- Для красоты весь график можно разделить на прямоугольники сплошными прерывистыми линиями --- Сообщение объединено, 7 янв 2025 --- Для каждого числа делается линия как на сортировках, длина линии = значение, потом линии стираются последние точки соединяются.
Вот вариант на fasm 1.73.32 первого туториала Код (ASM): format PE64 GUI 6.0 include "WIN64W.INC" ; include "EXTIMPORT.INC" ; ----------------------------------------------------------------- irpv library, v { purge v } irpv import, v { purge v } macro .import { purge .import macro .import \{\} section '.idata' import data readable writeable define __SECTION import } macro library [name] { common .import label import_data forward label name#.ref if defined name#.use dd RVA name#.adr, 0, 0, RVA name#.txt, RVA name#.aim end if common if $ > import_data dd 0, 0, 0, 0, 0 end if } macro import name, [deff] { common match lbl==txt, name \{ if definite lbl\#.ref label lbl\#.aim \} forward match lbl==txt, name \{ match aim==val, deff \\{ macro lbl\\#.\\#aim arg& \\\{ invoke lbl\\\#.\\\#aim\\\#.point, arg\\\} macro aim arg& \\\{ lbl\\\#.\\\#aim arg \\\} if used __imp__\\#aim label __imp__\\#aim qword at lbl\\\#.\\\#aim\\\#.point end if if used lbl\\#.\\#aim\\#.point label lbl\\#.\\#aim\\#.point qword if val eqtype '' dq RVA lbl\\#.\\#aim\\#.text else dq 0x8000000000000000 + val end if end if \\} \} common match lbl==txt, name \{ if $ > lbl\#.aim lbl\#.use dq 0 end if label lbl\#.adr \} forward match lbl==txt, name \{ match aim==val, deff \\{ if used lbl\\#.\\#aim\\#.point if val eqtype '' dq RVA lbl\\#.\\#aim\\#.text else dq 0x8000000000000000 + val end if end if \\} \} common match lbl==txt, name \{ if $ > lbl\#.adr dq 0 end if lbl\#.txt db txt, 0 \} forward match lbl==txt, name \{ match aim==val, deff \\{ if used lbl\\#.\\#aim\\#.point & val eqtype '' rb RVA $ and 1 lbl\\#.\\#aim\\#.text db 0, 0, val, 0 end if \\} \} common end if } ; ----------------------------------------------------------------- ; include "GDIPLUS.INC" ; ----------------------------------------------------------------- UnitWorld equ 0 PenAlignmentCenter equ 0 PenAlignmentInset equ 1 LineCapRoundAnchor equ 12h LineCapArrowAnchor equ 14h LineJoinBevel equ 1 struc GdiplusStartupInput ver=1,cbk=0,bkg=?,ext=?,inp=? { label . .GdiplusVersion dd ver,0 .DebugEventCallback dq cbk .SuppressBackgroundThread dd bkg .SuppressExternalCodecs dd ext .GdiplusStartupInput dq inp label .Length at $ - . } ; ----------------------------------------------------------------- library KERNEL32.DLL,USER32.DLL,GDIPLUS.DLL import KERNEL32.DLL = "KERNEL32.DLL",\ ExitProcess = "ExitProcess",\ GetLastError = "GetLastError",\ SetLastError = "SetLastError" import USER32.DLL = "USER32.DLL",\ BeginPaint = "BeginPaint",\ CreateWindowExW = "CreateWindowExW",\ DefWindowProcW = "DefWindowProcW",\ DispatchMessageW = "DispatchMessageW",\ EndPaint = "EndPaint",\ GetMessageW = "GetMessageW",\ LoadImage = "LoadImageW",\ PostQuitMessage = "PostQuitMessage",\ RegisterClassExW = "RegisterClassExW",\ TranslateMessage = "TranslateMessage" import GDIPLUS.DLL = "GDIPLUS.DLL",\ GdipAddPathLineI = "GdipAddPathLineI",\ GdipCreateFromHWND = "GdipCreateFromHWND",\ GdipCreatePath = "GdipCreatePath",\ GdipDeleteGraphics = "GdipDeleteGraphics",\ GdipCreatePen1 = "GdipCreatePen1",\ GdipDeletePath = "GdipDeletePath",\ GdipDeletePen = "GdipDeletePen",\ GdipDrawLineI = "GdipDrawLineI",\ GdipDrawPath = "GdipDrawPath",\ GdipDrawRectangleI = "GdipDrawRectangleI",\ GdipSetPenDashArray = "GdipSetPenDashArray",\ GdipSetPenLineJoin = "GdipSetPenLineJoin",\ GdipSetPenMode = "GdipSetPenMode",\ GdipSetPenEndCap = "GdipSetPenEndCap",\ GdipSetPenStartCap = "GdipSetPenStartCap",\ GdipStartPathFigure = "GdipStartPathFigure",\ GdiplusShutdown = "GdiplusShutdown",\ GdiplusStartup = "GdiplusStartup" section '.data' data readable writeable gsi GdiplusStartupInput 1,0,0,0,0 gdipDash dd 1.0,\ 0.5 nativePenWidth dd 3.0 blackPenWidth dd 1.0 greenPenWidth dd 10.0 hPenWidth dd 8.0 hPen0Width dd 10.0 szClassName du "GDI+ рисование линий",0 szFileName du "br_Rabbit3.cur",0 align 8 gdipGraphics rq 1 gdipPath rq 1 hPen0 rq 1 hPen rq 1 nativePen rq 1 blackPen rq 1 greenPen rq 1 gdiplusToken rd 1 virtual at 0 wce WNDCLASSEX label WNDCLASSEXW.Length end virtual section '.text' code readable executable label ImageBase at $ - $$ entry WinMain proc WinMain RegisterClassExW_SizeAndStyle = WNDCLASSEXW.Length or ((CS_HREDRAW or CS_VREDRAW or CS_GLOBALCLASS or CS_DBLCLKS) shl 32) local msg:MSG frame GdiplusStartup gdiplusToken, gsi, 0 LoadImage NULL, addr szFileName, IMAGE_CURSOR, LR_DEFAULTSIZE, LR_DEFAULTSIZE, LR_LOADFROMFILE or LR_SHARED RegisterClassExW addr rsp + 32, rdx, r8, r9, RegisterClassExW_SizeAndStyle,\ addr WndProc, NULL, addr ImageBase, rax, rax, COLOR_WINDOWFRAME+1,\ NULL, addr szClassName, rax CreateWindowExW WS_EX_TOOLWINDOW, addr szClassName, addr szClassName,\ WS_OVERLAPPEDWINDOW or WS_VISIBLE, 100, 100, 400, 400,\ NULL, NULL, addr ImageBase, NULL SetLastError NULL jmp .start @@: TranslateMessage addr msg DispatchMessageW addr msg .start: GetMessageW addr msg, NULL, NULL, NULL inc eax jz @f dec eax jnz @b mov eax, dword [msg.wParam] jmp .exit @@: GetLastError .exit: GdiplusShutdown [gdiplusToken] ExitProcess eax endf endp proc WndProc, hWnd:QWORD,uMsg:DWORD,wPar:QWORD,lPar:QWORD frame local ps:PAINTSTRUCT cmp edx, WM_PAINT jz .wm_paint cmp edx, WM_DESTROY jz .wm_destroy cmp edx, WM_CREATE jz .wm_create DefWindowProcW rcx, edx, r8, r9 jmp .quit .wm_create: GdipCreateFromHWND rcx, gdipGraphics GdipCreatePen1 0FF00FF00h, float [nativePenWidth], UnitWorld, addr nativePen GdipCreatePen1 0FF000000h, float [blackPenWidth], UnitWorld, addr blackPen GdipCreatePen1 0FF00FF00h, float [greenPenWidth], UnitWorld, addr greenPen GdipSetPenMode [greenPen], PenAlignmentCenter GdipCreatePen1 0FFFFFF00h, float [hPenWidth], UnitWorld, addr hPen GdipSetPenStartCap [hPen], LineCapRoundAnchor GdipSetPenEndCap [hPen], LineCapArrowAnchor GdipCreatePath 0, addr gdipPath GdipStartPathFigure [gdipPath] GdipCreatePen1 0FFFF0000h, float [hPen0Width], UnitWorld, addr hPen0 GdipSetPenStartCap [hPen0], LineCapRoundAnchor GdipSetPenEndCap [hPen0], LineCapArrowAnchor GdipSetPenDashArray [hPen0], addr gdipDash, 2 xor eax, eax jmp .quit .wm_destroy: GdipDeletePen [hPen0] GdipDeletePen [hPen] GdipDeletePen [greenPen] GdipDeletePen [blackPen] GdipDeletePen [nativePen] GdipDeletePath [gdipPath] GdipDeleteGraphics [gdipGraphics] PostQuitMessage NULL jmp .quit .wm_paint: mov [hWnd], rcx BeginPaint, [hWnd], addr ps ;зеленая линия GdipDrawLineI [gdipGraphics], [nativePen], 40, 40, 200, 100 ;x1,y1,x2,y2 ;"Странная" линия GdipDrawLineI [gdipGraphics], [greenPen], 230, 200, 300, 150 GdipDrawLineI [gdipGraphics], [blackPen], 230, 200, 300, 150 ;Прямоугольник с выравниванием линии по центру GdipDrawRectangleI [gdipGraphics], [greenPen], 210, 220, 100, 100 GdipDrawRectangleI [gdipGraphics], [blackPen], 210, 220, 100, 100 ;Прямоугольник с выравниванием линии по краю GdipSetPenMode [greenPen], PenAlignmentInset GdipDrawRectangleI [gdipGraphics], [greenPen], 250, 250, 100, 100 GdipDrawRectangleI [gdipGraphics], [blackPen], 250, 250, 100, 100 ;Стрелка GdipDrawLineI [gdipGraphics], [hPen], 12, 92, 60, 80 ;Соединение линий GdipAddPathLineI [gdipPath], 10, 200, 100, 200 GdipAddPathLineI [gdipPath], 100, 200, 100, 300 GdipAddPathLineI [gdipPath], 100, 300, 150, 300 GdipSetPenLineJoin [hPen], LineJoinBevel GdipDrawPath [gdipGraphics], [hPen], [gdipPath] ;Прерывистая линия GdipDrawLineI [gdipGraphics], [hPen0], 100, 50, 200, 50 GdipDrawLineI [gdipGraphics], [hPen0], 100, 70, 300, 70 ;------------------------------------------------------------ EndPaint, [hWnd], addr ps jmp .quit .quit: endf ret endp
Градиент Код (C): ; GUI # include win64a.inc WINDOWWIDTH equ 640 WINDOWHEIGHT equ 480 WINDOWWIDTHF equ 640.0 WINDOWHEIGHTF equ 480.0 RectF STRUCT Left REAL4 ? Top REAL4 ? Right REAL4 ? Bottom REAL4 ? RectF ENDS ;Various wrap modes for brushes WrapModeTile equ 0 WrapModeTileFlipX equ 1 WrapModeTileFlipY equ 2 WrapModeTileFlipXY equ 3 WrapModeClamp equ 4 ; LinearGradient Modes LinearGradientModeHorizontal equ 0 LinearGradientModeVertical equ 1 LinearGradientModeForwardDiagonal equ 2 LinearGradientModeBackwardDiagonal equ 3 equRed equ 0FFFF0000h equBlue equ 0FF0080FFh .code WinMain proc local msg:MSG ;инициализация библиотеки GDIPLUS invoke GdiplusStartup,&gdiplusToken,&gsi,0 xor ebx,ebx mov esi,IMAGE_BASE invoke LoadCursorFromFileA,&FileName mov edi,offset ClassName push rax ;hIconSm push rdi ;lpszClassName push rbx ;lpszMenuName push COLOR_WINDOW;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 shl esi,9 ;rsi=CW_USEDEFAULT push rbx push rbx push WINDOWHEIGHT push WINDOWWIDTH push rsi push rsi sub esp,20h invoke CreateWindowExA,WS_EX_TOOLWINDOW,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_SIZE je wmSIZE cmp edx,WM_MOUSEWHEEL je wmMOUSEWHEEL cmp edx,WM_LBUTTONDOWN je wmLBUTTONDOWN leave jmp NtdllDefWindowProc_ wmDESTROY: ;уничтожить объект GDI+ invoke GdipDeleteGraphics,graphics mov ecx,gdiplusToken invoke GdiplusShutdown invoke RtlExitUserProcess,NULL wmSIZE: invoke GetClientRect,hWnd,&rect cvtsi2ss xmm0,rect.Left movd rect.Left,xmm0 cvtsi2ss xmm0,rect.Top movd rect.Top,xmm0 cvtsi2ss xmm0,rect.Right movd rect.Right,xmm0 cvtsi2ss xmm0,rect.Bottom movd rect.Bottom,xmm0 invoke InvalidateRgn,hWnd,NULL,FALSE jmp wmBYE wmMOUSEWHEEL:mov eax,r8d shr eax,16 cmp ax,1000h;.if signed r8d > 0 jle @f add ChangeColor,0A050Fh or ChangeColor,0FF000000h jmp @1 @@: sub ChangeColor, 90305h or ChangeColor, 0FF000000h @1: invoke InvalidateRgn, rcx, NULL, FALSE jmp wmBYE wmLBUTTONDOWN:inc GradientMode and GradientMode,11y wmPAINT:invoke DrawGradient jmp wmBYE wmCREATE:invoke GdipCreateFromHWND,hWnd,&graphics ;------------------------------------------------------------ wmBYE: leave ret WndProc endp DrawGradient proc LOCAL hBrush:QWORD lea eax,hBrush mov [rsp+28h],rax mov qword ptr[rsp+20h],WrapModeTile invoke GdipCreateLineBrushFromRect,&rect,equRed,ChangeColor,GradientMode 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 GdipFillRectangle,graphics,hBrush invoke GdipDeleteBrush, hBrush leave ret DrawGradient endp ;--------------------------------------- .data ClassName db 'GDI+ градиент: [щелкаем левой кавишей мыши и вращаем колесико]',0 FileName db "br_Rabbit3.cur",0 gdiplusToken dd ? gsi GdiplusStartupInput <1,0,0,0,0> graphics dq ? GradientMode dq 0 ;how the gradient will look in the window ChangeColor dq equBlue rect RectF <0.0, 0.0, WINDOWWIDTHF, WINDOWHEIGHTF> ;icex INITCOMMONCONTROLSEX <sizeof INITCOMMONCONTROLSEX, ICC_ALL_CLASSES> hDC dq ? end Во вложении asm/exe/cur-файлы
Вывод на экран JPEG Код (ASM): ; GUI # include win64a.inc .code WinMain proc local msg:MSG ;инициализация библиотеки GDIPLUS invoke GdiplusStartup,&gdiplusToken,&gsi,0 xor ebx,ebx mov esi,IMAGE_BASE invoke LoadCursorFromFileA,&FileName mov edi,offset ClassName push rax ;hIconSm push rdi ;lpszClassName push rbx ;lpszMenuName push COLOR_WINDOW;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 shl esi,9 ;rsi=CW_USEDEFAULT push rbx push rbx push 600 push 800 push rsi push rsi sub esp,20h invoke CreateWindowExA,WS_EX_TOOLWINDOW,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 local hDC:HDC mov hWnd,rcx cmp edx,WM_DESTROY je wmDESTROY cmp edx,WM_CREATE je wmCREATE cmp edx,WM_PAINT je wmPAINT leave jmp NtdllDefWindowProc_ wmDESTROY:invoke GdipDisposeImage,hJPG ;уничтожить объект GDI+ invoke GdipDeleteGraphics,graphics mov ecx,gdiplusToken invoke GdiplusShutdown invoke RtlExitUserProcess,NULL wmPAINT:invoke BeginPaint,hWnd,&ps ;------------------------------------------------------------ invoke GdipDrawImageI,graphics,hJPG,0,0 invoke EndPaint,hWnd,&ps jmp wmBYE wmCREATE:invoke GdipCreateFromHWND,hWnd,&graphics ;------------------------------------------------------------ ;загрузить изображение из файла invoke GdipLoadImageFromFile,&jpegfile,&hJPG invoke GdipDrawImageI,graphics,hJPG,0,0 wmBYE: leave ret WndProc endp ;--------------------------------------- .data ClassName db 'GDI+ Image Resize',0 FileName db "br_Rabbit3.cur",0 gsi GdiplusStartupInput <1,0,0,0,0> jpegfile: du <Arenalv0.jpg> .data? gdiplusToken dd ? hJPG dq ? graphics dq ? end Во вложении asm/exe/jpg/cur-файлы
Рисуем мышью Код (ASM): ; GUI # include win64a.inc .code WinMain proc local msg:MSG ;инициализация библиотеки GDIPLUS invoke GdiplusStartup,&gdiplusToken,&gsi,0 xor ebx,ebx mov esi,IMAGE_BASE invoke LoadCursorFromFileA,&FileName mov edi,offset ClassName mov hCursor1,rax push rax ;hIconSm push rdi ;lpszClassName push rbx ;lpszMenuName push COLOR_WINDOW+1;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 shl esi,9 ;rsi=CW_USEDEFAULT push rbx push rbx push rsi push rsi push rsi push rsi sub esp,20h invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE lea edi,msg @@: invoke GetMessageA,edi,0,0,0 invoke DispatchMessageA,edi jmp @b WinMain endp WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD local ps:PAINTSTRUCT local hdc:HDC local X:dword local Y:dword mov hWnd,rcx cmp edx,WM_DESTROY je wmDESTROY cmp edx,WM_CREATE je wmCREATE cmp dx,WM_LBUTTONDOWN je wmLBUTTONDOWN cmp dx,WM_LBUTTONUP je wmLBUTTONUP cmp dx,WM_MOUSEMOVE je wmMOUSEMOVE leave jmp NtdllDefWindowProc_ wmDESTROY:;уничтожить объект GDI+ invoke GdipDeleteGraphics,graphics mov ecx,gdiplusToken invoke GdiplusShutdown invoke RtlExitUserProcess,NULL wmLBUTTONDOWN:;младшая часть lParam = x старшая часть lParam = y or doDraw,TRUE jmp wmBYE wmLBUTTONUP:and doDraw,FALSE invoke SetCursor,hCursor1 jmp wmBYE wmMOUSEMOVE:cmp doDraw,FALSE je wmBYE mov X,r9d and X,0FFFFh shr r9,16 mov Y,r9d invoke SetCursor,hCursor2 mov qword ptr[rsp+28h],10 mov qword ptr[rsp+20h],10 mov r9d,Y mov r8d,X invoke GdipFillEllipseI,graphics,hBrush jmp wmBYE wmCREATE:invoke GdipCreateFromHWND,hWnd,&graphics invoke GdipCreateSolidFill,0FFFF0000h,&hBrush;красный invoke LoadCursorA,0,32631;IDC_HAND mov hCursor2,rax wmBYE: leave retn WndProc endp ;--------------------------------------- .data ClassName db 'GDI+: Рисуем мышью',0 FileName db "br_Rabbit3.cur",0 gsi GdiplusStartupInput <1,0,0,0,0> doDraw db FALSE .data? gdiplusToken dd ? graphics dq ? hBrush dq ? hCursor1 dq ? hCursor2 dq ? end Во вложении asm/exe/cur-файлы
Надписи, прямоугольники, эллипсы, линии' Код (ASM): ; GUI # include win64a.inc RectF STRUCT Left REAL4 ? Top REAL4 ? Right REAL4 ? Bottom REAL4 ? RectF ENDS .code WinMain proc local msg:MSG ;инициализация библиотеки GDIPLUS invoke GdiplusStartup,&gdiplusToken,&gsi,0 xor ebx,ebx mov esi,IMAGE_BASE invoke LoadCursorFromFileA,&FileName mov edi,offset ClassName push rax ;hIconSm push rdi ;lpszClassName push rbx ;lpszMenuName push COLOR_WINDOW+1;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 shl esi,9 ;rsi=CW_USEDEFAULT push rbx push rbx push 400;rsi push 560;rsi push rsi push rsi sub esp,20h invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE lea edi,msg @@:invoke GetMessageA,edi,0,0,0 invoke DispatchMessageA,edi jmp @b WinMain endp WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD local ps:PAINTSTRUCT local hDC:HDC mov hWnd,rcx cmp edx,WM_DESTROY je wmDESTROY cmp edx,WM_CREATE je wmCREATE cmp edx,WM_PAINT je wmPAINT leave jmp NtdllDefWindowProc_ wmDESTROY:;уничтожить перо invoke GdipDeletePen,hPen ;уничтожить перо invoke GdipDeleteBrush,hBrush ;уничтожить шрифт invoke GdipDeleteFont,gpfont ;уничтожить объект GDI+ invoke GdipDeleteGraphics,graphics mov ecx,gdiplusToken invoke GdiplusShutdown invoke RtlExitUserProcess,NULL wmPAINT:invoke BeginPaint,hWnd,&ps mov hDC,rax invoke GdipCreateFontFromLogfont,eax,&logfont,&gpfont invoke GdipDrawString,graphics,&wphrase,-1,gpfont,&RectText,nativeFormat,hBrush invoke GdipDrawRectangleI,graphics,hPen, 10, 40, 200, 100 invoke GdipDrawEllipseI,graphics,hPen, 150, 120, 100, 130 xor edi,edi @@:mov r9d,edi add r9d,10 mov qword ptr [rsp+28h],r9 mov qword ptr [rsp+20h],500 invoke GdipDrawLineI,graphics,hPen,300 add edi,6 cmp edi,50*6 jb @b ;------------------------------------------------------------ invoke EndPaint,hWnd,&ps jmp wmBYE wmCREATE:invoke GdipCreateFromHWND,hWnd,&graphics movd xmm1,const3_0 invoke GdipCreatePen1,0FF00FF00h,,0,&hPen invoke GdipCreateSolidFill,0FF00C832h,&hBrush invoke CreateFontIndirect,&logfont mov hFont,rax invoke SendMessageA,hWnd,WM_SETFONT,rax,0 ;---------- prepare all can be possible for drawing here (WM_PAINT is faster as this) invoke GdipCreateStringFormat,0,LANG_NEUTRAL,&nativeFormat wmBYE: leave retn WndProc endp ;--------------------------------------- .data ClassName db 'GDI+: Надписи, прямоугольники, эллипсы, линии',0 FileName db "br_Rabbit3.cur",0 gsi GdiplusStartupInput <1,0,0,0,0> const3_0 REAL4 3.0;толщина пера в формате float logfont LOGFONT <36,12,0,0,400,0,0,0,0,0,0,0,DEFAULT_PITCH or FF_SCRIPT,"Helvetica"> RectText RectF <0.0,0.0,270.0,90.0> wphrase: du <hello, World> .data? gdiplusToken dd ? graphics dq ? gpfont dq ? hBrush dq ? hPen dq ? hFont dq ? nativeFormat dq ? end Во вложении asm/exe/cur-файлы