Примеры программирования на GDI+

Тема в разделе "WASM.GDI+", создана пользователем Mikl___, 7 янв 2025.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.863

    Рисование сплайнов в GDI+

    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. cdXPos          = 128
    4. cdYPos          = 128
    5. cdXSize         = 340
    6. cdYSize         = 290
    7. SmoothingModeAntiAlias = 4
    8. UnitPixel = 2; пиксели
    9. LineJoinMiter = 0;угловое соединение со скосом в 45°. Получается острый или обрезанный угол
    10. ;в зависимости от того, превышает ли длина среза ограничение по срезу
    11. PointF struct
    12. X dd ?
    13. Y dd ?
    14. PointF ends
    15. .code
    16. WinMain proc
    17. local msg:MSG
    18. ;инициализация библиотеки GDIPLUS
    19. invoke GdiplusStartup,&gdiplusToken,&gsi,0
    20. xor ebx,ebx
    21. mov esi,IMAGE_BASE
    22. invoke LoadCursorFromFileA,"br_Rabbit3.cur"
    23. mov edi,offset ClassName
    24. push rax    ;hIconSm
    25. push rdi    ;lpszClassName
    26. push rbx    ;lpszMenuName
    27. push COLOR_WINDOWTEXT;hbrBackground
    28. push rax    ;hCursor
    29. push rax       ;hIcon
    30. push rsi    ;hInstance
    31. push rbx       ;cbClsExtra & cbWndExtra
    32. pushaddr WndProc     ;lpfnWndProc
    33.       push sizeof WNDCLASSEX;cbSize & style
    34. invoke RegisterClassExA,esp ;addr WNDCLASSEX
    35. push rbx
    36. push rsi ;rsi=400000h
    37. push rbx
    38. push rbx
    39. push cdYSize
    40. push cdXSize
    41. push cdYPos
    42. push cdXPos
    43. sub esp,20h
    44.     invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    45.     lea edi,msg
    46. @@:    invoke GetMessageA,edi,NULL,0,0
    47. invoke DispatchMessageA,edi
    48.         jmp @b
    49. WinMain endp
    50. WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    51. local ps:PAINTSTRUCT
    52.       mov hWnd,rcx
    53.       cmp edx,WM_DESTROY
    54.       je wmDESTROY
    55.       cmp edx,WM_CREATE
    56.       je wmCREATE
    57.       cmp edx,WM_PAINT
    58.       je wmPAINT
    59.       cmp edx,WM_KEYDOWN
    60. je wmKEYDOWN
    61.         leave
    62.         jmp NtdllDefWindowProc_
    63. wmKEYDOWN:mov al,r8b;wParam
    64. cmp al,VK_ESCAPE;user press 'Esc'?
    65. jne wmBYE
    66. wmDESTROY:invoke GdipDeletePen,hPen
    67. invoke GdipDeleteBrush,hBrush
    68. ;уничтожить объект GDI+
    69. mov ecx,gdiplusToken
    70. invoke GdiplusShutdown
    71. invoke RtlExitUserProcess,NULL
    72. ;------------------------------------------------------------
    73. wmCREATE:;создать синее перо
    74. movd xmm1,const4
    75.         invoke GdipCreatePen1,0FF0000FFh,,UnitPixel,&hPen
    76.         invoke GdipSetPenLineJoin,hPen, LineJoinMiter
    77. ;создать красную кисть
    78.        invoke GdipCreateSolidFill,0FFFF0000h,&hBrush
    79.        jmp wmBYE
    80. wmPAINT:invoke BeginPaint,hWnd,&ps
    81.        invoke GdipCreateFromHDC,eax,&graphics
    82.        invoke GdipSetSmoothingMode,graphics, SmoothingModeAntiAlias;  Рисование со сглаживанием
    83.         invoke GdipDrawCurve,graphics, hPen, &mtPuntos[0*8], (sizeof mtPuntos)/(sizeof PointF);
    84.        xor edi,edi
    85. @@: mov eax,7
    86.        mov [rsp+28h],rax
    87.        mov [rsp+20h],rax
    88.        movd xmm0,mtPuntos[rdi*8].Y
    89.        subss xmm0,const3_5
    90.        cvtss2si r9d,xmm0
    91.        movd xmm0,mtPuntos[rdi*8].X
    92.        subss xmm0,const3_5
    93.        cvtss2si r8d,xmm0
    94.        invoke GdipFillEllipseI,graphics,hBrush
    95.        inc edi
    96.        cmp edi,(sizeof mtPuntos)/(sizeof PointF)
    97.        jb @b
    98.        invoke GdipDeleteGraphics,graphics
    99.        invoke EndPaint,hWnd,&ps
    100. wmBYE:  leave
    101.        ret
    102. WndProc endp
    103. ;---------------------------------------
    104. .data
    105. ClassName db 'Рисование сплайнов в GDI+',0
    106. gsi GdiplusStartupInput <1,0,0,0,0>
    107. mtPuntos PointF <145.0, 40.0>, <66.0, 170.0>, <205.0, 207.0>, <138.0, 62.0>, <187.0, 65.0>,
    108. <84.0, 218.0>,<34.0, 120.0>, <190.0, 234.0>, <125.0, 162.0>
    109. const4 dd 4.0
    110. const3_5 dd 3.5
    111. .data?
    112. hPen dq ?
    113. hBrush dq ?
    114. gdiplusToken dd ? ;
    115. graphics dq ?
    116. end
    Во вложении asm/exe/cur-файлы
     

    Вложения:

    MaKsIm и mantissa нравится это.
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.863

    Рисование сплайнов в GDI+

    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. cdXPos          = 128
    4. cdYPos          = 128
    5. cdXSize         = 340
    6. cdYSize         = 400
    7. SmoothingModeAntiAlias = 4
    8. UnitPixel = 2; пиксели
    9. LineJoinMiter = 0;угловое соединение со скосом в 45°. Получается острый или обрезанный угол
    10. ;в зависимости от того, превышает ли длина среза ограничение по срезу
    11. PointF struct
    12. X dd ?
    13. Y dd ?
    14. PointF ends
    15. .code
    16. WinMain proc
    17. local msg:MSG
    18. ;инициализация библиотеки GDIPLUS
    19.        invoke GdiplusStartup,&gdiplusToken,&gsi,0
    20.        xor ebx,ebx
    21.        mov esi,IMAGE_BASE
    22.        invoke LoadCursorFromFileA,"br_Rabbit3.cur"
    23.        mov edi,offset ClassName
    24.        push rax    ;hIconSm
    25.        push rdi    ;lpszClassName
    26.        push rbx    ;lpszMenuName
    27.        push COLOR_BTNFACE;hbrBackground
    28.        push rax    ;hCursor
    29.        push rax       ;hIcon
    30.        push rsi    ;hInstance
    31.        push rbx       ;cbClsExtra & cbWndExtra
    32.        pushaddr WndProc     ;lpfnWndProc
    33.       push sizeof WNDCLASSEX;cbSize & style
    34.        invoke RegisterClassExA,esp ;addr WNDCLASSEX
    35.        push rbx
    36.        push rsi ;rsi=400000h
    37.        push rbx
    38.        push rbx
    39.        push cdYSize
    40.        push cdXSize
    41.        push cdYPos
    42.        push cdXPos
    43.        sub esp,20h
    44.     invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    45.     lea edi,msg
    46. @@:    invoke GetMessageA,edi,NULL,0,0
    47.        invoke DispatchMessageA,edi
    48.         jmp @b
    49. WinMain endp
    50. WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    51. local ps:PAINTSTRUCT    
    52.       mov hWnd,rcx
    53.       cmp edx,WM_DESTROY
    54.       je wmDESTROY
    55.       cmp edx,WM_PAINT
    56.       je wmPAINT
    57.       cmp edx,WM_KEYDOWN
    58.        je wmKEYDOWN
    59.       cmp edx,WM_CREATE
    60.        je wmCREATE
    61.         leave
    62.         jmp NtdllDefWindowProc_
    63. wmKEYDOWN:mov al,r8b;wParam
    64.        cmp al,VK_ESCAPE;user press 'Esc'?
    65.        jne wmBYE
    66. wmDESTROY:invoke GdipDeletePen,hPen
    67. ;уничтожить объект GDI+
    68.        mov ecx,gdiplusToken
    69.        invoke GdiplusShutdown
    70.        invoke RtlExitUserProcess,NULL
    71. ;------------------------------------------------------------
    72. wmCREATE:movd xmm1,const4
    73.         invoke GdipCreatePen1,0FFFF0000h,,UnitPixel,&hPen
    74.         invoke GdipSetPenLineJoin,hPen,LineJoinMiter
    75.        jmp wmBYE
    76. wmPAINT:invoke BeginPaint,hWnd,&ps
    77.        invoke GdipCreateFromHDC,eax,&graphics
    78.        invoke GdipSetSmoothingMode,graphics,SmoothingModeAntiAlias; Рисование со сглаживанием
    79.         invoke GdipDrawCurve,graphics, hPen, &mtPuntos[0*8], (sizeof mtPuntos)/(sizeof PointF);
    80.        invoke GdipDeleteGraphics,graphics
    81.         invoke EndPaint,hWnd,&ps
    82. wmBYE:  leave
    83.         ret
    84. WndProc endp
    85. ;---------------------------------------
    86. .data
    87. ClassName db 'Рисование сплайнов в GDI+',0
    88. gsi GdiplusStartupInput <1,0,0,0,0>
    89. mtPuntos PointF <300.0, 40.0>, <100.0, 80.0>, <200.0, 120.0>, <50.0, 160.0>,
    90.        <90.0, 195.726405817773>, <100.0, 113.562336350022>,<110.0, 180.236093561674>, <120.0, 183.205669204542>,
    91.        <130.0, 147.408057803263>, <140.0, 179.066485842909>,<150.0, 296.488263212844>, <160.0, 295.763813340541>,
    92.        <170.0, 330.941617453638>, <180.0, 112.155812175893>,<190.0, 306.762179445474>, <200.0, 55.8951339964604>,
    93.        <210.0, 230.641779238024>, <220.0, 17.4446966322051>
    94. const4 dd 4.0
    95. .data?
    96. hPen dq ?
    97. gdiplusToken dd ? ;
    98. graphics dq ?
    99. end
    Во вложении asm/exe/cur-файлы
     

    Вложения:

    MaKsIm нравится это.
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.863

    Рисование сплайнов и анимация в GDI+

    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. cdXPos          = 128
    4. cdYPos          = 128
    5. IDT_TIMER1 = 1000
    6. WINDOWWIDTH = 380
    7. WINDOWHEIGHT = 400
    8. SmoothingModeAntiAlias = 4
    9. UnitPixel = 2; пиксели
    10. LineJoinMiter = 0;угловое соединение со скосом в 45°. Получается острый или обрезанный угол
    11. ;в зависимости от того, превышает ли длина среза ограничение по срезу
    12. StringAlignmentFar = 2
    13. FontStyleBold = 1
    14. RectF STRUCT
    15.        Left   dd ?
    16.        Top    dd ?
    17.        Right  dd ?
    18.        Bottom dd ?
    19. RectF ENDS
    20. PointF STRUCT
    21.        x dd ?
    22.        y dd ?
    23. PointF ENDS
    24. .code
    25. WinMain proc
    26. local msg:MSG          
    27. ;инициализация библиотеки GDIPLUS
    28.        invoke GdiplusStartup,&hGDIplus,&GdiPlusSI,0
    29.        xor ebx,ebx
    30.        mov esi,IMAGE_BASE
    31.        invoke LoadCursorFromFileA,"br_Rabbit3.cur"
    32.        mov edi,offset ClassName
    33.        push rax    ;hIconSm
    34.        push rdi    ;lpszClassName
    35.        push rbx    ;lpszMenuName
    36.        push COLOR_BTNFACE;hbrBackground
    37.        push rax    ;hCursor
    38.        push rax       ;hIcon
    39.        push rsi    ;hInstance
    40.        push rbx       ;cbClsExtra & cbWndExtra
    41.        pushaddr WndProc     ;lpfnWndProc
    42.       mov rax,((CS_OWNDC or CS_HREDRAW or CS_VREDRAW)shl 32)+sizeof WNDCLASSEX
    43.        push rax       ;cbSize & style
    44.        invoke RegisterClassExA,esp ;addr WNDCLASSEX
    45.        push rbx
    46.        push rsi ;rsi=400000h
    47.        push rbx
    48.        push rbx
    49.        push WINDOWHEIGHT
    50.        push WINDOWWIDTH
    51.        push cdYPos
    52.        push cdXPos
    53.        sub esp,20h
    54.     invoke CreateWindowExA,0,edi,edi,WS_CAPTION or WS_SYSMENU or WS_VISIBLE
    55.     lea edi,msg
    56. @@:    invoke GetMessageA,edi,NULL,0,0
    57.        invoke DispatchMessageA,edi
    58.         jmp @b
    59. WinMain endp
    60. WndProc proc <12> hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    61. local ps:PAINTSTRUCT
    62.       mov hWnd,rcx
    63.       cmp edx,WM_DESTROY
    64.       je wmDESTROY
    65.       cmp edx,WM_PAINT
    66.       je wmPAINT
    67.       cmp edx,WM_KEYDOWN
    68.        je wmKEYDOWN
    69.       cmp edx,WM_CREATE
    70.        je wmCREATE
    71.       cmp edx,WM_ERASEBKGND
    72.        je wmERASEBKGND
    73.         leave
    74.         jmp NtdllDefWindowProc_
    75. wmKEYDOWN:mov al,r8b;wParam
    76.        cmp al,VK_ESCAPE;user press 'Esc'?
    77.        jne wmBYE
    78. wmDESTROY:invoke GdipDeleteFont,hFont
    79.        invoke  GdipDeleteStringFormat,hStringFormat
    80.        invoke  GdipDeleteBrush,hBrush
    81.        invoke  GdipDeletePen,hPen
    82.        invoke  GdipDeleteGraphics,memGraphics
    83.        invoke  GdipDisposeImage,hBitmap
    84.        invoke  GdipDeleteGraphics,hGraphics
    85.        invoke  ReleaseDC,hWnd,hDC
    86.        mov ecx,hGDIplus
    87.        invoke GdiplusShutdown
    88.        invoke RtlExitUserProcess,NULL
    89. ;------------------------------------------------------------
    90. wmERASEBKGND:mov eax,TRUE
    91.        jmp wmBYE
    92. wmCREATE:invoke GetDC,hWnd
    93.        mov hDC,rax
    94.        invoke GdipCreateFromHDC,eax,&hGraphics
    95.        invoke  GdipCreateBitmapFromGraphics,400,400,hGraphics,&hBitmap
    96.        invoke  GdipGetImageGraphicsContext,hBitmap,&memGraphics
    97.        invoke  GdipSetSmoothingMode,memGraphics,SmoothingModeAntiAlias
    98.        movd xmm1,penWidth
    99.        invoke  GdipCreatePen1,0FFFF0000h,,UnitPixel,&hPen
    100.        invoke  GdipSetPenLineJoin,hPen,LineJoinMiter
    101.        invoke  GdipCreateSolidFill,0FF0000FFh,&hBrush
    102.        invoke  GdipCreateStringFormat, NULL, NULL,&hStringFormat
    103.        invoke  GdipSetStringFormatAlign,hStringFormat,StringAlignmentFar
    104.        invoke  GdipSetStringFormatLineAlign,hStringFormat,StringAlignmentFar
    105.        invoke  GdipCreateFontFamilyFromName,&szFontName,0,&hFontFamily
    106.        movr qword ptr[rsp+20h],hFont
    107.        movd xmm1,emSize
    108.        invoke  GdipCreateFont,hFontFamily,,FontStyleBold,2
    109.        invoke  GdipDeleteFontFamily,hFontFamily
    110. ;Set up our frames-per-second counter.
    111.        invoke  QueryPerformanceFrequency,&perfcnt
    112.        movq xmm0,const1
    113.        cvtsi2sd xmm1,perfcnt
    114.        divsd xmm0,xmm1
    115.        movq timefactor,xmm0
    116.        invoke  QueryPerformanceCounter,&lasttime
    117.        cvtsi2sd xmm0,lasttime
    118.        movq lasttime,xmm0
    119.        jmp wmBYE
    120. wmPAINT:mov eax,animation_counter
    121.        cmp     eax,34*4
    122.        jnb @f
    123.        add     eax, 4
    124.        jmp @0
    125. @@: xor eax,eax
    126. @0: mov     animation_counter,eax
    127.        lea     eax,pPoint
    128.        add     eax,animation_counter
    129.        mov     ecx,[rax].PointF.x
    130.        xchg    ecx,[rax].PointF.y
    131.        mov     [rax].PointF.x,ecx
    132. ;----------------------------------------------------------
    133.        or edx,-1
    134.        invoke GdipGraphicsClear,memGraphics
    135.        invoke  GdipSetPenColor,hPen,0FFFF00FFh
    136.        movd xmm1,rectWidth
    137.        invoke  GdipSetPenWidth,hPen
    138.        mov eax,myRectangle.Bottom
    139.        mov [rsp+28h],rax
    140.        mov eax,myRectangle.Right
    141.        mov [rsp+20h],rax
    142.        movd xmm3,myRectangle.Top
    143.        movd xmm2,myRectangle.Left
    144.        invoke  GdipDrawRectangle,memGraphics,hPen
    145.        invoke  GdipSetPenColor,hPen,0FF008000h
    146.        invoke  GdipDrawCurve,memGraphics,hPen,&pPoint,18
    147.        invoke  GdipSetPenColor,hPen,0FFFF0000h
    148.        movd xmm1,penWidth
    149.        invoke  GdipSetPenWidth,hPen
    150.        invoke  GdipDrawLines,memGraphics,hPen,&pPoint,18
    151.        mov eax,rect.Bottom
    152.        mov [rsp+28h],rax
    153.        mov eax,rect.Right
    154.        mov [rsp+20h],rax
    155.        movd xmm3,rect.Top
    156.        movd xmm2,rect.Left
    157.        invoke  GdipDrawRectangle,memGraphics,hPen
    158. ;update FPS counter
    159.        invoke  QueryPerformanceCounter,&curtime ;Read performance counter
    160.        cvtsi2sd xmm0,curtime;fild    curtime
    161.        movq curtime,xmm0;fstp    curtime
    162.        movq xmm1,xmm0
    163.        subsd xmm0,lasttime
    164.        mulsd xmm0,timefactor
    165.        movq timespan,xmm0
    166.        addsd xmm0,timer
    167.        movq timer,xmm0
    168. ;scale time value and save : time_span=(cur_time-last_time)*time_factor
    169. ;save new time reading for next pass through the loop
    170.        movq lasttime,xmm1
    171.        fninit
    172.        fld timer
    173.      fld1    ;fldd    0.50
    174.      fxch
    175.      fcomip  st(0),st(1)
    176.      jbe     no_fps_yet
    177.        and timer,0
    178.        movq xmm0,const1
    179.        divsd xmm0,timespan
    180.        movq fps,xmm0
    181. no_fps_yet:invoke sprintf,&szBuffer,"  FPS: %4.3f     ",fps
    182.        mov qword ptr[rsp+28h],255
    183.        movr qword ptr[rsp+20h],uszBuffer
    184.        invoke  MultiByteToWideChar,CP_OEMCP,MB_PRECOMPOSED,&szBuffer, -1
    185.        mov rax,hBrush
    186.        mov [rsp+30h],rax
    187.        mov rax,hStringFormat
    188.        mov [rsp+28h],rax
    189.        movr qword ptr[rsp+20h],rect
    190.        invoke  GdipDrawString,memGraphics,&uszBuffer,20,hFont
    191.        mov qword ptr[rsp+40h],2
    192.        mov eax,400
    193.        mov [rsp+38h],rax
    194.        mov [rsp+30h],rax
    195.        xor r8,r8
    196.        mov [rsp+28h],r8
    197.        mov [rsp+20h],r8
    198.        invoke  GdipDrawImagePointRectI,hGraphics,hBitmap,,0
    199. wmBYE:  leave
    200.         ret
    201. WndProc endp
    202. ;---------------------------------------
    203. .data
    204. ClassName db 'GDI+ Splines, Lines, DoubleBuffer',0
    205. GdiPlusSI GdiplusStartupInput <1,0,0,0,0>
    206. perfcnt dq 0.0
    207.   timefactor dq 1.0 ;Time Scaling Factor
    208.   lasttime dq 1.0 ;Previous timer value
    209.   curtime dq 0   ;current timer value
    210.   timespan dq 1.0 ;time elapsed since last frame
    211.   fps dq 1.0 ;frames per second
    212.   timer dq 1.0 ;accumulate timespan until one second has passed
    213.   penWidth     dd 0.2
    214.   rectWidth     dd 3.0
    215.  const1     dq 1.0
    216.   animation_counter dd 0
    217.   emSize     dd 14.0
    218.   align 8
    219.   myRectangle RectF <10.0, 10.0, 350.0, 350.0>
    220.   rect       RectF <10.0, 10.0, 350.0, 350.0>
    221.   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>,
    222. <110.0, 180.236093561674>,<120.0, 183.205669204542>,<130.0, 147.408057803263>,<140.0, 179.066485842909>,
    223. <150.0, 296.488263212844>,<160.0, 295.763813340541>,<170.0, 330.941617453638>,<180.0, 112.155812175893>,
    224. <190.0, 306.762179445474>,<200.0, 55.8951339964604>,<210.0, 230.641779238024>,<220.0, 17.4446966322051>
    225. align 2
    226. szFontName: du <Tahoma>
    227. .data?
    228. szBuffer db 128 dup(?)
    229. uszBuffer db 128 dup(?)
    230. hDC dq ?
    231. hGDIplus dd ?
    232. hGraphics dq ?
    233. hBrush dq ?
    234. hPath dq ?
    235. memGraphics dq ?
    236. hBitmap dq ?
    237. hPen dq ?
    238. hFont dq ?
    239. hFontFamily dq ?
    240. hStringFormat dq ?
    241. end
    Во вложении asm/exe/cur-файлы
     

    Вложения:

    MaKsIm и mantissa нравится это.
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.863

    Изменение размера и поворот изображения с помощью GDI+

    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. cdXPos          = 128
    4. cdYPos          = 128
    5. cdXSize         = 450
    6. cdYSize         = 300
    7. WrapModeTile = 0
    8. SmoothingModeAntiAlias = 5
    9. MatrixOrderPrepend = 0
    10. MatrixOrderAppend = 1
    11. .code
    12. WinMain proc
    13. local msg:MSG
    14. ;инициализация библиотеки GDIPLUS
    15.      invoke GdiplusStartup,&gdiplusToken,&gsi,0
    16.      xor ebx,ebx
    17.      mov esi,IMAGE_BASE
    18.      invoke LoadCursorFromFileA,"br_Rabbit3.cur"
    19.      mov edi,offset ClassName
    20.      push rax    ;hIconSm
    21.      push rdi    ;lpszClassName
    22.      push rbx    ;lpszMenuName
    23.      push COLOR_BTNFACE;hbrBackground
    24.      push rax    ;hCursor
    25.      push rax        ;hIcon
    26.      push rsi    ;hInstance
    27.      push rbx        ;cbClsExtra & cbWndExtra
    28.      pushaddr WndProc   ;lpfnWndProc
    29.      push sizeof WNDCLASSEX;cbSize & style
    30.      invoke RegisterClassExA,esp ;addr WNDCLASSEX
    31.      push rbx
    32.      push rsi    ;rsi=400000h
    33.      push rbx
    34.      push rbx
    35.      push cdYSize
    36.      push cdXSize
    37.      push cdYPos
    38.      push cdXPos
    39.      sub esp,20h
    40.     invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    41.     lea edi,msg
    42. @@:    invoke GetMessageA,edi,NULL,0,0
    43.      invoke DispatchMessageA,edi
    44.      jmp @b
    45. WinMain endp
    46. WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    47. local ps:PAINTSTRUCT  
    48.       mov hWnd,rcx
    49.       cmp edx,WM_DESTROY
    50.       je wmDESTROY
    51.       cmp edx,WM_SIZE
    52.       je wmSIZE
    53.       cmp edx,WM_PAINT
    54.       je wmPAINT
    55.       cmp edx,WM_KEYDOWN
    56.      je wmKEYDOWN
    57.       cmp edx,WM_CREATE
    58.      je wmCREATE
    59.         leave
    60.         jmp NtdllDefWindowProc_
    61. wmKEYDOWN:mov al,r8b;wParam
    62.      cmp al,VK_ESCAPE;user press 'Esc'?
    63.      jne wmBYE
    64. wmDESTROY:invoke GdipDisposeImage,hBitmap
    65.      invoke GdipDeleteGraphics,memGraphics
    66. ;уничтожить объект GDI+
    67.      mov ecx,gdiplusToken
    68.      invoke GdiplusShutdown
    69.      invoke RtlExitUserProcess,NULL
    70. ;------------------------------------------------------------
    71. wmPAINT:invoke BeginPaint,hWnd, &ps
    72.      invoke GdipCreateFromHDC,eax, &graphics
    73.      invoke GdipSetSmoothingMode,graphics, SmoothingModeAntiAlias;  Рисование со сглаживанием
    74.      movd xmm1,const112
    75.      invoke GdipRotateWorldTransform,graphics,,MatrixOrderAppend
    76.      cvtsi2ss xmm1,vdxClient
    77.      divss xmm1,const2; (float)vdxClient/2.0
    78.      cvtsi2ss xmm2,vdyClient
    79.      divss xmm2,const2;(float)vdyClient/2.0
    80.      invoke GdipTranslateWorldTransform,graphics,,,MatrixOrderAppend
    81.      invoke GdipDrawImageI,graphics, smBitmap,0, 0
    82.      invoke GdipResetWorldTransform,graphics
    83.      invoke GdipDeleteGraphics,graphics
    84.      invoke EndPaint,hWnd, &ps
    85.      jmp wmBYE
    86. wmCREATE:invoke GdipCreateFromHWND,hWnd, &graphics
    87.      invoke GdipLoadImageFromFile,&FileName, &hBitmap
    88.      invoke GdipCreateBitmapFromGraphics,130, 130, graphics, &smBitmap
    89.      invoke GdipGetImageWidth,hBitmap, &nWidth
    90.      invoke GdipGetImageHeight,hBitmap, &nHeight
    91.      invoke GdipGetImageGraphicsContext,smBitmap, &memGraphics
    92.      mov qword ptr[rsp+28h],122;40 ; x-size
    93.      mov qword ptr[rsp+20h],130 ; y-size
    94.      invoke GdipDrawImageRectI,memGraphics, hBitmap, 0, 0; x, y координаты верхней точки, куда поместим изображение
    95.      invoke GdipDeleteGraphics,graphics
    96.      jmp wmBYE
    97. wmSIZE: mov vdxClient,r9d
    98.      and vdxClient,0FFFFh;vdxClient = LOWORD (lParam) ;
    99.      shr r9d,16
    100.      mov vdyClient,r9d; vdyClient = HIWORD (lParam) ;
    101.      invoke InvalidateRect,hWnd, NULL,TRUE
    102. wmBYE:  leave
    103.      ret
    104. WndProc endp
    105. ;---------------------------------------
    106. .data
    107. ClassName db 'Поворачиваем изображение с помощью GDI+',0
    108. gsi GdiplusStartupInput <1,0,0,0,0>
    109. FileName: du <Comecocos.png>
    110. const2 dd 2.0
    111. const112 dd 112.0
    112. .data?
    113. gdiplusToken dd ? ;
    114. memGraphics dq ?
    115. hBitmap dq ?
    116. vdxClient dd ? ;
    117. vdyClient dd ? ;
    118. nWidth dq ?
    119. nHeight dq ?
    120. smBitmap dq ?
    121. graphics dq ?
    122. end
    Во вложении asm/exe/cur/png-файлы
     

    Вложения:

    • GDIPlusWC01.png
      GDIPlusWC01.png
      Размер файла:
      18,1 КБ
      Просмотров:
      176
    • GDIPlusM6415.zip
      Размер файла:
      38,2 КБ
      Просмотров:
      63
    MaKsIm нравится это.
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.863

    Вращаем изображением с помощью GDI+

    Используется png-файл с прозрачным фоном
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. cdXPos          = 128
    4. cdYPos          = 128
    5. cdXSize         = 450
    6. cdYSize         = 350
    7. WrapModeTile = 0
    8. SmoothingModeAntiAlias = 5
    9. .code
    10. WinMain proc
    11. local msg:MSG
    12. ;инициализация библиотеки GDIPLUS
    13.        invoke GdiplusStartup,&gdiplusToken,&gsi,0
    14.        xor ebx,ebx
    15.        mov esi,IMAGE_BASE
    16.        invoke LoadCursorFromFileA,"br_Rabbit3.cur"
    17.        mov edi,offset ClassName
    18.        push rax    ;hIconSm
    19.        push rdi    ;lpszClassName
    20.        push rbx    ;lpszMenuName
    21.        push COLOR_BTNFACE;hbrBackground
    22.        push rax    ;hCursor
    23.        push rax        ;hIcon
    24.        push rsi    ;hInstance
    25.        push rbx        ;cbClsExtra & cbWndExtra
    26.        pushaddr WndProc   ;lpfnWndProc
    27.        push sizeof WNDCLASSEX;cbSize & style
    28.        invoke RegisterClassExA,esp ;addr WNDCLASSEX
    29.        push rbx
    30.        push rsi    ;rsi=400000h
    31.        push rbx
    32.        push rbx
    33.        push cdYSize
    34.        push cdXSize
    35.        push cdYPos
    36.        push cdXPos
    37.        sub esp,20h
    38.     invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    39.     lea edi,msg
    40. @@:    invoke GetMessageA,edi,NULL,0,0
    41.        invoke DispatchMessageA,edi
    42.         jmp @b
    43. WinMain endp
    44. WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    45. local ps:PAINTSTRUCT  
    46.       mov hWnd,rcx
    47.       cmp edx,WM_DESTROY
    48.       je wmDESTROY
    49.       cmp edx,WM_SIZE
    50.       je wmSIZE
    51.       cmp edx,WM_PAINT
    52.       je wmPAINT
    53.       cmp edx,WM_KEYDOWN
    54.        je wmKEYDOWN
    55.       cmp edx,WM_CREATE
    56.        je wmCREATE
    57.         leave
    58.         jmp NtdllDefWindowProc_
    59. wmKEYDOWN:mov al,r8b;wParam
    60.        cmp al,VK_ESCAPE;user press 'Esc'?
    61.        jne wmBYE
    62. wmDESTROY:invoke GdipDisposeImage,hBitmap
    63.        invoke GdipDeleteGraphics,memGraphics
    64. ;уничтожить объект GDI+
    65.        mov ecx,gdiplusToken
    66.        invoke GdiplusShutdown
    67.        invoke RtlExitUserProcess,NULL
    68. ;------------------------------------------------------------
    69. wmPAINT:invoke BeginPaint,hWnd, &ps
    70.        invoke GdipCreateFromHDC,eax, &graphics
    71.        invoke GdipSetSmoothingMode,graphics, SmoothingModeAntiAlias;  Рисование со сглаживанием
    72.        mov edi,180
    73. @@: cvtsi2ss xmm1,edi
    74.        invoke GdipRotateWorldTransform,graphics,, 1
    75.        cvtsi2ss xmm1,vdxClient
    76.        divss xmm1,const2; (float)vdxClient/2.0
    77.        cvtsi2ss xmm2,vdyClient
    78.        divss xmm2,const2;(float)vdyClient/2.0
    79.        invoke GdipTranslateWorldTransform,graphics,,,1
    80.        invoke GdipDrawImageI,graphics, smBitmap,0, 0
    81.        invoke GdipResetWorldTransform,graphics
    82.        add edi,20
    83.        cmp edi,520
    84.        jb @b
    85.        invoke GdipDeleteGraphics,graphics
    86.        invoke EndPaint,hWnd, &ps
    87.        jmp wmBYE
    88. wmCREATE:invoke GdipCreateFromHWND,hWnd, &graphics
    89.        invoke GdipLoadImageFromFile,&FileName, &hBitmap
    90.        invoke GdipCreateBitmapFromGraphics,130, 130, graphics, &smBitmap
    91.        invoke GdipGetImageWidth,hBitmap, &nWidth
    92.        invoke GdipGetImageHeight,hBitmap, &nHeight
    93.        invoke GdipGetImageGraphicsContext,smBitmap, &memGraphics
    94.        mov qword ptr[rsp+28h],122;40 ; x-size
    95.        mov qword ptr[rsp+20h],130 ; y-size
    96.        invoke GdipDrawImageRectI,memGraphics, hBitmap, 0, 0; x, y координаты верхней точки, куда поместим изображение
    97.        invoke GdipDeleteGraphics,graphics
    98.        jmp wmBYE
    99. wmSIZE: mov vdxClient,r9d
    100.        and vdxClient,0FFFFh;vdxClient = LOWORD (lParam) ;
    101.         shr r9d,16
    102.        mov vdyClient,r9d; vdyClient = HIWORD (lParam) ;
    103.        invoke InvalidateRect,hWnd, NULL,TRUE
    104. wmBYE:  leave
    105.         ret
    106. WndProc endp
    107. ;---------------------------------------
    108. .data
    109. ClassName db 'Вращаем изображением с помощью GDI+',0
    110. gsi GdiplusStartupInput <1,0,0,0,0>
    111. FileName: du <Comecocos.png>
    112. const2 dd 2.0
    113. .data?
    114. gdiplusToken dd ? ;
    115. memGraphics dq ?
    116. hBitmap dq ?
    117. vdxClient dd ? ;
    118. vdyClient dd ? ;
    119. nWidth dq ?
    120. nHeight dq ?
    121. smBitmap dq ?
    122. graphics dq ?
    123. end
    Во вложении asm/exe/cur/png-файлы
     

    Вложения:

    MaKsIm нравится это.
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.863

    Вывод изображений в разных форматах с помощью GDI+

    Список форматов графических файлов, с которыми могут работать приложения GDI+
    ФорматОписание
    bmp, dib, rleРастровые изображения (Device-Independent Bitmap)
    emfРасширенный формат (Windows Enhanced Metafile). Похож на WMF, но более эффективен, обеспечивает более высокое качество изображения и более быструю обработку
    exifФормат для обмена файлами изображений (Exchangeable Image File).
    gifФормат обмена графическими изображениями (Graphics Interchange Format)
    icoЗначки Windows
    jpg, jpeg, jpe, jfifФормат, созданный объединенной группой экспертов по обработке фотографий (Joint Photographic Experts Group). Растровый графический формат изображений и фотографий с высокой степенью сжатия. Поддерживает цвета с глубиной 24 бита. Используется для хранения фото и загрузки изображений в интернет. Изображения занимают мало места, сохраняя при этом высокое качество.
    pngФормат переносимых сетевых изображений (Portable Network Graphics). В отличие от JPEG, в PNG сжатие происходит без потерь — изображение сохраняет первоначальное качество даже после многократного редактирования или изменения размера. Особенности формата:
    • возможность поддержки альфа-канала (прозрачности);
    • многослойность;
    • поддержка различных цветовых пространств, включая RGB и индексированный цвет, который позволяет хранить палитру цветов.
    Размер файла больше, чем в JPEG
    tiff, tifТеговый формат файлов изображений (Tag Image File Format)
    wmfМетафайл Windows (Windows metafile)
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. cdXPos          = 128
    4. cdYPos          = 128
    5. cdXSize         = 1170
    6. cdYSize         = 680
    7. .code
    8. WinMain proc
    9. local msg:MSG
    10. ;инициализация библиотеки GDIPLUS
    11.      invoke GdiplusStartup,&gdiplusToken,&gsi,0
    12.      xor ebx,ebx
    13.      mov esi,IMAGE_BASE
    14.      invoke LoadCursorFromFileA,"br_Rabbit3.cur"
    15.      mov edi,offset ClassName
    16.      push rax    ;hIconSm
    17.      push rdi    ;lpszClassName
    18.      push rbx    ;lpszMenuName
    19.      push COLOR_BTNFACE;hbrBackground
    20.      push rax    ;hCursor
    21.      push rax       ;hIcon
    22.      push rsi    ;hInstance
    23.      push rbx       ;cbClsExtra & cbWndExtra
    24.       pushaddr WndProc     ;lpfnWndProc
    25.       push sizeof WNDCLASSEX;cbSize & style
    26.      invoke RegisterClassExA,esp ;addr WNDCLASSEX
    27.      push rbx
    28.      push rsi ;rsi=400000h
    29.      push rbx
    30.      push rbx
    31.      push cdYSize
    32.      push cdXSize
    33.      push cdYPos
    34.      push cdXPos
    35.      sub esp,20h
    36.      invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    37.     lea edi,msg
    38. @@: invoke GetMessageA,edi,NULL,0,0
    39.      invoke DispatchMessageA,edi
    40.      jmp @b
    41. WinMain endp
    42. WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    43. local hGraphics:qword
    44. local hBrush:qword
    45. local hPen:dword
    46. local ps:PAINTSTRUCT
    47.       mov hWnd,rcx
    48.       cmp edx,WM_DESTROY
    49.       je wmDESTROY
    50.       cmp edx,WM_PAINT
    51.       je wmPAINT
    52.      cmp edx,WM_KEYDOWN
    53.      je wmKEYDOWN
    54.      cmp edx,WM_CREATE
    55.      je wmCREATE
    56.         leave
    57.         jmp NtdllDefWindowProc_
    58. wmKEYDOWN:mov al,r8b;wParam
    59.      cmp al,VK_ESCAPE;user press 'Esc'?
    60.      jne wmBYE
    61. wmDESTROY:invoke GdipDisposeImage,hBitmap1
    62.      invoke GdipDisposeImage,hBitmap2
    63.      invoke GdipDisposeImage,hBitmap3
    64.      mov ecx,gdiplusToken
    65.      invoke GdiplusShutdown
    66.      invoke RtlExitUserProcess,NULL
    67. ;------------------------------------------------------------
    68. wmCREATE:invoke GdipLoadImageFromFile,&FileName1,&hBitmap1
    69.      invoke GdipLoadImageFromFile,&FileName2,&hBitmap2
    70.      invoke GdipLoadImageFromFile,&FileName3,&hBitmap3
    71.      jmp wmBYE
    72. wmPAINT:invoke BeginPaint,hWnd, &ps
    73.      invoke GdipCreateFromHDC,eax,&graphics
    74.      mov qword ptr[rsp+28h],cdYSize/2
    75.      mov qword ptr[rsp+20h],cdXSize
    76.      invoke GdipDrawImageRectI,graphics,hBitmap1,0,0
    77.      mov r9d,cdYSize/2
    78.      mov qword ptr[rsp+28h],r9
    79.      mov qword ptr[rsp+20h],cdXSize/2
    80.      invoke GdipDrawImageRectI,graphics,hBitmap2,0
    81.      mov r8d,cdXSize/2
    82.      mov r9d,cdYSize/2
    83.      mov qword ptr[rsp+28h],r9
    84.      mov qword ptr[rsp+20h],r8
    85.      invoke GdipDrawImageRectI,graphics,hBitmap3
    86.      invoke GdipDeleteGraphics,graphics
    87.      invoke EndPaint,hWnd, &ps
    88. wmBYE:leave
    89.       ret
    90. WndProc endp
    91. ;---------------------------------------
    92. .data
    93. ClassName db 'Вывод изображений с помощью GDI+',0
    94. gsi GdiplusStartupInput <1,0,0,0,0>
    95. FileName1: du <Image1.jpg>
    96. FileName2: du <Image2.png>
    97. FileName3: du <Image3.bmp>
    98. .data?
    99. hBitmap1 dq ?
    100. hBitmap2 dq ?
    101. hBitmap3 dq ?
    102. gdiplusToken dd ?
    103. graphics dq ?
    104. end
    Во вложении asm/exe/cur/jpg/png/bmp-файлы
     

    Вложения:

    MaKsIm нравится это.
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.863
    Мне вот интересно, "Введение в GDI+" количество просмотров: 851, "Примеры программирования на GDI+" 1912 просмотров. Судя по количеству скачиваний от 30 до 80. А кому-нибудь эти топики помогают осваивать GDI+? :scratch_one-s_head:
     
    E.D. и MaKsIm нравится это.
  8. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    120
    Ну так. Лучше бы просто описание на русском для всех этих функций были по типу статей про файлы и память.
     
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.863
    MaKsIm,
    считайте это первым блином, который комом. Я попробую что-нибудь придумать :)
     
  10. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    484
    стянул архив, запустил еке, пустое окошко, не понял, пока отложил (W7x64)
     
  11. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.863
    alex_dz,
    архив какой программы? Запустил ехе прямо из архива? Распаковать в какую-либо папку не пробовал?
     
    alex_dz нравится это.
  12. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    484
    ой бли.. внатуре
    код ищет иконку и рис, прошу пардона!
     
  13. ecobb

    ecobb New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2025
    Сообщения:
    2
    Скорее всего помогают, спасибо! Я в свое время на старом васме все уроки прошёл прежде чем зарегаться на форуме. А когда начал закреплять освоенное разными поделками (скриншотер, ещё чего-то...), тада уже регался и выкладывал
    Такие уроки весьма полезны, особенно начинающим, ведь ассемблер это отправная точка всея коденга. Причём это отправная точка не только вверх но и вниз, к ещё более низкому уровню, но этот путь открывается не всем.
    Кстати ещё было бы полезным все все уроки оформить в PDF и/или MDX форматах для оффлайна.
     
    mantissa и MaKsIm нравится это.
  14. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    120
    Сейчас большинство браузеров могут сохранять страницы в PDF. А те что не могут пользуются печатью на виртуальный PDF принтер
     
    ecobb нравится это.
  15. Ahimov

    Ahimov Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    64
    Mikl___

    > А кому-нибудь эти топики помогают осваивать GDI+?

    Мое скромное мнение - примеры весьма интересны, так как просты интерфейсы. Но это интерфейсы.. вызов их сорян за прямоту, корявый/вырвиглазный :blush2:

    Не следует делать такое:
    Код (ASM):
    1.    cmp edx,WM_CREATE
    2.    je wmCREATE
    3.    leave
    - кто как я протер до дыр как говорится отладчик и архитектурный сдм.. кто это знает не будет такой код читать, другим же он тяжелый для восприятия, не наглядный. В этом фишка скриптов, они наглядны и не нужно держать в уме массив меток :wacko:

    Следует использовать разные макросы, условные конструкции, минимум машинных регистров в исходе и тп. Это же не разбор эксплойтов, где нужно показать необходимость той же leave.

    В целом же затея хорошая :good:
     
    Mikl___ нравится это.
  16. ecobb

    ecobb New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2025
    Сообщения:
    2
    Ahimov,
    Очень даже следует, важно оставлять простор. В процессе изучения это хорошее приглашение чтобы изменить код, поизучать макросы итд
     
  17. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.863
    Ahimov,
    Давайте создадим отдельный топик, где поделимся своими макросами, размышлением о том, какой код корявый и почему так писать не стоит. Мне кажется это заслуживает отдельной темы :good3:
     
    mantissa нравится это.
  18. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    605
    Ahimov, старый стиль в стиле древнего бейсика, того самого с номерами строк и полным отсутствием структурности, процедурности.
    Хотя современные ассемблеры структурные(.if,.while,.for и тд) и процедурные(proc, вызов в стиле С) ЯП, особенно UASM.