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

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

  1. Mikl___

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

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

    Рисуем линии

    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. ColorsGreen     equ 0FF00FF00h;прозрачный - красный - зеленый - синий
    4. ColorsBlack     equ 0FF000000h
    5. ColorsYellow    equ 0FFFFFF00h
    6. ColorsRed equ 0FFFF0000h
    7. UnitWorld equ 0
    8. PenAlignmentCenter equ 0
    9. PenAlignmentInset equ 1
    10. LineCapRoundAnchor equ 12h
    11. LineCapArrowAnchor equ 14h
    12. LineJoinBevel equ 1
    13. .code
    14. WinMain proc
    15. local msg:MSG
    16. ;инициализация библиотеки GDIPLUS
    17.      invoke GdiplusStartup,&gdiplusToken,&gsi,0
    18.      xor ebx,ebx
    19.      mov esi,IMAGE_BASE
    20.      invoke LoadCursorFromFileA,"br_Rabbit3.cur"
    21.      mov edi,offset ClassName
    22.      push rax    ;hIconSm
    23.      push rdi    ;lpszClassName
    24.      push rbx    ;lpszMenuName
    25.      push COLOR_WINDOW  ;hbrBackground
    26.      push rax    ;hCursor
    27.      push rax       ;hIcon
    28.      push rsi    ;hInstance
    29.      push rbx       ;cbClsExtra & cbWndExtra
    30.      pushaddr WndProc     ;lpfnWndProc
    31.      push sizeof WNDCLASSEX;cbSize & style
    32.      invoke RegisterClassExA,esp ;addr WNDCLASSEX
    33.      push rbx
    34.      push rsi ;rsi=400000h
    35.      shl esi,9 ;rsi=CW_USEDEFAULT
    36.      push rbx
    37.      push rbx
    38.      push 400
    39.      push 400
    40.      push rsi
    41.      push rsi
    42.      sub esp,20h
    43.     invoke CreateWindowExA,WS_EX_TOOLWINDOW,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    44.     lea edi,msg
    45. @@:    invoke GetMessageA,edi,NULL,0,0
    46.      invoke DispatchMessageA,edi
    47.         jmp @b
    48. WinMain endp
    49. WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    50. local ps:PAINTSTRUCT
    51.       mov hWnd,rcx
    52.       cmp edx,WM_DESTROY
    53.       je wmDESTROY
    54.       cmp edx,WM_CREATE
    55.       je wmCREATE
    56.      cmp edx,WM_PAINT
    57.      je wmPAINT
    58.         leave
    59.         jmp NtdllDefWindowProc_
    60. wmDESTROY:;уничтожить перья
    61.      invoke GdipDeletePen,nativePen
    62.      invoke GdipDeletePen,blackPen
    63.      invoke GdipDeletePen,greenPen
    64.         invoke GdipDeletePath,path
    65. ;уничтожить объект GDI+
    66.      invoke GdipDeleteGraphics,graphics
    67.      mov ecx,gdiplusToken
    68.      invoke GdiplusShutdown
    69.      invoke RtlExitUserProcess,NULL
    70. wmPAINT:invoke BeginPaint,hWnd,&ps
    71. ;зеленая линия
    72.      invoke GdipDrawLineI,graphics,nativePen,40,40, 200, 100 ;x1,y1,x2,y2
    73. ;"Странная" линия
    74.      invoke GdipDrawLineI,graphics,greenPen,230,200,300,150
    75.      invoke GdipDrawLineI,graphics,blackPen,230,200,300,150
    76. ;Прямоугольник с выравниванием линии по центру
    77.      invoke GdipDrawRectangleI,graphics,greenPen,210,220,100,100
    78.      invoke GdipDrawRectangleI,graphics,blackPen,210,220,100,100
    79. ;Прямоугольник с выравниванием линии по краю
    80.      invoke GdipSetPenMode,greenPen,PenAlignmentInset
    81.      invoke GdipDrawRectangleI,graphics,greenPen,250,250,100,100
    82.      invoke GdipDrawRectangleI,graphics,blackPen,250,250,100,100
    83. ;Стрелка
    84.      invoke GdipDrawLineI,graphics,hPen,12,92,60,80
    85. ;Соединение линий
    86.         invoke GdipAddPathLineI,path,10,200,100,200
    87.      invoke GdipAddPathLineI,path,100,200,100,300
    88.      invoke GdipAddPathLineI,path,100,300,150,300
    89.      invoke GdipSetPenLineJoin,hPen,LineJoinBevel
    90.      invoke GdipDrawPath,graphics,hPen,path
    91. ;Прерывистая линия
    92.         invoke GdipDrawLineI,graphics,hPen0,100,50,200,50
    93.      invoke GdipDrawLineI,graphics,hPen0,100,70,300,70
    94. ;------------------------------------------------------------
    95.      invoke EndPaint,hWnd,&ps
    96.      jmp wmBYE
    97. wmCREATE:invoke GdipCreateFromHWND,hWnd,&graphics
    98. ;------------------------------------------------------------
    99.         movd xmm1,EpaisseurStylo
    100.      invoke GdipCreatePen1,0FF00FF00h,,0,&nativePen
    101.      movd xmm1,wi1
    102.      invoke GdipCreatePen1,ColorsBlack,,UnitWorld,&blackPen
    103.      movd xmm1,wi2
    104.      invoke GdipCreatePen1,ColorsGreen,,UnitWorld,&greenPen
    105.      invoke GdipSetPenMode,greenPen,PenAlignmentCenter
    106.      movd xmm1,wi3
    107.      invoke GdipCreatePen1,ColorsYellow,,UnitWorld,&hPen
    108.      invoke GdipSetPenStartCap,hPen,LineCapRoundAnchor
    109.      invoke GdipSetPenEndCap,hPen,LineCapArrowAnchor
    110.      invoke GdipCreatePath,0,&path
    111.      invoke GdipStartPathFigure,path
    112.      movd xmm1,wi3
    113.      invoke GdipCreatePen1,ColorsRed,,UnitWorld,&hPen0
    114.      invoke GdipSetPenStartCap,hPen0,LineCapRoundAnchor
    115.      invoke GdipSetPenEndCap,hPen0,LineCapArrowAnchor
    116.      invoke GdipSetPenDashArray,hPen0,&dash,2
    117. wmBYE:  leave
    118.         ret
    119. WndProc endp
    120. ;---------------------------------------
    121. .data
    122. ClassName db 'GDI+ рисование линий',0
    123. gdiplusToken dd ?
    124. gsi GdiplusStartupInput <1,0,0,0,0>
    125. graphics dq ?
    126. nativePen dq ?
    127. blackPen dq ?
    128. greenPen dq ?
    129. hPen dq ?
    130. hPen0 dq ?
    131. path dq ?
    132. EpaisseurStylo REAL4 3.0;толщина пера в формате float
    133. wi1 real4 1.0
    134. wi2 real4 10.0
    135. wi3             real4 8.0
    136. dash REAL4 1.0,0.5
    137. end
    Во вложении asm/exe/cur-файлы
     

    Вложения:

    • 00.png
      00.png
      Размер файла:
      6,7 КБ
      Просмотров:
      267
    • tut_01a.zip
      Размер файла:
      4,8 КБ
      Просмотров:
      86
    MaKsIm нравится это.
  2. Mikl___

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

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

    Рисуем круги, окружности и эллипсы

    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. ColorsGreen     equ 0FF00FF00h
    4. .code
    5. WinMain proc
    6. local msg:MSG
    7. ;инициализация библиотеки GDIPLUS
    8.      invoke GdiplusStartup,&gdiplusToken,&gsi,0
    9.      xor ebx,ebx
    10.      mov esi,IMAGE_BASE
    11.      invoke LoadCursorFromFileA,"br_Rabbit3.cur"
    12.      mov edi,offset ClassName
    13.      push rax    ;hIconSm
    14.      push rdi    ;lpszClassName
    15.      push rbx    ;lpszMenuName
    16.      push COLOR_WINDOW;hbrBackground
    17.      push rax    ;hCursor
    18.      push rax       ;hIcon
    19.      push rsi    ;hInstance
    20.      push rbx       ;cbClsExtra & cbWndExtra
    21.      pushaddr WndProc     ;lpfnWndProc
    22.       push sizeof WNDCLASSEX;cbSize & style
    23.      invoke RegisterClassExA,esp ;addr WNDCLASSEX
    24.      push rbx
    25.      push rsi ;rsi=400000h
    26.      shl esi,9 ;rsi=CW_USEDEFAULT
    27.      push rbx
    28.      push rbx
    29.      push 500
    30.      push 500
    31.      push rsi
    32.      push rsi
    33.      sub esp,20h
    34.     invoke CreateWindowExA,WS_EX_TOOLWINDOW,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    35.     lea edi,msg
    36. @@:    invoke GetMessageA,edi,NULL,0,0
    37.      invoke DispatchMessageA,edi
    38.       jmp @b
    39. WinMain endp
    40. WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    41. local ps:PAINTSTRUCT
    42.       mov hWnd,rcx
    43.       cmp edx,WM_DESTROY
    44.       je wmDESTROY
    45.       cmp edx,WM_CREATE
    46.       je wmCREATE
    47.      cmp edx,WM_PAINT
    48.      je wmPAINT
    49.       leave
    50.       jmp NtdllDefWindowProc_
    51. wmDESTROY:;уничтожить путь
    52.      invoke GdipDeletePath,path
    53.      invoke GdipDeleteBrush,hBrush
    54.       invoke GdipDeleteBrush,hBrush0
    55.       invoke GdipDeleteBrush,hBrush1
    56.       invoke GdipDeleteBrush,hBrush2
    57.      invoke GdipDeletePen,hPen
    58. ;уничтожить объект GDI+
    59.      invoke GdipDeleteGraphics,graphics
    60.      mov ecx,gdiplusToken
    61.      invoke GdiplusShutdown
    62.      invoke RtlExitUserProcess,NULL
    63. wmPAINT:invoke BeginPaint,hWnd,&ps
    64. ;Нелинейный градиент - эллипс
    65.      invoke GdipAddPathEllipseI,path,-150,-150,600,600
    66.      invoke GdipCreatePathGradientFromPath,path,&hBrush
    67.      invoke GdipSetPathGradientCenterColor,hBrush,900000FFh
    68.      invoke GdipFillRectangleI,graphics,hBrush,0,0,700,700
    69. ;нарисовать закрашенную окружность
    70.      invoke GdipFillEllipseI,graphics,hBrush0,50,138,200,200
    71.      invoke GdipFillEllipseI,graphics,hBrush1,173,138,200,200
    72.      invoke GdipFillEllipseI,graphics,hBrush2,108,59,200,200
    73. ;нарисовать незакрашенную окружность
    74.      invoke GdipDrawEllipseI,graphics,hPen,250,100,200,200
    75. ;------------------------------------------------------------
    76.      invoke EndPaint,hWnd,&ps
    77.      jmp wmBYE
    78. wmCREATE:invoke GdipCreateFromHWND,hWnd,&graphics
    79. ;------------------------------------------------------------
    80. ;создать кисть
    81.      invoke GdipCreateSolidFill,09000FFFFh,&hBrush0;голубой
    82.      invoke GdipCreateSolidFill,090FFFF00h,&hBrush1;желтый
    83.      invoke GdipCreateSolidFill,090FF00FFh,&hBrush2;малиновый
    84. ;создать перо
    85.      movd xmm1,EpaisseurStylo;толщина пера в формате float
    86.      invoke GdipCreatePen1,ColorsGreen,,0,&hPen; цвет пера
    87.      invoke GdipCreatePath,0,&path
    88. wmBYE:  leave
    89.       ret
    90. WndProc endp
    91. ;---------------------------------------
    92. .data
    93. ClassName db 'GDI+ рисование эллипсов',0
    94. gdiplusToken dd ?
    95. gsi GdiplusStartupInput <1,0,0,0,0>
    96. graphics dq ?
    97. EpaisseurStylo REAL4 6.0
    98. path dq ?
    99. hPen dq ?
    100. hBrush dq ?
    101. hBrush0 dq ?
    102. hBrush1 dq ?
    103. hBrush2 dq ?
    104. end
    Во вложении asm/exe/cur-файлы
     

    Вложения:

    • 00.png
      00.png
      Размер файла:
      64,5 КБ
      Просмотров:
      255
    • tut_01b.zip
      Размер файла:
      4,3 КБ
      Просмотров:
      81
    MaKsIm нравится это.
  3. Mikl___

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

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

    Полупрозрачное окно круглой формы

    Окно перемещается по рабочему столу, если нажать на него левой клавишей мыши. Правый клик внутрь окна -- это окно закроет.
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. PixelFormat32bppPARGB           = 0E200Bh
    4. AC_SRC_OVER                     = 0
    5. AC_SRC_ALPHA                    = 1
    6. .code
    7. WinMain proc
    8. local msg:MSG
    9. ;инициализация библиотеки GDIPLUS
    10.      invoke GdiplusStartup,&gdiplusToken,&gsi,0
    11.      xor ebx,ebx
    12.      mov esi,IMAGE_BASE
    13.      invoke LoadCursorFromFileA,"br_Rabbit3.cur"
    14.      mov edi,offset ClassName
    15.      push rax    ;hIconSm
    16.      push rdi    ;lpszClassName
    17.      push rbx    ;lpszMenuName
    18.      push COLOR_WINDOW  ;hbrBackground
    19.      push rax    ;hCursor
    20.      push rax       ;hIcon
    21.      push rsi    ;hInstance
    22.      push rbx       ;cbClsExtra & cbWndExtra
    23.      pushaddr WndProc     ;lpfnWndProc
    24.      push sizeof WNDCLASSEX;cbSize & style
    25.      invoke RegisterClassExA,esp ;addr WNDCLASSEX
    26.      push rbx
    27.      push rsi ;rsi=400000h
    28.      push rbx
    29.      push rbx
    30.      push 600
    31.      push 600
    32.      push rbx
    33.      push rbx
    34.      sub esp,20h
    35.      invoke CreateWindowExA,WS_EX_LAYERED,edi,edi,WS_POPUP or WS_VISIBLE ;WS_EX_LAYERED=80000h
    36.     lea edi,msg
    37. @@:    invoke GetMessageA,edi,NULL,0,0
    38.      invoke DispatchMessageA,edi
    39.      jmp @b
    40. WinMain endp
    41. WndProc proc <12> hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    42. local hDC:HDC
    43. local memDC:HDC
    44. LOCAL hBmp:HBITMAP
    45. LOCAL OldBmp:HBITMAP
    46. LOCAL blend:BLENDFUNCTION
    47. LOCAL rect:RECT
    48.      mov hWnd,rcx
    49.      mov wParam,r8
    50.      mov lParam,r9
    51.      cmp edx,WM_DESTROY
    52.       je wmDESTROY
    53.      cmp edx,WM_CREATE
    54.      je wmCREATE
    55.      cmp edx,WM_RBUTTONDOWN
    56.      je wmRBUTTONDOWN
    57.      cmp edx,WM_LBUTTONDOWN
    58.      je wmLBUTTONDOWN
    59.      leave
    60.      jmp NtdllDefWindowProc_
    61. wmDESTROY:invoke ReleaseDC,hDC
    62.      invoke GdipDisposeImage,bitmap0
    63. ;уничтожить объект GDI+
    64.      mov ecx,gdiplusToken
    65.      invoke GdiplusShutdown
    66.      invoke RtlExitUserProcess,NULL
    67. wmLBUTTONDOWN:invoke SendMessageA,hWnd,WM_NCLBUTTONDOWN,HTCAPTION, lParam
    68.      jmp wmLBUTTONUP
    69. wmRBUTTONDOWN:;invoke  GetWindowLongPtrA,hWnd,GWL_EXSTYLE
    70. ;        sub     rax,WS_EX_LAYERED
    71.      invoke  SetWindowLongPtrA,hWnd,GWL_EXSTYLE,0
    72.      invoke  SetLayeredWindowAttributes,hWnd,0,255,LWA_ALPHA
    73.      invoke PostMessageA,hWnd,WM_CLOSE,0,0
    74.      jmp wmBYE
    75. wmCREATE:invoke GdipCreateBitmapFromFile,&pngfile,&bitmap0
    76.      invoke GetWindowRect,hWnd,&rect
    77.      mov blend.BlendOp,AC_SRC_OVER
    78.      mov blend.BlendFlags,0
    79.      mov blend.AlphaFormat,AC_SRC_ALPHA
    80.      mov blend.SourceConstantAlpha, 255
    81.      invoke GetDC,0
    82.      mov hDC,rax
    83. wmLBUTTONUP:mov ecx,rect.right
    84.      sub ecx,rect.left
    85.      mov rect.right,ecx
    86.      mov edx,rect.bottom
    87.      sub edx,rect.top
    88.      mov rect.bottom,edx
    89.      lea eax,bitmap
    90.      mov [rsp+28h],rax
    91.      and qword ptr[rsp+20h],0
    92.      invoke GdipCreateBitmapFromScan0,,,0,PixelFormat32bppPARGB
    93.      invoke GdipGetImageGraphicsContext,bitmap,&graphics
    94.      invoke GdipDrawImage,graphics,bitmap0,0,0
    95.      mov ecx,rect.right
    96.      mov edx,rect.bottom
    97.      invoke GdipCreateBitmapFromGraphics,,,graphics,&bitmap10
    98.      invoke GdipCreateHBITMAPFromBitmap,bitmap,&hBmp,0
    99.      invoke CreateCompatibleDC,hDC
    100.      mov memDC,rax
    101.      invoke SelectObject,eax,hBmp
    102.      mov OldBmp,rax
    103.      mov qword ptr[rsp+40h],ULW_ALPHA
    104.      lea eax,blend
    105.      mov [rsp+38h],rax
    106.      and qword ptr[rsp+30h],0
    107.      lea eax,ptZero
    108.      mov [rsp+28h],rax
    109.      mov rax,memDC
    110.      mov [rsp+20h],rax
    111.      invoke UpdateLayeredWindow,hWnd,0,&rect,&rect.right
    112.      invoke DeleteObject,OldBmp
    113.      invoke DeleteDC,memDC
    114. wmBYE:  leave
    115.         ret
    116. WndProc endp
    117. ;---------------------------------------
    118. .data
    119. bitmap dq ?
    120. bitmap0 dq ?
    121. bitmap10 dq ?
    122. Hbitmap HBITMAP ?
    123. graphics dq ?
    124. ClassName db 'GDI+ полупрозрачный шар',0
    125. gdiplusToken dd ?
    126. gsi GdiplusStartupInput <1,0,0,0,0>
    127. pngfile: du <crystal-ball.png>
    128. ptZero POINT <>
    129. end
    Во вложении asm/exe/png/cur-файлы
     

    Вложения:

    • 00.png
      00.png
      Размер файла:
      231 КБ
      Просмотров:
      264
    • tut_01k.zip
      Размер файла:
      270,1 КБ
      Просмотров:
      82
    k3rnl, malex и MaKsIm нравится это.
  4. Mikl___

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

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

    GIF-анимация

    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. PropertyTagFrameDelay  equ 5100h
    4. cdIdTimer       equ 1
    5. .code
    6. WinMain proc
    7. local msg:MSG
    8. ;инициализация библиотеки GDIPLUS
    9.        invoke GdiplusStartup,&gdiplusToken,&gsi,0
    10.        xor ebx,ebx
    11.        mov edi,offset ClassName
    12.        invoke LoadCursorFromFileA,&FileName
    13.        push rax ;hIconSm
    14.        push rdi ;lpszClassName
    15.        push rbx ;lpszMenuName
    16.        push COLOR_WINDOWTEXT ;hbrBackground
    17.        push rax ;hCursor
    18.        push rax ;hIcon
    19.        push IMAGE_BASE ;hInstance
    20.        push rbx ;cbClsExtra & cbWndExtra
    21.        pushaddr WndProc  ;lpfnWndProc
    22.        push sizeof WNDCLASSEX;cbSize & style
    23.        invoke RegisterClassExA,esp ;addr WNDCLASSEX
    24.        push rbx
    25.        push IMAGE_BASE
    26.        push rbx
    27.        push rbx
    28.        push rbx ; nHeight
    29.        push rbx ; nWidth
    30.        push 127; Y
    31.        push 127; X
    32.        sub esp,20h
    33.        invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    34.        lea edi,msg
    35. @@: invoke GetMessageA,edi,NULL,0,0
    36.        cmp msg.wParam,VK_ESCAPE;user press 'Esc'?
    37.        je wmDESTROY
    38.        invoke DispatchMessageA,edi
    39.        jmp @b
    40. WinMain endp
    41. WndProc proc hWnd:qword,umsg:qword,wParam:qword,lParam:qword
    42. local graphics:qword
    43. local ptDiff:POINT
    44. local rctWnd:RECT
    45. local rctClient:RECT
    46. local tmp:qword
    47. local pDimensionIDs:qword
    48. local count:qword
    49. local ps:PAINTSTRUCT
    50.        mov hWnd,rcx
    51.        cmp edx,WM_DESTROY
    52.        je wmDESTROY
    53.        cmp edx,WM_CREATE
    54.        je wmCREATE
    55.        cmp edx,WM_SIZE
    56.        je wmSIZE
    57.        cmp edx,WM_PAINT
    58.        je wmPAINT
    59.        cmp edx,WM_TIMER
    60.        je wmTIMER
    61.        leave
    62.         jmp NtdllDefWindowProc_
    63. wmDESTROY::invoke KillTimer,hWnd,cdIdTimer
    64.        invoke GdipDisposeImage,hImage
    65.        invoke GdipFree,pPropertyItem
    66.        invoke GdiplusShutdown,gdiplusToken
    67.        invoke RtlExitUserProcess,NULL
    68. ;DrawFrameGIF---------------------
    69. wmPAINT:invoke BeginPaint,hWnd,&ps
    70.        invoke GdipCreateFromHDC,eax,&graphics
    71.        mov eax,dword ptr vdyClient
    72.        mov [rsp+28h],rax
    73.        mov eax,dword ptr vdxClient
    74.        mov [rsp+20h],rax
    75.        invoke GdipDrawImageRectI,graphics,hImage,0,0
    76.        invoke GdipImageSelectActiveFrame,hImage,&pageGuid,nFramePosition
    77.        inc nFramePosition
    78.        mov eax,nFrameCount
    79.        sub rax,nFramePosition
    80.        jnz @f
    81.        mov nFramePosition,rax
    82. ;-------------------------------
    83. @@: invoke GdipDeleteGraphics,graphics
    84.        invoke EndPaint,hWnd,&ps
    85.        jmp wmBYE
    86. wmTIMER:invoke InvalidateRect,hWnd,0,0
    87. jmp wmBYE
    88. wmCREATE:; Загрузить картинку из файла
    89.        invoke GdipLoadImageFromFile,&szfilename,&hImage
    90. ; Проверить количество пространств
    91.        invoke GdipImageGetFrameDimensionsCount,hImage,&count
    92.        mov rcx,count
    93.        test ecx,ecx
    94.        jz @f
    95.        shl ecx,4
    96.        invoke GdipAlloc
    97.        mov pDimensionIDs,rax
    98. ; Получить идентификатор первого пространства
    99.        invoke GdipImageGetFrameDimensionsList,hImage,eax,count
    100. ; Получить количество кадров в первом пространстве
    101.        invoke GdipImageGetFrameCount,hImage,pDimensionIDs,&nFrameCount
    102. ; Получить значение задержек между кадрами
    103.        invoke GdipGetPropertyItemSize,hImage,PropertyTagFrameDelay,&tmp
    104.        mov rcx,tmp
    105.        shl ecx,2
    106.        invoke GdipAlloc
    107.        mov pPropertyItem,rax
    108.        invoke GdipGetPropertyItem,hImage,PropertyTagFrameDelay,tmp,eax
    109.         invoke GdipFree,pDimensionIDs
    110. @@:;------------------------------------
    111.        invoke GdipGetImageWidth,hImage,&nWidth
    112.        invoke GdipGetImageHeight,hImage,&nHeight
    113.        invoke GetClientRect,hWnd,&rctClient
    114.        invoke GetWindowRect,hWnd,&rctWnd
    115.        mov eax,rctWnd.right
    116.        sub eax,rctWnd.left
    117.        sub eax,rctClient.right
    118.        mov ptDiff.x,eax
    119.        mov eax,rctWnd.bottom
    120.        sub eax,rctWnd.top
    121.        sub eax,rctClient.bottom
    122.        mov ptDiff.y,eax
    123.        mov qword ptr [rsp+28h],TRUE ; bRepaint
    124.         mov ecx,nHeight
    125.        add ecx,ptDiff.y
    126.        mov [rsp+20h],rcx ;nHeight
    127.        mov r9d,nWidth
    128.        add r9d,ptDiff.x
    129.        invoke MoveWindow,hWnd,127,127
    130.        invoke SetTimer,hWnd,cdIdTimer,tmp,0
    131.        jmp wmBYE
    132. wmSIZE: mov rax,r9;lParam
    133.        mov vdxClient,ax
    134.        shr eax,10h
    135.        mov vdyClient,ax
    136. wmBYE: leave
    137.        retn
    138. WndProc endp
    139. ;-----------------------------------
    140. .data
    141. ClassName db "GDI+ gif animation",0
    142. FileName db "br_Rabbit3.cur",0
    143. gsi GdiplusStartupInput <1,0,0,0,0>
    144. pageGuid GUID <6AEDBD6Dh,3FB5h,418Ah,<83h,0A6h,7Fh,45h,22h,9Dh,0C8h,72h>>
    145. szfilename: du <movie.gif>
    146. vdxClient dw 0,0
    147. vdyClient dw 0,0
    148. nFramePosition dq 0
    149. .data?
    150. gdiplusToken dq ?
    151. nWidth dd ?
    152. nHeight dd ?
    153. nFrameCount dd ?
    154. pPropertyItem dq ?
    155. hImage dq ?
    156. end
    Во вложении asm/exe/gif/cur-файлы
     

    Вложения:

    • tut_01i.zip
      Размер файла:
      1,7 МБ
      Просмотров:
      83
    • movie.gif
      movie.gif
      Размер файла:
      1,7 МБ
      Просмотров:
      82
    k3rnl и MaKsIm нравится это.
  5. Research

    Research Active Member

    Публикаций:
    1
    Регистрация:
    6 янв 2024
    Сообщения:
    184
    Интересная на мой взгляд идея: нарисовать график функций для данных
    --- Сообщение объединено, 7 янв 2025 ---
    Для красоты весь график можно разделить на прямоугольники сплошными прерывистыми линиями
    --- Сообщение объединено, 7 янв 2025 ---
    Для каждого числа делается линия как на сортировках, длина линии = значение, потом линии стираются последние точки соединяются.
     
  6. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    120
    Вот вариант на fasm 1.73.32 первого туториала
    Код (ASM):
    1.  
    2. format PE64 GUI 6.0
    3. include "WIN64W.INC"
    4. ; include "EXTIMPORT.INC"
    5. ; -----------------------------------------------------------------
    6. irpv library, v { purge v }
    7. irpv import, v { purge v }
    8. macro .import { purge .import
    9.   macro .import \{\}
    10.   section '.idata' import data readable writeable
    11.   define __SECTION import
    12. }
    13. macro library [name] { common .import
    14.   label import_data
    15.   forward label name#.ref
    16.     if defined name#.use
    17.       dd RVA name#.adr, 0, 0, RVA name#.txt, RVA name#.aim
    18.     end if
    19.   common if $ > import_data
    20.       dd 0, 0, 0, 0, 0
    21.     end if
    22. }
    23. macro import name, [deff] { common match lbl==txt, name \{
    24.     if definite lbl\#.ref
    25.       label lbl\#.aim
    26.   \}
    27.   forward match lbl==txt, name \{ match aim==val, deff \\{
    28.     macro lbl\\#.\\#aim arg& \\\{ invoke lbl\\\#.\\\#aim\\\#.point, arg\\\}
    29.     macro aim arg& \\\{ lbl\\\#.\\\#aim arg \\\}
    30.     if used __imp__\\#aim
    31.       label __imp__\\#aim qword at lbl\\\#.\\\#aim\\\#.point
    32.     end if
    33.     if used lbl\\#.\\#aim\\#.point
    34.       label lbl\\#.\\#aim\\#.point qword
    35.       if val eqtype ''
    36. dq RVA lbl\\#.\\#aim\\#.text
    37.       else
    38. dq 0x8000000000000000 + val
    39.       end if
    40.     end if
    41.   \\} \}
    42.   common match lbl==txt, name \{ if $ > lbl\#.aim
    43.       lbl\#.use dq 0
    44.     end if
    45.     label lbl\#.adr
    46.   \}
    47.   forward match lbl==txt, name \{ match aim==val, deff \\{
    48.     if used lbl\\#.\\#aim\\#.point
    49.       if val eqtype ''
    50. dq RVA lbl\\#.\\#aim\\#.text
    51.       else
    52. dq 0x8000000000000000 + val
    53.       end if
    54.     end if
    55.   \\} \}
    56.   common match lbl==txt, name \{ if $ > lbl\#.adr
    57.       dq 0
    58.     end if
    59.     lbl\#.txt db txt, 0
    60.   \}
    61.   forward match lbl==txt, name \{ match aim==val, deff \\{
    62.     if used lbl\\#.\\#aim\\#.point & val eqtype ''
    63.       rb RVA $ and 1
    64.       lbl\\#.\\#aim\\#.text db 0, 0, val, 0
    65.     end if
    66.   \\} \}
    67.   common end if
    68. }
    69. ; -----------------------------------------------------------------
    70. ; include "GDIPLUS.INC"
    71. ; -----------------------------------------------------------------
    72. UnitWorld    equ 0
    73. PenAlignmentCenter equ 0
    74. PenAlignmentInset  equ 1
    75. LineCapRoundAnchor equ 12h
    76. LineCapArrowAnchor equ 14h
    77. LineJoinBevel    equ 1
    78. struc GdiplusStartupInput ver=1,cbk=0,bkg=?,ext=?,inp=? { label .
    79.   .GdiplusVersion dd ver,0
    80.   .DebugEventCallback dq cbk
    81.   .SuppressBackgroundThread dd bkg
    82.   .SuppressExternalCodecs dd ext
    83.   .GdiplusStartupInput dq inp
    84.   label .Length at $ - .
    85. }
    86. ; -----------------------------------------------------------------
    87. library KERNEL32.DLL,USER32.DLL,GDIPLUS.DLL
    88. import KERNEL32.DLL     = "KERNEL32.DLL",\
    89. ExitProcess     = "ExitProcess",\
    90. GetLastError     = "GetLastError",\
    91. SetLastError     = "SetLastError"
    92. import USER32.DLL     = "USER32.DLL",\
    93. BeginPaint     = "BeginPaint",\
    94. CreateWindowExW     = "CreateWindowExW",\
    95. DefWindowProcW     = "DefWindowProcW",\
    96. DispatchMessageW    = "DispatchMessageW",\
    97. EndPaint     = "EndPaint",\
    98. GetMessageW     = "GetMessageW",\
    99. LoadImage     = "LoadImageW",\
    100. PostQuitMessage     = "PostQuitMessage",\
    101. RegisterClassExW    = "RegisterClassExW",\
    102. TranslateMessage    = "TranslateMessage"
    103. import GDIPLUS.DLL     = "GDIPLUS.DLL",\
    104. GdipAddPathLineI    = "GdipAddPathLineI",\
    105. GdipCreateFromHWND  = "GdipCreateFromHWND",\
    106. GdipCreatePath     = "GdipCreatePath",\
    107. GdipDeleteGraphics  = "GdipDeleteGraphics",\
    108. GdipCreatePen1     = "GdipCreatePen1",\
    109. GdipDeletePath     = "GdipDeletePath",\
    110. GdipDeletePen     = "GdipDeletePen",\
    111. GdipDrawLineI     = "GdipDrawLineI",\
    112. GdipDrawPath     = "GdipDrawPath",\
    113. GdipDrawRectangleI  = "GdipDrawRectangleI",\
    114. GdipSetPenDashArray = "GdipSetPenDashArray",\
    115. GdipSetPenLineJoin  = "GdipSetPenLineJoin",\
    116. GdipSetPenMode     = "GdipSetPenMode",\
    117. GdipSetPenEndCap    = "GdipSetPenEndCap",\
    118. GdipSetPenStartCap  = "GdipSetPenStartCap",\
    119. GdipStartPathFigure = "GdipStartPathFigure",\
    120. GdiplusShutdown     = "GdiplusShutdown",\
    121. GdiplusStartup     = "GdiplusStartup"
    122. section '.data' data readable writeable
    123. gsi        GdiplusStartupInput 1,0,0,0,0
    124. gdipDash       dd  1.0,\
    125.    0.5
    126. nativePenWidth dd  3.0
    127. blackPenWidth  dd  1.0
    128. greenPenWidth  dd 10.0
    129. hPenWidth      dd  8.0
    130. hPen0Width     dd 10.0
    131. szClassName    du "GDI+ рисование линий",0
    132. szFileName     du "br_Rabbit3.cur",0
    133. align 8
    134. gdipGraphics   rq 1
    135. gdipPath       rq 1
    136. hPen0        rq 1
    137. hPen        rq 1
    138. nativePen      rq 1
    139. blackPen       rq 1
    140. greenPen       rq 1
    141. gdiplusToken   rd 1
    142. virtual        at 0
    143.   wce        WNDCLASSEX
    144.   label WNDCLASSEXW.Length
    145. end virtual
    146. section '.text' code readable executable
    147. label ImageBase at $ - $$
    148. entry WinMain
    149. proc WinMain
    150.   RegisterClassExW_SizeAndStyle = WNDCLASSEXW.Length or ((CS_HREDRAW or CS_VREDRAW or CS_GLOBALCLASS or CS_DBLCLKS) shl 32)
    151.   local msg:MSG
    152. frame
    153. GdiplusStartup gdiplusToken, gsi, 0
    154. LoadImage NULL, addr szFileName, IMAGE_CURSOR, LR_DEFAULTSIZE, LR_DEFAULTSIZE, LR_LOADFROMFILE or LR_SHARED
    155. RegisterClassExW addr rsp + 32, rdx, r8, r9, RegisterClassExW_SizeAndStyle,\
    156. addr WndProc, NULL, addr ImageBase, rax, rax, COLOR_WINDOWFRAME+1,\
    157. NULL, addr szClassName, rax
    158. CreateWindowExW  WS_EX_TOOLWINDOW, addr szClassName, addr szClassName,\
    159. WS_OVERLAPPEDWINDOW or WS_VISIBLE, 100, 100, 400, 400,\
    160. NULL, NULL, addr ImageBase, NULL
    161. SetLastError NULL
    162. jmp .start
    163.   @@:
    164. TranslateMessage addr msg
    165. DispatchMessageW addr msg
    166.   .start:
    167. GetMessageW addr msg, NULL, NULL, NULL
    168. inc eax
    169. jz @f
    170. dec eax
    171. jnz @b
    172. mov eax, dword [msg.wParam]
    173. jmp .exit
    174.   @@:
    175. GetLastError
    176.   .exit:
    177. GdiplusShutdown [gdiplusToken]
    178. ExitProcess eax
    179. endf
    180. endp
    181. proc WndProc, hWnd:QWORD,uMsg:DWORD,wPar:QWORD,lPar:QWORD
    182. frame
    183.   local ps:PAINTSTRUCT
    184. cmp edx, WM_PAINT
    185. jz .wm_paint
    186. cmp edx, WM_DESTROY
    187. jz .wm_destroy
    188. cmp edx, WM_CREATE
    189. jz .wm_create
    190. DefWindowProcW rcx, edx, r8, r9
    191. jmp .quit
    192.   .wm_create:
    193. GdipCreateFromHWND rcx, gdipGraphics
    194. GdipCreatePen1 0FF00FF00h, float [nativePenWidth], UnitWorld, addr nativePen
    195. GdipCreatePen1 0FF000000h, float [blackPenWidth], UnitWorld, addr blackPen
    196. GdipCreatePen1 0FF00FF00h, float [greenPenWidth], UnitWorld, addr greenPen
    197. GdipSetPenMode [greenPen], PenAlignmentCenter
    198. GdipCreatePen1 0FFFFFF00h, float [hPenWidth], UnitWorld, addr hPen
    199. GdipSetPenStartCap  [hPen], LineCapRoundAnchor
    200. GdipSetPenEndCap    [hPen], LineCapArrowAnchor
    201. GdipCreatePath   0, addr gdipPath
    202. GdipStartPathFigure [gdipPath]
    203. GdipCreatePen1 0FFFF0000h, float [hPen0Width], UnitWorld, addr hPen0
    204. GdipSetPenStartCap  [hPen0], LineCapRoundAnchor
    205. GdipSetPenEndCap    [hPen0], LineCapArrowAnchor
    206. GdipSetPenDashArray [hPen0], addr gdipDash, 2
    207. xor eax, eax
    208. jmp .quit
    209.   .wm_destroy:
    210. GdipDeletePen    [hPen0]
    211. GdipDeletePen    [hPen]
    212. GdipDeletePen    [greenPen]
    213. GdipDeletePen    [blackPen]
    214. GdipDeletePen    [nativePen]
    215. GdipDeletePath    [gdipPath]
    216. GdipDeleteGraphics [gdipGraphics]
    217. PostQuitMessage NULL
    218. jmp .quit
    219.   .wm_paint:
    220.         mov     [hWnd], rcx
    221. BeginPaint, [hWnd], addr ps
    222. ;зеленая линия
    223. GdipDrawLineI  [gdipGraphics], [nativePen], 40, 40, 200, 100 ;x1,y1,x2,y2
    224. ;"Странная" линия
    225. GdipDrawLineI [gdipGraphics], [greenPen], 230, 200, 300, 150
    226. GdipDrawLineI [gdipGraphics], [blackPen], 230, 200, 300, 150
    227. ;Прямоугольник с выравниванием линии по центру
    228. GdipDrawRectangleI [gdipGraphics], [greenPen], 210, 220, 100, 100
    229. GdipDrawRectangleI [gdipGraphics], [blackPen], 210, 220, 100, 100
    230. ;Прямоугольник с выравниванием линии по краю
    231. GdipSetPenMode [greenPen], PenAlignmentInset
    232. GdipDrawRectangleI [gdipGraphics], [greenPen], 250, 250, 100, 100
    233. GdipDrawRectangleI [gdipGraphics], [blackPen], 250, 250, 100, 100
    234. ;Стрелка
    235. GdipDrawLineI [gdipGraphics], [hPen], 12, 92, 60, 80
    236. ;Соединение линий
    237. GdipAddPathLineI [gdipPath],  10, 200, 100, 200
    238. GdipAddPathLineI [gdipPath], 100, 200, 100, 300
    239. GdipAddPathLineI [gdipPath], 100, 300, 150, 300
    240. GdipSetPenLineJoin [hPen], LineJoinBevel
    241. GdipDrawPath [gdipGraphics], [hPen], [gdipPath]
    242. ;Прерывистая линия
    243. GdipDrawLineI [gdipGraphics], [hPen0], 100, 50, 200, 50
    244. GdipDrawLineI [gdipGraphics], [hPen0], 100, 70, 300, 70
    245. ;------------------------------------------------------------
    246. EndPaint, [hWnd], addr ps
    247. jmp .quit
    248.   .quit:
    249. endf
    250. ret
    251. endp
    252.  
     

    Вложения:

    Последнее редактирование: 8 янв 2025
    mantissa нравится это.
  7. Mikl___

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

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

    Градиент

    Код (C):
    1. ; GUI #
    2. include win64a.inc
    3. WINDOWWIDTH   equ 640
    4. WINDOWHEIGHT  equ 480
    5. WINDOWWIDTHF  equ 640.0
    6. WINDOWHEIGHTF equ 480.0
    7. RectF STRUCT
    8. Left REAL4 ?
    9. Top REAL4 ?
    10. Right REAL4 ?
    11. Bottom REAL4 ?
    12. RectF ENDS
    13. ;Various wrap modes for brushes
    14. WrapModeTile equ 0
    15. WrapModeTileFlipX equ 1
    16. WrapModeTileFlipY equ 2
    17. WrapModeTileFlipXY equ 3
    18. WrapModeClamp equ 4
    19. ; LinearGradient Modes
    20. LinearGradientModeHorizontal equ 0
    21. LinearGradientModeVertical equ 1
    22. LinearGradientModeForwardDiagonal equ 2
    23. LinearGradientModeBackwardDiagonal equ 3
    24. equRed equ 0FFFF0000h
    25. equBlue equ 0FF0080FFh
    26. .code
    27. WinMain proc
    28. local msg:MSG
    29. ;инициализация библиотеки GDIPLUS
    30.      invoke GdiplusStartup,&gdiplusToken,&gsi,0
    31.      xor ebx,ebx
    32.      mov esi,IMAGE_BASE
    33.      invoke LoadCursorFromFileA,&FileName
    34.      mov edi,offset ClassName
    35.      push rax    ;hIconSm
    36.      push rdi    ;lpszClassName
    37.      push rbx    ;lpszMenuName
    38.      push COLOR_WINDOW;hbrBackground
    39.      push rax    ;hCursor
    40.      push rax       ;hIcon
    41.      push rsi    ;hInstance
    42.      push rbx       ;cbClsExtra & cbWndExtra
    43.      pushaddr WndProc     ;lpfnWndProc
    44.      push sizeof WNDCLASSEX;cbSize & style
    45.      invoke RegisterClassExA,esp ;addr WNDCLASSEX
    46.      push rbx
    47.      push rsi ;rsi=400000h
    48.      shl esi,9 ;rsi=CW_USEDEFAULT
    49.      push rbx
    50.      push rbx
    51.      push WINDOWHEIGHT
    52.      push WINDOWWIDTH
    53.      push rsi
    54.      push rsi
    55.      sub esp,20h
    56.      invoke CreateWindowExA,WS_EX_TOOLWINDOW,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    57.     lea edi,msg
    58. @@:    invoke GetMessageA,edi,NULL,0,0
    59.      invoke DispatchMessageA,edi
    60.      jmp @b
    61. WinMain endp
    62. WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    63. local ps:PAINTSTRUCT
    64.      mov hWnd,rcx
    65.      cmp edx,WM_DESTROY
    66.      je wmDESTROY
    67.      cmp edx,WM_CREATE
    68.      je wmCREATE
    69.      cmp edx,WM_PAINT
    70.      je wmPAINT
    71.      cmp edx,WM_SIZE
    72.      je wmSIZE
    73.      cmp edx,WM_MOUSEWHEEL
    74.      je wmMOUSEWHEEL
    75.      cmp edx,WM_LBUTTONDOWN
    76.      je wmLBUTTONDOWN
    77.      leave
    78.      jmp NtdllDefWindowProc_
    79. wmDESTROY:
    80. ;уничтожить объект GDI+
    81.      invoke GdipDeleteGraphics,graphics
    82.      mov ecx,gdiplusToken
    83.      invoke GdiplusShutdown
    84.      invoke RtlExitUserProcess,NULL
    85. wmSIZE: invoke  GetClientRect,hWnd,&rect
    86.      cvtsi2ss xmm0,rect.Left
    87.      movd rect.Left,xmm0
    88.      cvtsi2ss xmm0,rect.Top
    89.      movd rect.Top,xmm0
    90.      cvtsi2ss xmm0,rect.Right
    91.      movd rect.Right,xmm0
    92.      cvtsi2ss xmm0,rect.Bottom
    93.      movd    rect.Bottom,xmm0
    94.      invoke InvalidateRgn,hWnd,NULL,FALSE
    95.      jmp wmBYE
    96. wmMOUSEWHEEL:mov eax,r8d
    97.      shr eax,16
    98.      cmp ax,1000h;.if     signed r8d > 0
    99.      jle @f
    100.      add     ChangeColor,0A050Fh
    101.      or      ChangeColor,0FF000000h
    102.      jmp @1
    103. @@:     sub     ChangeColor, 90305h
    104.      or      ChangeColor, 0FF000000h
    105. @1: invoke  InvalidateRgn, rcx, NULL, FALSE
    106.      jmp wmBYE
    107. wmLBUTTONDOWN:inc GradientMode
    108.      and GradientMode,11y
    109. wmPAINT:invoke DrawGradient
    110.      jmp wmBYE
    111. wmCREATE:invoke GdipCreateFromHWND,hWnd,&graphics    
    112. ;------------------------------------------------------------
    113. wmBYE:  leave
    114.      ret
    115. WndProc endp
    116. DrawGradient  proc
    117. LOCAL hBrush:QWORD
    118.      lea eax,hBrush
    119.      mov [rsp+28h],rax
    120.      mov qword ptr[rsp+20h],WrapModeTile
    121.      invoke GdipCreateLineBrushFromRect,&rect,equRed,ChangeColor,GradientMode
    122.      mov eax,rect.Bottom
    123.      mov [rsp+28h],rax
    124.      mov eax,rect.Right
    125.      mov [rsp+20h],rax
    126.      movd xmm3,rect.Top
    127.      movd xmm2,rect.Left
    128.      invoke GdipFillRectangle,graphics,hBrush
    129.      invoke GdipDeleteBrush, hBrush
    130.      leave
    131.      ret
    132. DrawGradient endp
    133. ;---------------------------------------
    134. .data
    135. ClassName db 'GDI+ градиент: [щелкаем левой клавишей мыши и вращаем колесико]',0
    136. FileName db "br_Rabbit3.cur",0
    137. gdiplusToken dd ?
    138. gsi GdiplusStartupInput <1,0,0,0,0>
    139. graphics dq ?
    140. GradientMode dq 0 ;how the gradient will look in the window
    141. ChangeColor dq equBlue
    142. rect RectF <0.0, 0.0, WINDOWWIDTHF, WINDOWHEIGHTF>
    143. hDC dq ?
    144. end
    Во вложении asm/exe/cur-файлы
     

    Вложения:

    • 111.png
      111.png
      Размер файла:
      7,6 КБ
      Просмотров:
      240
    • tut_01c.zip
      Размер файла:
      4,5 КБ
      Просмотров:
      77
    MaKsIm и E.D. нравится это.
  8. Mikl___

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

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

    Вывод на экран JPEG

    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. .code
    4. WinMain proc
    5. local msg:MSG
    6. ;инициализация библиотеки GDIPLUS
    7.        invoke GdiplusStartup,&gdiplusToken,&gsi,0
    8.        xor ebx,ebx
    9.        mov esi,IMAGE_BASE
    10.        invoke LoadCursorFromFileA,"br_Rabbit3.cur"
    11.        mov edi,offset ClassName
    12.        push rax    ;hIconSm
    13.        push rdi    ;lpszClassName
    14.        push rbx    ;lpszMenuName
    15.        push COLOR_WINDOW;hbrBackground
    16.        push rax    ;hCursor
    17.        push rax       ;hIcon
    18.        push rsi    ;hInstance
    19.        push rbx       ;cbClsExtra & cbWndExtra
    20.        pushaddr WndProc     ;lpfnWndProc
    21.        push sizeof WNDCLASSEX;cbSize & style
    22.        invoke RegisterClassExA,esp ;addr WNDCLASSEX
    23.        push rbx
    24.        push rsi ;rsi=400000h
    25.        shl esi,9 ;rsi=CW_USEDEFAULT
    26.        push rbx
    27.        push rbx
    28.        push 600
    29.        push 800
    30.        push rsi
    31.        push rsi
    32.        sub esp,20h
    33.        invoke CreateWindowExA,WS_EX_TOOLWINDOW,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    34.        lea edi,msg
    35. @@:    invoke GetMessageA,edi,NULL,0,0
    36.        invoke DispatchMessageA,edi
    37.        jmp @b
    38. WinMain endp
    39. WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    40. local ps:PAINTSTRUCT
    41. local hDC:HDC
    42.       mov hWnd,rcx
    43.       cmp edx,WM_DESTROY
    44.        je wmDESTROY
    45.       cmp edx,WM_CREATE
    46.        je wmCREATE
    47.        cmp edx,WM_PAINT
    48.        je wmPAINT
    49.        leave
    50.        jmp NtdllDefWindowProc_
    51. wmDESTROY:invoke GdipDisposeImage,hJPG
    52. ;уничтожить объект GDI+
    53.        invoke GdipDeleteGraphics,graphics
    54.        mov ecx,gdiplusToken
    55.        invoke GdiplusShutdown
    56.        invoke RtlExitUserProcess,NULL
    57. wmPAINT:invoke BeginPaint,hWnd,&ps
    58. ;------------------------------------------------------------
    59.        invoke GdipDrawImageI,graphics,hJPG,0,0
    60.        invoke EndPaint,hWnd,&ps
    61.        jmp wmBYE
    62. wmCREATE:invoke GdipCreateFromHWND,hWnd,&graphics
    63. ;------------------------------------------------------------
    64. ;загрузить изображение из файла
    65.        invoke GdipLoadImageFromFile,&jpegfile,&hJPG
    66. wmBYE:  leave
    67.        ret
    68. WndProc endp
    69. ;---------------------------------------
    70. .data
    71. ClassName db 'GDI+  Image Resize',0
    72. gsi GdiplusStartupInput <1,0,0,0,0>
    73. jpegfile: du <Arenalv0.jpg>
    74. .data?
    75. gdiplusToken dd ?
    76. hJPG dq ?
    77. graphics dq ?
    78. end
    Во вложении asm/exe/jpg/cur-файлы
     

    Вложения:

    • 111.png
      111.png
      Размер файла:
      399,8 КБ
      Просмотров:
      238
    • tut_01f.zip
      Размер файла:
      137,9 КБ
      Просмотров:
      79
    Последнее редактирование: 19 янв 2025
    MaKsIm, mantissa, Research и ещё 1-му нравится это.
  9. Mikl___

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

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

    Рисуем мышью

    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. .code
    4. WinMain proc
    5. local msg:MSG
    6. ;инициализация библиотеки GDIPLUS
    7.        invoke GdiplusStartup,&gdiplusToken,&gsi,0
    8.        xor ebx,ebx
    9.        mov esi,IMAGE_BASE
    10.        invoke LoadCursorFromFileA,"br_Rabbit3.cur"
    11.        mov edi,offset ClassName
    12.        mov hCursor1,rax
    13.        push rax ;hIconSm
    14.        push rdi ;lpszClassName
    15.        push rbx ;lpszMenuName
    16.        push COLOR_WINDOW+1;hbrBackground
    17.        push rax ;hCursor
    18.        push rax ;hIcon
    19.        push rsi ;hInstance
    20.        push rbx ;cbClsExtra & cbWndExtra
    21.        pushaddr WndProc   ;lpfnWndProc
    22.        push sizeof WNDCLASSEX;cbSize & style
    23.        invoke RegisterClassExA,esp ;addr WNDCLASSEX
    24.        push rbx
    25.        push rsi ;rsi=400000h
    26.        shl esi,9    ;rsi=CW_USEDEFAULT
    27.        push rbx
    28.        push rbx
    29.        push rsi
    30.        push rsi
    31.        push rsi
    32.        push rsi
    33.        sub esp,20h
    34.        invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    35.        lea edi,msg
    36. @@:    invoke GetMessageA,edi,0,0,0
    37.        invoke DispatchMessageA,edi
    38.        jmp @b
    39. WinMain endp
    40. WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    41. local ps:PAINTSTRUCT
    42. local   hdc:HDC
    43. local X:dword
    44. local Y:dword
    45.        mov hWnd,rcx
    46.        cmp edx,WM_DESTROY
    47.        je wmDESTROY
    48.        cmp edx,WM_CREATE
    49.        je wmCREATE
    50.        cmp dx,WM_LBUTTONDOWN
    51.        je wmLBUTTONDOWN
    52.        cmp dx,WM_LBUTTONUP
    53.        je wmLBUTTONUP
    54.        cmp dx,WM_MOUSEMOVE
    55.        je wmMOUSEMOVE
    56.        leave
    57.        jmp NtdllDefWindowProc_
    58. wmDESTROY:;уничтожить объект GDI+
    59.        invoke GdipDeleteGraphics,graphics
    60.        mov ecx,gdiplusToken
    61.        invoke GdiplusShutdown
    62.        invoke RtlExitUserProcess,NULL
    63. wmLBUTTONDOWN:;младшая часть lParam  = x  старшая часть lParam = y
    64.        or doDraw,TRUE
    65.        jmp wmBYE
    66. wmLBUTTONUP:and doDraw,FALSE
    67.        invoke SetCursor,hCursor1
    68.        jmp wmBYE
    69. wmMOUSEMOVE:cmp doDraw,FALSE
    70.        je wmBYE
    71.        mov X,r9d
    72.        and X,0FFFFh
    73.        shr r9,16
    74.        mov Y,r9d
    75.        invoke SetCursor,hCursor2
    76.        mov qword ptr[rsp+28h],10
    77.        mov qword ptr[rsp+20h],10
    78.        mov r9d,Y
    79.        mov r8d,X
    80.        invoke GdipFillEllipseI,graphics,hBrush
    81.        jmp wmBYE
    82. wmCREATE:invoke GdipCreateFromHWND,hWnd,&graphics
    83.        invoke GdipCreateSolidFill,0FFFF0000h,&hBrush;красный
    84.        invoke LoadCursorA,0,32631;IDC_HAND
    85.        mov hCursor2,rax
    86. wmBYE: leave
    87.        retn
    88. WndProc endp
    89. ;---------------------------------------
    90. .data
    91. ClassName db 'GDI+: Рисуем мышью',0
    92. gsi GdiplusStartupInput <1,0,0,0,0>
    93. doDraw db FALSE
    94. .data?
    95. gdiplusToken dd ?
    96. graphics dq ?
    97. hBrush dq ?
    98. hCursor1 dq ?
    99. hCursor2 dq ?
    100. end
    Во вложении asm/exe/cur-файлы
     

    Вложения:

    • 111.png
      111.png
      Размер файла:
      4,7 КБ
      Просмотров:
      193
    • tut_01q.zip
      Размер файла:
      3,8 КБ
      Просмотров:
      78
    MaKsIm, mantissa, E.D. и ещё 1-му нравится это.
  10. Mikl___

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

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

    Надписи, прямоугольники, эллипсы, линии'

    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. RectF STRUCT
    4. Left REAL4 ?
    5. Top REAL4 ?
    6. Right REAL4 ?
    7. Bottom REAL4 ?
    8. RectF ENDS
    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_WINDOW+1;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.    shl esi,9    ;rsi=CW_USEDEFAULT
    32.    push rbx
    33.    push rbx
    34.    push 400;rsi
    35.    push 560;rsi
    36.    push rsi
    37.    push rsi
    38.    sub esp,20h
    39.    invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    40.    lea edi,msg
    41. @@:invoke GetMessageA,edi,0,0,0
    42.    invoke DispatchMessageA,edi
    43.    jmp @b
    44. WinMain endp
    45. WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    46. local ps:PAINTSTRUCT
    47. local   hDC:HDC
    48.    mov hWnd,rcx
    49.    cmp edx,WM_DESTROY
    50.    je wmDESTROY
    51.    cmp edx,WM_CREATE
    52.    je wmCREATE
    53.    cmp edx,WM_PAINT
    54.    je wmPAINT
    55.    leave
    56.    jmp NtdllDefWindowProc_
    57. wmDESTROY:;уничтожить перо
    58.    invoke GdipDeletePen,hPen
    59. ;уничтожить перо
    60.    invoke GdipDeleteBrush,hBrush
    61. ;уничтожить шрифт
    62.    invoke GdipDeleteFont,gpfont
    63. ;уничтожить объект GDI+
    64.    invoke GdipDeleteGraphics,graphics
    65.    mov ecx,gdiplusToken
    66.    invoke GdiplusShutdown
    67.    invoke RtlExitUserProcess,NULL
    68. wmPAINT:invoke BeginPaint,hWnd,&ps
    69.    mov hDC,rax
    70.    invoke GdipCreateFontFromLogfont,eax,&logfont,&gpfont
    71.    invoke GdipDrawString,graphics,&wphrase,-1,gpfont,&RectText,nativeFormat,hBrush
    72.    invoke GdipDrawRectangleI,graphics,hPen, 10, 40, 200, 100
    73.    invoke GdipDrawEllipseI,graphics,hPen, 150, 120, 100, 130
    74.    xor edi,edi
    75. @@:mov r9d,edi
    76.    add r9d,10
    77.    mov qword ptr [rsp+28h],r9
    78.    mov qword ptr [rsp+20h],500
    79.    invoke GdipDrawLineI,graphics,hPen,300
    80.    add edi,6
    81.    cmp edi,50*6
    82.    jb @b
    83. ;------------------------------------------------------------
    84.    invoke EndPaint,hWnd,&ps
    85.    jmp wmBYE
    86. wmCREATE:invoke GdipCreateFromHWND,hWnd,&graphics
    87.    movd xmm1,const3_0
    88.    invoke GdipCreatePen1,0FF00FF00h,,0,&hPen
    89.    invoke GdipCreateSolidFill,0FF00C832h,&hBrush
    90.    invoke CreateFontIndirect,&logfont
    91.    mov hFont,rax
    92.    invoke SendMessageA,hWnd,WM_SETFONT,rax,0
    93. ;---------- prepare all can be possible for drawing here (WM_PAINT is faster as this)
    94.    invoke GdipCreateStringFormat,0,LANG_NEUTRAL,&nativeFormat
    95. wmBYE: leave
    96.    retn
    97. WndProc endp
    98. ;---------------------------------------
    99. .data
    100. ClassName db 'GDI+: Надписи, прямоугольники, эллипсы, линии',0
    101. gsi GdiplusStartupInput <1,0,0,0,0>
    102. const3_0 REAL4 3.0;толщина пера в формате float
    103. logfont LOGFONT <36,12,0,0,400,0,0,0,0,0,0,0,DEFAULT_PITCH or FF_SCRIPT,"Helvetica">
    104. RectText RectF <0.0,0.0,270.0,90.0>
    105. wphrase: du <hello, World>
    106. .data?
    107. gdiplusToken dd ?
    108. graphics dq ?
    109. gpfont dq ?
    110. hBrush dq ?
    111. hPen dq ?
    112. hFont dq ?
    113. nativeFormat dq ?
    114. end
    Во вложении asm/exe/cur-файлы
     

    Вложения:

    • 111.png
      111.png
      Размер файла:
      7,8 КБ
      Просмотров:
      210
    • tut_01r.zip
      Размер файла:
      4,5 КБ
      Просмотров:
      74
    MaKsIm, k3rnl, mantissa и ещё 1-му нравится это.
  11. Mikl___

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

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

    Рисование с помощью GDI+

    (по мотивам Alfonso Víctor Caballero Hurtado PintarWC01.c)
    В дополнение к объекту graphics нам понадобилось создать hPen для рисования линий и hBrush для рисования закрашенных прямоугольников.
    Программа выводит несколько типов линий и прямоугольников: закрашенный прямоугольник, линия, прямоугольник со скругленными углами, пунктирный прямоугольник, линия в виде стрелки.
    Прямоугольник со скругленными углами имеет обладает прозрачностью по отношению к объектам, расположенным под ним. Это связано с тем, уровень альфа-смешивания установлен =99h вместо 0FFh, что делало бы его полностью непрозрачным.
    Объекты нарисованы со сглаживанием, поскольку применено к объекту graphics с помощью: invoke GdipSetSmoothingMode,graphics, SmoothingModeAntiAlias
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. cdXPos          = 128
    4. cdYPos          = 128
    5. cdXSize         = 400
    6. cdYSize         = 200
    7. PenAlignmentCenter = 0
    8. SmoothingModeAntiAlias = 5
    9. UnitPixel = 2
    10. LineJoinRound = 2
    11. LineCapRoundAnchor = 12h
    12. LineCapArrowAnchor = 14h
    13. .code
    14. WinMain proc
    15. local msg:MSG
    16. ;инициализация библиотеки GDIPLUS
    17.      invoke GdiplusStartup,&gdiplusToken,&gsi,0
    18.      xor ebx,ebx
    19.      mov esi,IMAGE_BASE
    20.      invoke LoadCursorFromFileA,"br_Rabbit3.cur"
    21.      mov edi,offset ClassName
    22.      push rax    ;hIconSm
    23.      push rdi    ;lpszClassName
    24.      push rbx    ;lpszMenuName
    25.      push COLOR_BTNFACE;hbrBackground
    26.      push rax    ;hCursor
    27.      push rax       ;hIcon
    28.      push rsi    ;hInstance
    29.      push rbx       ;cbClsExtra & cbWndExtra
    30.      pushaddr WndProc     ;lpfnWndProc
    31.      push sizeof WNDCLASSEX;cbSize & style
    32.      invoke RegisterClassExA,esp ;addr WNDCLASSEX
    33.      push rbx
    34.      push rsi ;rsi=400000h
    35.      push rbx
    36.      push rbx
    37.      push cdYSize
    38.      push cdXSize
    39.      push cdYPos
    40.      push cdXPos
    41.      sub esp,20h
    42.      invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    43.      lea edi,msg
    44. @@:    invoke GetMessageA,edi,NULL,0,0
    45.      invoke DispatchMessageA,edi
    46.      jmp @b
    47. WinMain endp
    48. WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    49. local hGraphics:qword
    50. local hBrush:qword
    51. local hPen:dword
    52. local ps:PAINTSTRUCT
    53.      mov hWnd,rcx
    54.      cmp edx,WM_DESTROY
    55.      je wmDESTROY
    56.      cmp edx,WM_PAINT
    57.      je wmPAINT
    58.      cmp edx,WM_SIZE
    59.       je wmSIZE
    60.      cmp edx,WM_KEYDOWN
    61.      je wmKEYDOWN
    62.      leave
    63.      jmp NtdllDefWindowProc_
    64. wmKEYDOWN:mov al,r8b;wParam
    65.      cmp al,VK_ESCAPE;user press 'Esc'?
    66.      jne wmBYE
    67. wmDESTROY:mov ecx,gdiplusToken
    68.      invoke GdiplusShutdown
    69.      invoke RtlExitUserProcess,NULL
    70. ;------------------------------------------------------------
    71. wmSIZE: mov vdxClient,r9d
    72.      and vdxClient,0FFFFh;vdxClient = LOWORD (lParam)
    73.      shr r9d,16
    74.      mov vdyClient,r9d;vdyClient = HIWORD (lParam) ;
    75.      invoke InvalidateRect,hWnd, NULL,TRUE
    76.      jmp wmBYE
    77. wmPAINT:invoke BeginPaint,hWnd, &ps
    78.      invoke GdipCreateFromHDC,eax,&graphics
    79.      invoke GdipSetSmoothingMode,graphics, SmoothingModeAntiAlias; Рисование со сглаживанием
    80. ;  Заполненный прямоугольник
    81.      invoke GdipCreateSolidFill,0FF0064FFh,&hBrush
    82.      mov eax,vdyClient
    83.      shr eax,1
    84.      mov [rsp+28h],rax;vdyClient/2
    85.      mov eax,vdxClient
    86.      shr eax,1
    87.      mov [rsp+20h],rax;vdxClient/2
    88.      invoke GdipFillRectangleI,graphics,hBrush, 0, 0 ; Заполненный прямоугольник
    89.      invoke GdipDeleteBrush,hBrush
    90. ; Толстая линия
    91.      movd xmm1, const10;41200000h
    92.      invoke GdipCreatePen1,0FFFF0091h, , UnitPixel, &hPen
    93.      mov eax,vdyClient
    94.      mov [rsp+28h],rax
    95.      mov eax,vdxClient
    96.      mov [rsp+20h],rax
    97.      invoke GdipDrawLineI,graphics, hPen, 0, 0
    98.      invoke GdipDeletePen,hPen
    99. ; Прямоугольник с закругленными углами
    100.      movd xmm1, const10
    101.      invoke GdipCreatePen1,9964FF00h,, UnitPixel, &hPen
    102.      invoke GdipSetPenMode,hPen, PenAlignmentCenter
    103.      invoke GdipSetPenLineJoin,hPen, LineJoinRound
    104.      mov r9d,vdyClient
    105.      shr r9d,2;vdyClient/4
    106.      mov r8d,vdxClient
    107.      shr r8d,2;vdxClient/4
    108.      mov eax,r9d
    109.      add eax,eax
    110.      mov [rsp+28h],rax;2*vdyClient/4
    111.      mov eax,r8d
    112.      add eax,eax
    113.      mov [rsp+20h],rax;2*vdxClient/4
    114.      invoke GdipDrawRectangleI,graphics, hPen
    115.      invoke GdipDeletePen,hPen
    116. ; пунктиром прямоугольник
    117.      movd xmm1,const3;40400000h
    118.      invoke GdipCreatePen1,0FF00FF91h,, UnitPixel, &hPen
    119.      invoke GdipSetPenMode,hPen, PenAlignmentCenter; dashed pen
    120.      invoke GdipSetPenDashArray,hPen, &f, 4
    121.      mov eax,vdyClient
    122.      shr eax,1
    123.      mov [rsp+28h],rax;vdyClient/2
    124.      mov eax,vdxClient
    125.      sub eax,3
    126.      mov [rsp+20h],rax;vdxClient-3
    127.      mov r8d,vdxClient
    128.      shr r8d,1
    129.      inc r8d;vdxClient/2+1
    130.      invoke GdipDrawRectangleI,graphics, hPen, , 0
    131.      invoke GdipDeletePen,hPen
    132. ; Различные завершение линий
    133.      movd xmm1, const7;40E00000h
    134.      invoke GdipCreatePen1,0FF25FF73h, , UnitPixel, &hPen
    135.      invoke GdipSetPenStartCap,hPen, LineCapRoundAnchor
    136.      invoke GdipSetPenEndCap,hPen, LineCapArrowAnchor
    137.      mov eax,const10
    138.      mov qword ptr[rsp+28h],10
    139.      mov eax,vdxClient
    140.      sub eax,10
    141.      mov [rsp+20h],rax;vdxClient-10
    142.      mov r9d,vdyClient
    143.      sub r9d,10;vdyClient-10
    144.      invoke GdipDrawLineI,graphics, hPen,10
    145.      invoke GdipDeletePen,hPen
    146.      invoke GdipDeleteGraphics,graphics
    147.      invoke EndPaint,hWnd, &ps
    148. wmBYE:  leave
    149.      ret
    150. WndProc endp
    151. ;---------------------------------------
    152. .data
    153. ClassName db 'Рисование с помощью GDI+',0
    154. gsi GdiplusStartupInput <1,0,0,0,0>
    155. f dd 1.0,1.0,2.0,2.0
    156. const3 dd 3.0
    157. const7 dd 7.0
    158. const10 dd 10.0
    159. .data?
    160. gdiplusToken dd ?
    161. graphics dq ?
    162. vdxClient dd ?
    163. vdyClient dd ?
    164. end
    Во вложении asm/exe/cur-файлы
     

    Вложения:

    • 111.png
      111.png
      Размер файла:
      8,1 КБ
      Просмотров:
      154
    • GDIPlusM6401.zip
      Размер файла:
      4,8 КБ
      Просмотров:
      53
    MaKsIm нравится это.
  12. Mikl___

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

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

    Штриховые кисти в GDI+

    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. cdXPos          = 128
    4. cdYPos          = 128
    5. cdXSize         = 240
    6. cdYSize         = 240
    7. HatchStyleTotal = 53
    8. .code
    9. WinMain proc
    10. local msg:MSG
    11. ;инициализация библиотеки GDIPLUS
    12. invoke GdiplusStartup,&gdiplusToken,&gsi,0
    13. xor ebx,ebx
    14. mov esi,IMAGE_BASE
    15. invoke LoadCursorFromFileA,"br_Rabbit3.cur"
    16. mov edi,offset ClassName
    17. push rax    ;hIconSm
    18. push rdi    ;lpszClassName
    19. push rbx    ;lpszMenuName
    20. push COLOR_BTNFACE;hbrBackground
    21. push rax    ;hCursor
    22. push rax       ;hIcon
    23. push rsi    ;hInstance
    24. push rbx       ;cbClsExtra & cbWndExtra
    25. pushaddr WndProc     ;lpfnWndProc
    26.       push sizeof WNDCLASSEX;cbSize & style
    27. invoke RegisterClassExA,esp ;addr WNDCLASSEX
    28. push rbx
    29. push rsi ;rsi=400000h
    30. push rbx
    31. push rbx
    32. push cdYSize
    33. push cdXSize
    34. push cdYPos
    35. push cdXPos
    36. sub esp,20h
    37.     invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    38.     lea edi,msg
    39. @@:    invoke GetMessageA,edi,NULL,0,0
    40. invoke DispatchMessageA,edi
    41.         jmp @b
    42. WinMain endp
    43. WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    44. local ps:PAINTSTRUCT
    45. local graphics:qword
    46. local hBrush:qword
    47. local style:qword
    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.         leave
    58.         jmp NtdllDefWindowProc_
    59. wmKEYDOWN:mov al,r8b;wParam
    60. cmp al,VK_ESCAPE;user press 'Esc'?
    61. jne wmBYE
    62. wmDESTROY:;уничтожить объект GDI+
    63. mov ecx,gdiplusToken
    64. invoke GdiplusShutdown
    65. invoke RtlExitUserProcess,NULL
    66. ;------------------------------------------------------------
    67. wmPAINT:invoke BeginPaint,hWnd, &ps
    68. invoke GdipCreateFromHDC,eax, &graphics
    69. and style,0
    70. xor edi,edi
    71. @0:     xor esi,esi
    72. @1:     invoke GdipCreateHatchBrush,style,0FF000000h,0FFA0A0A0h, &hBrush
    73. mov qword ptr[rsp+28h],20
    74. mov qword ptr[rsp+20h],20
    75.         invoke GdipFillRectangleI,graphics, hBrush, esi, edi
    76.         invoke GdipDeleteBrush,hBrush
    77.         inc style
    78.         cmp style,HatchStyleTotal
    79. jb @f
    80. and style,0
    81. @@: add esi,20
    82. cmp esi,vdxClient
    83. jb @1
    84. add edi,20
    85. cmp edi,vdyClient
    86. jb @0
    87. invoke GdipDeleteGraphics,graphics
    88. invoke EndPaint,hWnd, &ps
    89. jmp wmBYE
    90. wmSIZE: mov vdxClient,r9d
    91. and vdxClient,0FFFFh;vdxClient = LOWORD (lParam) ;
    92.         shr r9d,16
    93. mov vdyClient,r9d; vdyClient = HIWORD (lParam) ;
    94. invoke InvalidateRect,hWnd, NULL,TRUE
    95. wmBYE:  leave
    96.         ret
    97. WndProc endp
    98. ;---------------------------------------
    99. .data
    100. ClassName db 'Штриховые кисти в GDI+',0
    101. gsi GdiplusStartupInput <1,0,0,0,0>
    102. .data?
    103. gdiplusToken dd ? ;
    104. vdxClient dd ? ;
    105. vdyClient dd ? ;
    106. end
    Во вложении asm/exe/cur-файлы
     

    Вложения:

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

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

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

    Градиентные кисти и кисти с текстурным наполнением

    Кисти с градиентными цветами и текстура с изображениями в эллипсах и многоугольниках. Кисть с мелкими фигурками Pacman использована для заполнения эллипса.
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. cdXPos          = 128
    4. cdYPos          = 128
    5. cdXSize         = 240
    6. cdYSize         = 240
    7. cdSizeSmPcman   = 30
    8. GpRect STRUCT
    9.        X            dd ?
    10.        Y            dd ?
    11.        Width_ dd ?
    12.        Height   dd ?
    13. GpRect ENDS
    14. WrapModeTile = 0
    15. LinearGradientModeHorizontal = 0
    16. FillModeAlternate = 0
    17. WrapModeClamp = 4
    18. .code
    19. WinMain proc
    20. local msg:MSG
    21. ;инициализация библиотеки GDIPLUS
    22.      invoke GdiplusStartup,&gdiplusToken,&gsi,0
    23.      xor ebx,ebx
    24.      mov esi,IMAGE_BASE
    25.      invoke LoadCursorFromFileA,"br_Rabbit3.cur"
    26.      mov edi,offset ClassName
    27.      push rax    ;hIconSm
    28.      push rdi    ;lpszClassName
    29.      push rbx    ;lpszMenuName
    30.      push COLOR_BTNFACE;hbrBackground
    31.      push rax    ;hCursor
    32.      push rax       ;hIcon
    33.      push rsi    ;hInstance
    34.      push rbx       ;cbClsExtra & cbWndExtra
    35.      pushaddr WndProc     ;lpfnWndProc
    36.      push sizeof WNDCLASSEX;cbSize & style
    37.      invoke RegisterClassExA,esp ;addr WNDCLASSEX
    38.      push rbx
    39.      push rsi ;rsi=400000h
    40.      push rbx
    41.      push rbx
    42.      push cdYSize
    43.      push cdXSize
    44.      push cdYPos
    45.      push cdXPos
    46.      sub esp,20h
    47.      invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    48.      lea edi,msg
    49. @@:    invoke GetMessageA,edi,NULL,0,0
    50.      invoke DispatchMessageA,edi
    51.      jmp @b
    52. WinMain endp
    53. WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    54. local ps:PAINTSTRUCT
    55.       mov hWnd,rcx
    56.       cmp edx,WM_DESTROY
    57.       je wmDESTROY
    58.       cmp edx,WM_CREATE
    59.       je wmCREATE
    60.       cmp edx,WM_SIZE
    61.       je wmSIZE
    62.       cmp edx,WM_PAINT
    63.       je wmPAINT
    64.       cmp edx,WM_KEYDOWN
    65.      je wmKEYDOWN
    66.      leave
    67.      jmp NtdllDefWindowProc_
    68. wmKEYDOWN:mov al,r8b;wParam
    69.      cmp al,VK_ESCAPE;user press 'Esc'?
    70.      jne wmBYE
    71. wmDESTROY:invoke GdipDeleteBrush,myTextureBrush
    72.      invoke GdipDeleteBrush,myLinearGradientBrush
    73.      invoke GdipDeleteBrush,myPathBrush
    74.      invoke GdipDeletePath,myPath
    75.      invoke GdipDeletePath,tuPath
    76.      invoke GdipDeleteBrush,tuPathBrush
    77. ;уничтожить объект GDI+
    78.      invoke GdipDeleteGraphics,graphics
    79.      mov ecx,gdiplusToken
    80.      invoke GdiplusShutdown
    81.      invoke RtlExitUserProcess,NULL
    82. ;------------------------------------------------------------
    83. wmPAINT:invoke BeginPaint,hWnd, &ps
    84.      invoke GdipCreateFromHDC,eax, &graphics
    85.      mov rax,vdyClient
    86.      shr eax,1
    87.      mov [rsp+28h],rax;vdyClient/2
    88.      mov rax,vdxClient
    89.      shr eax,1
    90.      mov [rsp+20h],rax;vdxClient/2
    91.      invoke GdipFillEllipseI,graphics,myTextureBrush, 0, 0
    92.      mov rax,vdyClient
    93.      shr eax,1
    94.      mov [rsp+28h],rax;vdyClient/2
    95.      mov r8,vdxClient
    96.      shr r8,1;vdxClient/2
    97.      mov [rsp+20h],r8;vdxClient/2
    98.      invoke GdipFillEllipseI,graphics,myLinearGradientBrush,,0
    99.      mov rax,vdxClient
    100.      shr eax,1
    101.      mov [rsp+28h],rax;vdxClient/2
    102.      mov r9,vdyClient
    103.      shr r9,1;vdyClient/2
    104.      mov [rsp+28h],r9;vdyClient/2
    105.      invoke GdipFillEllipseI,graphics, myPathBrush, 0,
    106.      invoke GdipFillPath,graphics, tuPathBrush, tuPath;  Заполнение с помощью градиентной кисти
    107.      invoke GdipDeleteGraphics,graphics
    108.      invoke EndPaint,hWnd, &ps
    109.      jmp wmBYE
    110. wmSIZE: mov vdxClient,r9
    111.      and vdxClient,0FFFFh;vdxClient = LOWORD (lParam) ;
    112.      shr r9d,16
    113.      mov vdyClient,r9; vdyClient = HIWORD (lParam) ;
    114.      mov rax,vdxClient
    115.      shr eax,1
    116.      mov myRect.X,eax;myRect.X = vdxClient/2;
    117.      and myRect.Y,0;myRect.Y = 0;
    118.      mov myRect.Width_,eax;myRect.Width = vdxClient/2;
    119.      mov rax,vdyClient
    120.      shr eax,1
    121.      mov myRect.Height,eax;myRect.Height = vdyClient/2;
    122.      mov eax,cdYSize
    123.      mov myPoints[0*8].y,eax;myPoints[0].Y = cdYSize
    124.      mov myPoints[1*8].y,eax;myPoints[1].Y = cdYSize
    125.      mov eax,cdYSize
    126.      mov myPoints[1*8].x,eax;myPoints[1].X = cdXSize
    127.      shr eax,1
    128.      mov myPoints[0*8].x,eax;myPoints[0].X = cdXSize/2;
    129.      mov eax,cdXSize
    130.      shr eax,2
    131.      lea eax,[eax+eax*2]
    132.      mov myPoints[2*8].x,eax;myPoints[2].X = 3*cdXSize/4;
    133.      and myPoints[2*8].y,0;myPoints[2].Y = 0;
    134.      mov rax,vdxClient
    135.      shr eax,2
    136.      lea eax,[eax+eax*2]
    137.      mov pt[0*8].x,eax;pt[0].X = 3*vdxClient/4;
    138.      mov pt[5*8].x,eax;pt[5].X = 3*vdxClient/4;
    139.      mov rax,vdyClient
    140.      shr eax,1
    141.      mov pt[0*8].y,eax;pt[0].Y = vdyClient/2
    142.      mov rax,vdxClient
    143.      shr eax,4
    144.      imul eax,eax,13
    145.      mov pt[1*8].x,eax;pt[1].X = 13*vdxClient/16;
    146.      mov rax,vdyClient
    147.      mov pt[4*8].y,eax;pt[4].Y = vdyClient;
    148.      mov pt[6*8].y,eax;pt[6].Y = vdyClient;
    149.      shr eax,3
    150.      lea eax,[eax+eax*4]
    151.      mov pt[1*8].y,eax;pt[1].Y = 5*vdyClient/8;
    152.      mov pt[2*8].y,eax;pt[2].Y = 5*vdyClient/8;
    153.      mov pt[8*8].y,eax;pt[8].Y = 5*vdyClient/8;
    154.      mov pt[9*8].y,eax;pt[9].Y = 5*vdyClient/8;
    155.      mov rax,vdxClient
    156.      mov pt[2*8].x,eax;pt[2].X = vdxClient;
    157.      mov rax,vdxClient
    158.      mov pt[4*8].x,eax;pt[4].X = vdxClient;
    159.      shr eax,3
    160.      imul eax,eax,7
    161.      mov pt[3*8].x,eax;pt[3].X = 7*vdxClient/8;
    162.      mov rax,vdyClient
    163.      shr eax,2
    164.      lea eax,[eax+eax*2]
    165.      mov pt[3*8].y,eax;pt[3].Y = 3*vdyClient/4;
    166.      mov pt[7*8].y,eax;pt[7].Y = 3*vdyClient/4;
    167.      mov rax,vdyClient
    168.      shr eax,3
    169.      imul eax,eax,7
    170.      mov pt[5*8].y,eax;pt[5].Y = 7*vdyClient/8;
    171.      mov rax,vdxClient
    172.      shr eax,1
    173.      mov pt[6*8].x,eax;pt[6].X = vdxClient/2;
    174.      mov pt[8*8].x,eax;pt[8].X = vdxClient/2;
    175.      mov rax,vdxClient
    176.      shr eax,3
    177.      lea eax,[eax+eax*4]
    178.      mov pt[7*8].x,eax; pt[7].X = 5*vdxClient/8;
    179.      mov rax,vdxClient
    180.      shr eax,4
    181.      imul eax,eax,11
    182.      mov pt[9*8].x,eax;pt[9].X = 11*vdxClient/16
    183.      lea eax,myLinearGradientBrush
    184.      mov [rsp+28h],rax
    185.      mov qword ptr[rsp+20h],WrapModeTile
    186.      invoke GdipCreateLineBrushFromRectI,&myRect,0FF0000FFh,0FFFF0000h, LinearGradientModeHorizontal
    187.      invoke GdipCreatePath,FillModeAlternate, &myPath
    188.      mov r8,vdyClient
    189.      shr r8d,1;vdyClient/2
    190.      mov [rsp+20h],r8;vdyClient/2
    191.      mov r9,vdxClient
    192.      shr r9d,1;vdxClient/2
    193.      invoke GdipAddPathEllipseI,myPath, 0
    194.      invoke GdipCreatePathGradientFromPath,myPath, &myPathBrush
    195.      invoke GdipSetPathGradientCenterColor,myPathBrush, 0FFFF00FFh
    196.      mov rax,vdxClient
    197.      cmp rax,vdyClient
    198.      cmova rax,vdyClient
    199.      shr eax,1
    200.      mov count,eax;count = min(vdxClient/2, vdyClient/2)
    201.      invoke GdipSetPathGradientSurroundColorsWithCount,myPathBrush,  &BorderColor, &count
    202.      invoke GdipCreatePathGradientI,&myPoints[0], 3, WrapModeClamp, &PathGradient
    203.      invoke GdipSetLinePresetBlend,PathGradient, &PresetColors[0], &InterpPositions[0], 3
    204.      invoke GdipCreatePath,FillModeAlternate, &tuPath;  Создать объект GraphicsPath
    205.      invoke GdipAddPathLine2I,tuPath, &pt, (sizeof pt/(sizeof POINT)); Использовать массив точек для построения пути
    206.      invoke GdipCreatePathGradientFromPath,tuPath, &tuPathBrush;  Использовать путь для создания градиентной кисти
    207.      invoke GdipSetPathGradientCenterColor,tuPathBrush,0FFFF0000h; Установить красный цвет в центре пути.
    208.      invoke GdipSetPathGradientSurroundColorsWithCount,tuPathBrush, &Colors[0], &numCols
    209.      invoke InvalidateRect,hWnd, NULL, TRUE
    210.      jmp wmBYE
    211. wmCREATE:invoke GdipLoadImageFromFile,&FileName, &myImage
    212.      invoke GetDC,hWnd
    213.      invoke GdipCreateFromHDC,eax, &graphics
    214.      invoke GdipCreateBitmapFromGraphics,cdSizeSmPcman, cdSizeSmPcman, graphics, &smBitmap
    215.      invoke GdipGetImageGraphicsContext,smBitmap, &memGraphics
    216.      invoke GdipDrawImageRectI,memGraphics, myImage, 0, 0,cdSizeSmPcman, cdSizeSmPcman; x, y координаты верхней точки, где поместим изображение
    217.      invoke GdipCreateTexture,smBitmap, WrapModeTile, &myTextureBrush
    218.      invoke GdipDeleteGraphics,smBitmap
    219.      invoke GdipDisposeImage,myImage
    220. wmBYE:  leave
    221.      ret
    222. WndProc endp
    223. ;---------------------------------------
    224. .data
    225. ClassName db 'Рисование с помощью GDI+',0
    226. gsi GdiplusStartupInput <1,0,0,0,0>
    227. PresetColors dd 0FFFFFF00h,0FFFF0000h,0FF00FF00h
    228. Colors dd 0FFFF0000h,0FFFFFF00h,0FF00FF00h,0FFFFFF00h,0FF00FFFFh,\
    229.    0FFFFFF00h,0FF00FF00h,0FFFFFF00h,0FF00FFFFh,0FFFFFF00h
    230. InterpPositions dd 0, 0.5, 1.0
    231. numCols dd 10
    232. BorderColor dd 0FF80FFFFh
    233. FileName: du <Comecocos.bmp>
    234. .data?
    235. myImage dq ?
    236. myTextureBrush dq ?
    237. smBitmap dq ?
    238. myLinearGradientBrush dq ?
    239. myPath dq ?
    240. tuPath dq ?
    241. myPathBrush dq ?
    242. PathGradient dq ?
    243. tuPathBrush dq ?
    244. myRect GpRect <>
    245. memGraphics dq ?
    246. myPoints POINT 3 dup(<>)
    247. pt POINT 10 dup(<>)
    248. count dd ?
    249. gdiplusToken dd ?
    250. vdxClient dq ?
    251. vdyClient dq ?
    252. graphics dq ?
    253. end
    Во вложении asm/exe/cur/bmp-файлы
     

    Вложения:

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

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

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

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

    Исходное изображение — это большая картинка слева, размер которой изменен в memGraphics с помощью GdipDrawImageRectI, которая использована для создания кисти с маленькими Пакманами, которая использована для заполнения эллипса.
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. cdXPos          = 128
    4. cdYPos          = 128
    5. cdXSize         = 400
    6. cdYSize         = 300
    7. WrapModeTile = 0
    8. .code
    9. WinMain proc
    10. local msg:MSG
    11. ;инициализация библиотеки GDIPLUS
    12.      invoke GdiplusStartup,&gdiplusToken,&gsi,0
    13.      xor ebx,ebx
    14.      mov esi,IMAGE_BASE
    15.      invoke LoadCursorFromFileA,"br_Rabbit3.cur"
    16.      mov edi,offset ClassName
    17.      push rax    ;hIconSm
    18.      push rdi    ;lpszClassName
    19.      push rbx    ;lpszMenuName
    20.      push COLOR_BTNFACE;hbrBackground
    21.      push rax    ;hCursor
    22.      push rax        ;hIcon
    23.      push rsi    ;hInstance
    24.      push rbx        ;cbClsExtra & cbWndExtra
    25.      pushaddr WndProc   ;lpfnWndProc
    26.      push sizeof WNDCLASSEX;cbSize & style
    27.      invoke RegisterClassExA,esp ;addr WNDCLASSEX
    28.      push rbx
    29.      push rsi    ;rsi=400000h
    30.      push rbx
    31.      push rbx
    32.      push cdYSize
    33.      push cdXSize
    34.      push cdYPos
    35.      push cdXPos
    36.      sub esp,20h
    37.     invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    38.     lea edi,msg
    39. @@:    invoke GetMessageA,edi,NULL,0,0
    40. invoke DispatchMessageA,edi
    41.      jmp @b
    42. WinMain endp
    43. WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    44. local ps:PAINTSTRUCT
    45.      mov hWnd,rcx
    46.      cmp edx,WM_DESTROY
    47.      je wmDESTROY
    48.      cmp edx,WM_SIZE
    49.      je wmSIZE
    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,hBitmap
    62.      invoke GdipDeleteGraphics,memGraphics
    63. ;уничтожить объект GDI+
    64.      mov ecx,gdiplusToken
    65.      invoke GdiplusShutdown
    66.      invoke RtlExitUserProcess,NULL
    67. ;------------------------------------------------------------
    68. wmPAINT:invoke BeginPaint,hWnd, &ps
    69.      invoke GdipCreateFromHDC,eax, &graphics
    70.      invoke GdipDrawImage,graphics, hBitmap, 0, 0
    71.      mov r8,nWidth
    72.      add r8d,20;nWidth+20
    73.      invoke GdipDrawImageI,graphics, smBitmap,, 0
    74.      mov r8,nWidth
    75.      mov [rsp+20h],r8
    76.      mov r9,nHeight
    77.      mov [rsp+28h],r9
    78.      shr r9d,2;nHeight/4
    79.      invoke GdipFillEllipseI,graphics, myTextureBrush
    80.      invoke GdipDeleteGraphics,graphics
    81.      invoke EndPaint,hWnd, &ps
    82.      jmp wmBYE
    83. wmCREATE:invoke GdipCreateFromHWND,hWnd, &graphics
    84.      invoke GdipLoadImageFromFile,&FileName, &hBitmap
    85.      invoke GdipCreateBitmapFromGraphics,40, 40, graphics, &smBitmap
    86.      invoke GdipGetImageWidth,hBitmap, &nWidth
    87.      invoke GdipGetImageHeight,hBitmap, &nHeight
    88.      invoke GdipGetImageGraphicsContext,smBitmap, &memGraphics
    89.      mov qword ptr[rsp+28h],40 ; x-size
    90.      mov qword ptr[rsp+20h],40 ; y-size
    91.      invoke GdipDrawImageRectI,memGraphics, hBitmap, 0, 0; x, y координаты верхней точки, куда поместим изображение
    92.      invoke GdipCreateTexture,smBitmap, WrapModeTile, &myTextureBrush
    93.      invoke GdipDeleteGraphics,graphics
    94.      jmp wmBYE
    95. wmSIZE: mov vdxClient,r9d
    96.      and vdxClient,0FFFFh;vdxClient = LOWORD (lParam) ;
    97.      shr r9d,16
    98.      mov vdyClient,r9d; vdyClient = HIWORD (lParam) ;
    99.      invoke InvalidateRect,hWnd, NULL,TRUE
    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. FileName: du <Comecocos.bmp>
    108. .data?
    109. gdiplusToken dd ? ;
    110. myTextureBrush dq ?
    111. memGraphics dq ?
    112. hBitmap dq ?
    113. vdxClient dd ? ;
    114. vdyClient dd ? ;
    115. nWidth dq ?
    116. nHeight dq ?
    117. smBitmap dq ?
    118. graphics dq ?
    119. end
    Во вложении asm/exe/cur/bmp-файлы
     

    Вложения:

    Последнее редактирование: 22 янв 2025 в 02:17
    MaKsIm нравится это.
  15. Mikl___

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

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

    Загрузить bmp из ресурсов с помощью GDI+

    Используется функция GdipCreateBitmapFromResource. Окно создается с учетом размеров растрового изображения. Размер растрового изображения изменяется в соответствии с размерами окна.
    asm-файл
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. cdXPos          = 128
    4. cdYPos          = 128
    5. cdXSize         = 400
    6. cdYSize         = 300
    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 ps:PAINTSTRUCT    
    44.      mov hWnd,rcx
    45.      cmp edx,WM_DESTROY
    46.      je wmDESTROY
    47.      cmp edx,WM_SIZE
    48.      je wmSIZE
    49.      cmp edx,WM_PAINT
    50.      je wmPAINT
    51.      cmp edx,WM_KEYDOWN
    52.      je wmKEYDOWN
    53.      cmp edx,WM_CREATE
    54.      je wmCREATE
    55.      leave
    56.      jmp NtdllDefWindowProc_
    57. wmKEYDOWN:mov al,r8b;wParam
    58.      cmp al,VK_ESCAPE;user press 'Esc'?
    59.      jne wmBYE
    60. wmDESTROY:invoke GdipDisposeImage,hBitmap
    61.      invoke GdipDeleteGraphics,graphics
    62. ;уничтожить объект GDI+
    63.      mov ecx,gdiplusToken
    64.      invoke GdiplusShutdown
    65.      invoke RtlExitUserProcess,NULL
    66. ;------------------------------------------------------------
    67. wmPAINT:invoke GdipDrawImageRectI,graphics, hBitmap, 0, 0, nWidth, nHeight
    68.      jmp wmBYE
    69. wmCREATE:invoke GdipCreateFromHWND,hWnd, &graphics
    70.      invoke GdipCreateBitmapFromResource,IMAGE_BASE,&szRsName,&hBitmap
    71.      invoke GdipGetImageWidth,hBitmap, &nWidth
    72.      invoke GdipGetImageHeight,hBitmap, &nHeight
    73.      jmp wmBYE
    74. wmSIZE: invoke InvalidateRect,hWnd, NULL,TRUE
    75. wmBYE:  leave
    76.      ret
    77. WndProc endp
    78. ;---------------------------------------
    79. .data
    80. ClassName db 'Загрузить bmp из ресурсов с помощью GDI+',0
    81. gsi GdiplusStartupInput <1,0,0,0,0>
    82. szRsName: du <MAIN_BMP>
    83. .data?
    84. gdiplusToken dd ? ;
    85. hBitmap dq ?
    86. nWidth dq ?
    87. nHeight dq ?
    88. graphics dq ?
    89. end
    rc-файл
    Код (C):
    1. MAIN_BMP BITMAP Comecocos.bmp
    Во вложении asm/exe/cur/rc/bmp-файлы
     

    Вложения:

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

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

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

    Вывод текста с помощью GDI+

    Текст всегда будет центрирован, так как установлено выравнивание StringAlignmentCenter
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. cdXPos          = 128
    4. cdYPos          = 128
    5. cdXSize         = 300
    6. cdYSize         = 200
    7. UnitPixel = 2
    8. SmoothingModeAntiAlias = 4
    9. StringAlignmentCenter = 1
    10. FontStyleBold = 1
    11. RectF struct
    12.        X      dd ?
    13.        Y      dd ?
    14.        Width_ dd ?
    15.        Height dd ?
    16. RectF ends
    17. .code
    18. WinMain proc
    19. local msg:MSG
    20. ;инициализация библиотеки GDIPLUS
    21.        invoke GdiplusStartup,&gdiplusToken,&gsi,0
    22.        xor ebx,ebx
    23.        mov esi,IMAGE_BASE
    24.        invoke LoadCursorFromFileA,"br_Rabbit3.cur"
    25.        mov edi,offset ClassName
    26.        push rax    ;hIconSm
    27.        push rdi    ;lpszClassName
    28.        push rbx    ;lpszMenuName
    29.        push COLOR_BTNFACE;hbrBackground
    30.        push rax    ;hCursor
    31.        push rax       ;hIcon
    32.        push rsi    ;hInstance
    33.        push rbx       ;cbClsExtra & cbWndExtra
    34.        pushaddr WndProc     ;lpfnWndProc
    35.        push sizeof WNDCLASSEX;cbSize & style
    36.        invoke RegisterClassExA,esp ;addr WNDCLASSEX
    37.        push rbx
    38.        push rsi ;rsi=400000h
    39.        push rbx
    40.        push rbx
    41.        push cdYSize
    42.        push cdXSize
    43.        push cdYPos
    44.        push cdXPos
    45.        sub esp,20h
    46.        invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    47.        lea edi,msg
    48. @@:invoke GetMessageA,edi,NULL,0,0
    49.        invoke DispatchMessageA,edi
    50.         jmp @b
    51. WinMain endp
    52. WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    53. local ps:PAINTSTRUCT
    54.      mov hWnd,rcx
    55.      cmp edx,WM_DESTROY
    56.      je wmDESTROY
    57.      cmp edx,WM_SIZE
    58.      je wmSIZE
    59.      cmp edx,WM_PAINT
    60.      je wmPAINT
    61.      cmp edx,WM_KEYDOWN
    62.      je wmKEYDOWN
    63.      cmp edx,WM_CREATE
    64.      je wmCREATE
    65.      leave
    66.      jmp NtdllDefWindowProc_
    67. wmKEYDOWN:mov al,r8b;wParam
    68.      cmp al,VK_ESCAPE;user press 'Esc'?
    69.      jne wmBYE
    70. wmDESTROY:invoke GdipDeleteBrush,hBrush
    71.      invoke GdipDisposeImage,hBitmap
    72. ;уничтожить объект GDI+
    73.      mov ecx,gdiplusToken
    74.      invoke GdiplusShutdown
    75.      invoke RtlExitUserProcess,NULL
    76. ;------------------------------------------------------------
    77. wmPAINT:invoke BeginPaint,hWnd,&ps
    78.      invoke GdipCreateFromHDC,eax,&graphics
    79.      invoke GdipSetPageUnit,graphics,UnitPixel
    80.      mov eax,nHeight
    81.      mov [rsp+28h],rax
    82.      mov eax,nWidth
    83.      mov [rsp+20h],rax
    84.      invoke GdipDrawImageRectI,graphics,hBitmap,0,0
    85. ; Загружаем фоновое изображение и растягиваем его на все окно    
    86.      invoke GdipSetSmoothingMode,graphics, SmoothingModeAntiAlias;  Рисование со сглаживанием
    87.      invoke GdipDrawString,graphics,szMensaje,-1,hFont,&rect,hStringFormat, hBrush
    88.      invoke GdipDeleteGraphics,graphics
    89.      invoke EndPaint,hWnd,&ps
    90.      jmp wmBYE
    91. wmCREATE:invoke GdipLoadImageFromFile,&FileName, &hBitmap
    92.      invoke GdipCreateStringFormat,0, 0, &hStringFormat
    93.      invoke GdipSetStringFormatAlign,hStringFormat, StringAlignmentCenter
    94.      invoke GdipSetStringFormatLineAlign,hStringFormat, StringAlignmentCenter
    95.        invoke GdipCreateFontFamilyFromName,&FontName, 0, &hFontFamily
    96.      movd xmm1,cdemSize
    97.      invoke GdipCreateFont,hFontFamily, , FontStyleBold, 3, &hFont
    98.      invoke GdipDeleteFontFamily,hFontFamily
    99.      invoke GdipCreateSolidFill,0FF0000FFh, &hBrush
    100.      jmp wmBYE
    101. wmSIZE: mov eax,r9d
    102.      and eax,0FFFFh
    103.      mov nWidth,eax
    104.      cvtsi2ss xmm0,eax
    105.      movd rect.Width_,xmm0;rect.Width  = (float) LOWORD (lParam) ;
    106.      shr r9d,10h
    107.      mov nHeight,r9d
    108.      cvtsi2ss xmm0,r9d
    109.      movd rect.Height,xmm0;rect.Height = (float) HIWORD (lParam)
    110.      invoke InvalidateRect,hWnd, NULL,TRUE
    111. wmBYE:  leave
    112.      ret
    113. WndProc endp
    114. ;---------------------------------------
    115. .data
    116. ClassName db 'Вывод текста в GDI+',0
    117. gsi GdiplusStartupInput <1,0,0,0,0>
    118. szMensaje: du <Привет из GDI+>
    119. rect RectF <0,0,0,0>
    120. FontName: du <Tahoma>
    121. FileName: du <Backgrnd.gif>
    122. cdemSize        dd 36.0
    123. .data?
    124. gdiplusToken dd ?
    125. hBitmap dq ?
    126. hStringFormat dq ?
    127. hFont dq ?
    128. hFontFamily dq ?
    129. hBrush dq ?
    130. graphics dq ?
    131. nWidth dd ?
    132. nHeight dd ?
    133. end
    Во вложении asm/exe/cur/gif-файлы
     

    Вложения:

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

    Вложения:

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

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

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

    Вращение фигуры в GDI+

    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. cdXPos          = 128
    4. cdYPos          = 128
    5. cdXSize         = 250
    6. cdYSize         = 200
    7. width_ = 155
    8. height = 5
    9. cdIdTimer       = 1
    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 memGraphics:qword
    48. local hbmpBuf:qword
    49. local graphics:qword
    50. local ps:PAINTSTRUCT
    51.       mov hWnd,rcx
    52.       cmp edx,WM_DESTROY
    53.       je wmDESTROY
    54.       cmp edx,WM_TIMER
    55.       je wmTIMER
    56.       cmp edx,WM_SIZE
    57.       je wmSIZE
    58.       cmp edx,WM_CREATE
    59.       je wmCREATE
    60.       cmp edx,WM_KEYDOWN
    61.        je wmKEYDOWN
    62.       cmp edx,WM_PAINT
    63.        je wmPAINT
    64.         leave
    65.         jmp NtdllDefWindowProc_
    66. wmKEYDOWN:mov al,r8b;wParam
    67.        cmp al,VK_ESCAPE;user press 'Esc'?
    68.        jne wmBYE
    69. wmDESTROY:invoke KillTimer,hWnd, cdIdTimer
    70.        invoke GdipDeleteBrush,hBrush
    71.        mov ecx,gdiplusToken
    72.        invoke GdiplusShutdown
    73.        invoke RtlExitUserProcess,NULL
    74. ;------------------------------------------------------------
    75. wmPAINT:invoke BeginPaint,hWnd, &ps
    76.        invoke GdipCreateFromHDC,eax,&graphics
    77. ;----------------------------------------
    78. ; Создаем двойной буфер в medGraphics, связанный с hbmpBuf
    79.        mov ecx,vdxClient
    80.        mov edx,vdyClient
    81.        invoke GdipCreateBitmapFromGraphics,,,graphics, &hbmpBuf
    82.        invoke GdipGetImageGraphicsContext,hbmpBuf, &memGraphics
    83. ;------------------------------------------
    84.        invoke GdipGraphicsClear,memGraphics,0FFFFFFFFh; Очистить буфер
    85.        mov eax,centrex
    86.        neg eax
    87.        cvtsi2ss xmm1,eax;(float)-centrex
    88.        mov eax,centrey
    89.        neg eax
    90.        cvtsi2ss xmm2,eax;(float)-centrey
    91.        invoke GdipTranslateWorldTransform,memGraphics,,,MatrixOrderAppend
    92.        cvtsi2ss xmm1,iAng;(float)iAng
    93.        invoke GdipRotateWorldTransform,memGraphics,,MatrixOrderAppend
    94.        cvtsi2ss xmm1,centrex;(float)centrex
    95.        cvtsi2ss xmm2,centrey;(float)centrey
    96.        invoke GdipTranslateWorldTransform,memGraphics,,,MatrixOrderAppend
    97.        mov qword ptr[rsp+28h],height
    98.        mov qword ptr[rsp+20h],width_
    99.        mov r9d,topy
    100.        mov r8d,topx
    101.        invoke GdipFillRectangleI,memGraphics, hBrush; Заполненный прямоугольник
    102. ; Выводим содержимое буфера на экран (hGraphics)
    103.        mov qword ptr[rsp+40h],2
    104.        mov eax,vdyClient
    105.        mov qword ptr[rsp+38h],rax;cdYSize
    106.        mov eax,vdxClient
    107.        mov qword ptr[rsp+30h],rax
    108.        xor r8,r8
    109.        mov [rsp+28h],r8
    110.        mov [rsp+20h],r8
    111.        invoke GdipDrawImagePointRectI,graphics, hbmpBuf,,0
    112.        invoke GdipDisposeImage,hbmpBuf
    113.        invoke GdipDeleteGraphics,memGraphics
    114.        invoke GdipDeleteGraphics,graphics
    115.        invoke EndPaint,hWnd, &ps
    116.        jmp wmBYE
    117. wmCREATE:invoke SetTimer,hWnd, cdIdTimer, 200, NULL
    118.        invoke GdipCreateSolidFill,0FF0000FFh,&hBrush
    119.        jmp wmBYE
    120. wmSIZE: mov vdxClient,r9d
    121.        and vdxClient,0FFFFh;vdxClient = LOWORD (lParam)
    122.        shr r9d,16
    123.        mov vdyClient,r9d;vdyClient = HIWORD (lParam) ;
    124.        shr r9d,1
    125.        mov centrey,r9d;centrey=vdyClient/2
    126.        mov eax,vdxClient
    127.        mov ecx,eax
    128.        shr ecx,1
    129.        mov centrex,ecx;centrex=vdxClient/2
    130.        sub eax,width_
    131.        jns @f
    132.        neg eax
    133. @@: shr eax,1
    134.        mov topx,eax;topx = (vdxClient-width)/2,
    135.        mov eax,vdyClient
    136.        sub eax,height
    137.        shr eax,1
    138.        mov topy,eax;topy = (vdyClient-height)/2;
    139.        jmp wmBYE
    140. wmTIMER:mov eax,iAng
    141.        add eax,20
    142.        cmp eax,360;101101000
    143.        jb @f
    144.        xor eax,eax
    145. @@:     mov iAng,eax
    146.        invoke InvalidateRect,hWnd, NULL, TRUE
    147. wmBYE:  leave
    148.         ret
    149. WndProc endp
    150. ;---------------------------------------
    151. .data
    152. ClassName db 'Вращение фигуры в GDI+',0
    153. gsi GdiplusStartupInput <1,0,0,0,0>
    154. const2 dd 2.0
    155. iAng dd 0
    156. .data?
    157. gdiplusToken dd ?
    158. vdxClient dd ?
    159. vdyClient dd ?
    160. hBrush dq ?
    161. topx dd ?
    162. topy dd ?
    163. centrex dd ?
    164. centrey dd ?
    165. end
    Во вложении asm/exe/cur-файлы
     

    Вложения:

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

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

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

    Вращение фигуры в GDI+

    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. cdXPos          = 128
    4. cdYPos          = 128
    5. cdXSize         = 320
    6. cdYSize         = 220
    7. SmoothingModeInvalid = 0
    8. SmoothingModeDefault = 1
    9. SmoothingModeHighSpeed = 2
    10. SmoothingModeHighQuality = 3
    11. SmoothingModeNone = 4
    12. SmoothingModeAntiAlias = 5
    13. SmoothingModeAntiAlias8x4 = 6
    14. SmoothingModeAntiAlias8x8 = 7
    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 hdc:HDC          ;
    52. local ps:PAINTSTRUCT
    53. local hGraphics:qword
    54. local hBrush:qword
    55.       mov hWnd,rcx
    56.       cmp edx,WM_DESTROY
    57.       je wmDESTROY
    58.       cmp edx,WM_PAINT
    59.       je wmPAINT
    60.       cmp edx,WM_SIZE
    61.       je wmSIZE
    62.       cmp edx,WM_KEYDOWN
    63.       je wmKEYDOWN
    64.       leave
    65.        jmp NtdllDefWindowProc_
    66. wmKEYDOWN:mov al,r8b;wParam
    67.      cmp al,VK_ESCAPE;user press 'Esc'?
    68.      jne wmBYE
    69. wmDESTROY:mov ecx,gdiplusToken
    70.      invoke GdiplusShutdown
    71.      invoke RtlExitUserProcess,NULL
    72. ;------------------------------------------------------------
    73. wmSIZE: mov vdxClient,r9d
    74.      and vdxClient,0FFFFh;vdxClient = LOWORD (lParam)
    75.      shr r9d,16
    76.      mov vdyClient,r9d;vdyClient = HIWORD (lParam) ;
    77.      invoke InvalidateRect,hWnd, NULL, TRUE
    78.      jmp wmBYE
    79. wmPAINT:invoke BeginPaint,hWnd, &ps
    80.      mov hdc,rax
    81.      invoke GdipCreateFromHDC,eax,&graphics
    82.      invoke GdipSetSmoothingMode,graphics, SmoothingModeAntiAlias;  Рисование со сглаживанием
    83. ;         Заполненный прямоугольник
    84.      invoke GdipCreateSolidFill,0FF0000FFh,&hBrush
    85.      xor edi,edi
    86. @@: cvtsi2ss xmm1,edi
    87.      invoke GdipRotateWorldTransform,graphics,, 1
    88.      cvtsi2ss xmm1,vdxClient
    89.      divss xmm1,const2; (float)vdxClient/2.0
    90.      cvtsi2ss xmm2,vdyClient
    91.      divss xmm2,const2;(float)vdyClient/2.0
    92.      invoke GdipTranslateWorldTransform,graphics,,,1
    93.      mov r8d,10
    94.      mov [rsp+28h],r8
    95.      mov qword ptr[rsp+20h], 70
    96.      invoke GdipFillRectangleI,graphics, hBrush,,10;  Заполненный прямоугольник
    97.      invoke GdipResetWorldTransform,graphics
    98.      add edi,40
    99.      cmp edi,360
    100.      jb @b
    101.      invoke GdipDeleteBrush,hBrush
    102.      invoke GdipDeleteGraphics,graphics
    103.      invoke EndPaint,hWnd, &ps
    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. const2 dd 2.0
    112. .data?
    113. gdiplusToken dd ?
    114. graphics dq ?
    115. vdxClient dd ?
    116. vdyClient dd ?
    117. end
    Во вложении asm/exe/cur-файлы
     

    Вложения:

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

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

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

    Вращение текста в GDI+

    Вращение выполняется функцией GdipRotateWorldTransform, перемещение — с помощью GdipRotateWorldTransform, что необходимо, если мы не хотим, чтобы объект вращался на экране вокруг точки (0,0) . Поскольку вращение является инкрементным, необходимо сбросить его в начало координат с помощью GdipResetWorldTransform. Выравнивание шрифта установлено с помощью StringAlignmentNear. При изменении размера экрана созданная фигура будет располагаться по центру.
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. cdXPos          = 128
    4. cdYPos          = 128
    5. cdXSize         = 450
    6. cdYSize         = 400
    7. MatrixOrderAppend = 1
    8. UnitPixel = 2
    9. SmoothingModeAntiAlias = 4
    10. StringAlignmentCenter = 1
    11. FontStyleBold = 1
    12. RectF struct
    13.        X      dd ?
    14.        Y      dd ?
    15.        Width_ dd ?
    16.        Height dd ?
    17. RectF ends
    18. .code
    19. WinMain proc
    20. local msg:MSG
    21. ;инициализация библиотеки GDIPLUS
    22.        invoke GdiplusStartup,&gdiplusToken,&gsi,0
    23.        xor ebx,ebx
    24.        mov esi,IMAGE_BASE
    25.        invoke LoadCursorFromFileA,"br_Rabbit3.cur"
    26.        mov edi,offset ClassName
    27.        push rax    ;hIconSm
    28.        push rdi    ;lpszClassName
    29.        push rbx    ;lpszMenuName
    30.        push COLOR_BTNFACE;hbrBackground
    31.        push rax    ;hCursor
    32.        push rax       ;hIcon
    33.        push rsi    ;hInstance
    34.        push rbx       ;cbClsExtra & cbWndExtra
    35.        pushaddr WndProc     ;lpfnWndProc
    36.       push sizeof WNDCLASSEX;cbSize & style
    37.        invoke RegisterClassExA,esp ;addr WNDCLASSEX
    38.        push rbx
    39.        push rsi ;rsi=400000h
    40.        push rbx
    41.        push rbx
    42.        push cdYSize
    43.        push cdXSize
    44.        push cdYPos
    45.        push cdXPos
    46.        sub esp,20h
    47.     invoke CreateWindowExA,0,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE
    48.     lea edi,msg
    49. @@:    invoke GetMessageA,edi,NULL,0,0
    50.        invoke DispatchMessageA,edi
    51.         jmp @b
    52. WinMain endp
    53. WndProc proc hWnd:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    54. local ps:PAINTSTRUCT
    55.       mov hWnd,rcx
    56.       cmp edx,WM_DESTROY
    57.       je wmDESTROY
    58.       cmp edx,WM_SIZE
    59.       je wmSIZE
    60.       cmp edx,WM_PAINT
    61.       je wmPAINT
    62.       cmp edx,WM_KEYDOWN
    63.        je wmKEYDOWN
    64.       cmp edx,WM_CREATE
    65.        je wmCREATE
    66.         leave
    67.         jmp NtdllDefWindowProc_
    68. wmKEYDOWN:mov al,r8b;wParam
    69.        cmp al,VK_ESCAPE;user press 'Esc'?
    70.        jne wmBYE
    71. wmDESTROY:invoke GdipDeleteBrush,hBrush
    72. ;уничтожить объект GDI+
    73.        mov ecx,gdiplusToken
    74.        invoke GdiplusShutdown
    75.        invoke RtlExitUserProcess,NULL
    76. ;------------------------------------------------------------
    77. wmPAINT:invoke BeginPaint,hWnd,&ps
    78.        invoke GdipCreateFromHDC,eax,&graphics
    79.        xor edi,edi
    80. @@: cvtsi2ss xmm1,edi
    81. ;Вращение достигается с помощью GdipRotateWorldTransform
    82. ;перемещение — с помощью GdipTranslateWorldTransform
    83.        invoke GdipRotateWorldTransform,graphics,, 1
    84.        cvtsi2ss xmm1,nWidth
    85.        divss xmm1,const2; (float)vdxClient/2.0
    86.        cvtsi2ss xmm2,nHeight
    87.        divss xmm2,const2;(float)vdyClient/2.0
    88.        invoke GdipTranslateWorldTransform,graphics,,,MatrixOrderAppend
    89.        invoke GdipDrawString,graphics,szMensaje,-1,hFont,&rect,hStringFormat, hBrush
    90.        invoke GdipResetWorldTransform,graphics
    91.        add edi,30
    92.        cmp edi,360
    93.        jb @b
    94.        invoke GdipDeleteGraphics,graphics
    95.         invoke EndPaint,hWnd,&ps
    96.        jmp wmBYE
    97. wmCREATE:invoke GdipCreateStringFormat,0, 0, &hStringFormat
    98.        invoke GdipSetStringFormatAlign,hStringFormat, StringAlignmentCenter
    99.        invoke GdipSetStringFormatLineAlign,hStringFormat, StringAlignmentCenter
    100.        invoke GdipCreateFontFamilyFromName,&FontName, 0, &hFontFamily
    101.        movd xmm1,cdemSize
    102.        invoke GdipCreateFont,hFontFamily, , FontStyleBold, 3, &hFont
    103.        invoke GdipDeleteFontFamily,hFontFamily
    104.        invoke GdipCreateSolidFill,0FF0000FFh, &hBrush
    105.        jmp wmBYE
    106. wmSIZE: mov eax,r9d
    107.        and eax,0FFFFh
    108.        mov nWidth,eax
    109.        cvtsi2ss xmm0,eax
    110.        movd rect.Width_,xmm0;rect.Width  = (float) LOWORD (lParam) ;
    111.        divss xmm0,const_4
    112.        movd rect.X,xmm0
    113.        shr r9d,10h
    114.        mov nHeight,r9d
    115.        cvtsi2ss xmm0,r9d
    116.        movd rect.Height,xmm0;rect.Height = (float) HIWORD (lParam)
    117.        divss xmm0,const_4
    118.        movd rect.Y,xmm0
    119.        invoke InvalidateRect,hWnd, NULL,TRUE
    120. wmBYE:  leave
    121.         ret
    122. WndProc endp
    123. ;---------------------------------------
    124. .data
    125. ClassName db 'Вращение текста в GDI+',0
    126. gsi GdiplusStartupInput <1,0,0,0,0>
    127. szMensaje: du <Привет из GDI+>
    128. FontName: du <Tahoma>
    129. cdemSize        dd 18.0
    130. const2 dd 2.0
    131. const_4 dd -4.0
    132. .data?
    133. gdiplusToken dd ?
    134. hStringFormat dq ?
    135. hFont dq ?
    136. hFontFamily dq ?
    137. hBrush dq ?
    138. graphics dq ?
    139. nWidth dd ?
    140. nHeight dd ?
    141. rect RectF <>
    142. end
    Во вложении asm/exe/cur-файлы
     

    Вложения:

    MaKsIm, k3rnl и E.D. нравится это.