Аналоговые часы GDI+

Тема в разделе "WASM.GUI", создана пользователем Orbit, 8 окт 2017.

  1. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    95
    Адрес:
    г. Москва
    Я не спешу особо никуда, хотелось бы поработать с GDI+
    Ни чего не отрисовывается, где-то ошибся : (

    Код (ASM):
    1.  
    2. format PE64 GUI 6.0
    3. entry start
    4. include 'win64a.inc'
    5.  
    6. section '.code' code readable executable
    7. ;----------------------------------------------------------------------
    8. start:
    9.   sub  rsp,8  ; Make stack dqword aligned
    10.   invoke GetModuleHandle,0
    11.   mov [wc.hInstance],rax
    12.   mov [wc.cbSize],sizeof.WNDCLASSEX
    13.   mov [wc.style],CS_HREDRAW or CS_VREDRAW
    14.   mov [wc.lpfnWndProc],WindowProc
    15.   mov [wc.cbClsExtra],0
    16.   invoke LoadIcon,0,IDI_APPLICATION
    17.   mov [wc.hIcon],rax
    18.   mov [wc.hIconSm],rax
    19.   invoke LoadCursor,0,IDC_ARROW
    20.   mov [wc.hCursor],rax
    21.   mov [wc.hbrBackground],COLOR_WINDOW+1
    22.   mov [wc.lpszMenuName],NULL
    23.   mov [wc.lpszClassName],szTitle
    24.   invoke RegisterClassEx,wc
    25.   invoke CreateWindowEx,0,szTitle,szTitle,WS_OVERLAPPED + WS_VISIBLE + WS_CAPTION + WS_SYSMENU + WS_MINIMIZEBOX ,CW_USEDEFAULT,CW_USEDEFAULT,444,444,NULL,NULL,[wc.hInstance],NULL
    26.  
    27. msg_loop:
    28.   invoke  GetMessage,msg,NULL,0,0
    29.   or  rax,rax
    30.   je  exit
    31.   invoke  TranslateMessage,msg
    32.   invoke  DispatchMessage,msg
    33.   jmp  msg_loop
    34.   exit:
    35.   invoke ExitProcess,[msg.wParam]
    36. ;----------------------------------------------------------------------
    37. proc WindowProc hwnd,wmsg,wparam,lparam
    38.   mov [hwnd],rcx
    39.   mov [wmsg],rdx
    40.   mov [wparam],r8
    41.   mov [lparam],r9
    42.  
    43.   cmp [wmsg],WM_CREATE
    44.   je .create
    45.  
    46.   cmp [wmsg],WM_TIMER
    47.   je .timer
    48.  
    49.   cmp [wmsg],WM_PAINT
    50.   je .paint
    51.  
    52.   cmp [wmsg],WM_DESTROY
    53.   jne .defwndproc
    54.  
    55.   invoke PostQuitMessage,0
    56.   jmp .exit
    57.  
    58.   .defwndproc:
    59.   invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
    60.   ret
    61.  
    62.   .create:
    63.  
    64.   mov  [GdiplusSInput.GdiplusVersion],1
    65.   mov  [GdiplusSInput.DebugEventCallback],0
    66.   mov  [GdiplusSInput.SuppressBackgroundThread],0
    67.   mov  [GdiplusSInput.SuppressExternalCodecs],0
    68.  
    69.   invoke GdiplusStartup,GdiplusToken,GdiplusSInput,0
    70.   invoke GdipCreatePen1,0ff0000ffh,40400000h,UnitPixel,hPen
    71.  
    72.   invoke GetLocalTime,systime
    73.  
    74.   .timer:
    75.  
    76.   .paint:
    77.  
    78.   invoke BeginPaint,wc.hInstance,ps
    79.   invoke GdipCreateFromHDC,[ps.hdc],hGraphics
    80.   invoke GdipSetSmoothingMode,hGraphics,SmoothingModeAntiAlias
    81.   invoke GdipGraphicsClear,hGraphics,0ffffffffh
    82.   invoke GdipDrawEllipseI,hGraphics,hPen,100,100,200,200
    83.   invoke GdipDeleteGraphics,hGraphics
    84.   invoke EndPaint,wc.hInstance,ps
    85.  
    86.   .exit:
    87.   ret
    88. endp
    89. ;----------------------------------------------------------------------
    90. section '.data' data readable writeable
    91.  
    92. szTitle db 'CLOCK',0
    93.  
    94. UnitPixel = 2
    95. SmoothingModeAntiAlias = 4
    96.  
    97. hPen dq ?
    98. GdiplusToken dq ?
    99. hGraphics dq ?
    100.  
    101. struct GdiplusStartupInput
    102.   GdiplusVersion  dd ?
    103.   DebugEventCallback  dq ?
    104.   SuppressBackgroundThread  dd ?
    105.   SuppressExternalCodecs  dd ?
    106. ends
    107.  
    108. wc WNDCLASSEX
    109. msg MSG
    110. systime SYSTEMTIME
    111. GdiplusSInput GdiplusStartupInput
    112. ps PAINTSTRUCT
    113. ;----------------------------------------------------------------------
    114.  
    115. section '.idata' import data readable writeable
    116.  
    117.   library kernel,'KERNEL32.DLL',\
    118.   user,'USER32.DLL',\
    119.   gdiplus,'GDIPLUS.DLL'
    120.  
    121.   import gdiplus,\
    122.   GdiplusStartup,'GdiplusStartup',\
    123.   GdipCreatePen1,'GdipCreatePen1',\
    124.   GdipCreateFromHDC,'GdipCreateFromHDC',\
    125.   GdipSetSmoothingMode,'GdipSetSmoothingMode',\
    126.   GdipGraphicsClear,'GdipGraphicsClear',\
    127.   GdipDrawEllipseI,'GdipDrawEllipseI',\
    128.   GdipDeleteGraphics,'GdipDeleteGraphics'
    129.  
    130.   import kernel,\
    131.   ExitProcess,'ExitProcess',\
    132.   GetModuleHandle,'GetModuleHandleA',\
    133.   GetLocalTime,'GetLocalTime'
    134.  
    135.   import user,\
    136.   BeginPaint,'BeginPaint',\
    137.   EndPaint,'EndPaint',\
    138.   PostQuitMessage,'PostQuitMessage',\
    139.   LoadIcon,'LoadIconA',\
    140.   LoadCursor,'LoadCursorA',\
    141.   RegisterClassEx,'RegisterClassExA',\
    142.   CreateWindowEx,'CreateWindowExA',\
    143.   DefWindowProc,'DefWindowProcA',\
    144.   GetMessage,'GetMessageA',\
    145.   TranslateMessage,'TranslateMessage',\
    146.   DispatchMessage,'DispatchMessageA'
    147.  
    запутался наверное а скобках [ ], адреса и значения переменных
    если вообще программа доходит до нужного места, не видно ни в IDA ни в x64dbg
     
    Последнее редактирование: 9 окт 2017
  2. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    311
    Код (ASM):
    1. format PE64 GUI 6.0
    2. entry start
    3. include 'win64a.inc'
    4. section '.code' code readable executable
    5. ;----------------------------------------------------------------------
    6. start:
    7.   sub  rsp,8  ; Make stack dqword aligned
    8.   invoke GetModuleHandle,0
    9.   mov [wc.hInstance],rax
    10.   mov [wc.cbSize],sizeof.WNDCLASSEX
    11.   mov [wc.style],CS_HREDRAW or CS_VREDRAW
    12.   mov [wc.lpfnWndProc],WindowProc
    13.   mov [wc.cbClsExtra],0
    14.   invoke LoadIcon,0,IDI_APPLICATION
    15.   mov [wc.hIcon],rax
    16.   mov [wc.hIconSm],rax
    17.   invoke LoadCursor,0,IDC_ARROW
    18.   mov [wc.hCursor],rax
    19.   mov [wc.hbrBackground],COLOR_WINDOW+1
    20.   mov [wc.lpszMenuName],NULL
    21.   mov [wc.lpszClassName],szTitle
    22.   invoke RegisterClassEx,wc
    23.   invoke CreateWindowEx,0,szTitle,szTitle,WS_OVERLAPPED + WS_VISIBLE + WS_CAPTION + WS_SYSMENU + WS_MINIMIZEBOX ,CW_USEDEFAULT,CW_USEDEFAULT,444,444,NULL,NULL,[wc.hInstance],NULL
    24. msg_loop:
    25.   invoke  GetMessage,msg,NULL,0,0
    26.   or  rax,rax
    27.   je  exit
    28.   invoke  TranslateMessage,msg
    29.   invoke  DispatchMessage,msg
    30.   jmp  msg_loop
    31.   exit:
    32.   invoke ExitProcess,[msg.wParam]
    33. ;----------------------------------------------------------------------
    34. proc WindowProc hwnd,wmsg,wparam,lparam
    35.   mov [hwnd],rcx
    36.   mov [wmsg],rdx
    37.   mov [wparam],r8
    38.   mov [lparam],r9
    39.   cmp [wmsg],WM_CREATE
    40.   je .create
    41.   cmp [wmsg],WM_TIMER
    42.   je .timer
    43.   cmp [wmsg],WM_PAINT
    44.   je .paint
    45.   cmp [wmsg],WM_DESTROY
    46.   jne .defwndproc
    47.   invoke PostQuitMessage,0
    48.   jmp .exit
    49.   .defwndproc:
    50.   invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
    51.   ret
    52.   .create:
    53.   mov  [GdiplusSInput.GdiplusVersion],1
    54.   mov  [GdiplusSInput.DebugEventCallback],0
    55.   mov  [GdiplusSInput.SuppressBackgroundThread],0
    56.   mov  [GdiplusSInput.SuppressExternalCodecs],0
    57.   invoke GdiplusStartup,GdiplusToken,GdiplusSInput,0
    58.   invoke GdipCreatePen1,0ff0000ffh,float dword 3.0,UnitPixel,hPen
    59.   invoke GetLocalTime,systime
    60.  
    61.   jmp .exit
    62.  
    63.   .timer:
    64.  
    65.   jmp .exit
    66.  
    67.   .paint:
    68.   invoke BeginPaint,[hwnd],ps
    69.   invoke GdipCreateFromHDC,[ps.hdc],hGraphics
    70.   invoke GdipSetSmoothingMode,[hGraphics],SmoothingModeAntiAlias
    71.   invoke GdipGraphicsClear,[hGraphics],0ffffffffh
    72.   invoke GdipDrawEllipseI,[hGraphics],[hPen],100,100,200,200
    73.   invoke GdipDeleteGraphics,[hGraphics]
    74.   invoke EndPaint,[hwnd],ps
    75.   .exit:
    76.  
    77.   ret
    78.  
    79. endp
    80. ;----------------------------------------------------------------------
    81. section '.data' data readable writeable
    82. szTitle db 'CLOCK',0
    83. UnitPixel = 2
    84. SmoothingModeAntiAlias = 4
    85. hPen dq ?
    86. GdiplusToken dq ?
    87. hGraphics dq ?
    88. struct GdiplusStartupInput
    89.   GdiplusVersion  dd ?
    90.   DebugEventCallback  dq ?
    91.   SuppressBackgroundThread  dd ?
    92.   SuppressExternalCodecs  dd ?
    93. ends
    94. wc WNDCLASSEX
    95. msg MSG
    96. systime SYSTEMTIME
    97. GdiplusSInput GdiplusStartupInput
    98. ps PAINTSTRUCT
    99. ;----------------------------------------------------------------------
    100. section '.idata' import data readable writeable
    101.   library kernel,'KERNEL32.DLL',\
    102.   user,'USER32.DLL',\
    103.   gdiplus,'GDIPLUS.DLL'
    104.   import gdiplus,\
    105.   GdiplusStartup,'GdiplusStartup',\
    106.   GdipCreatePen1,'GdipCreatePen1',\
    107.   GdipCreateFromHDC,'GdipCreateFromHDC',\
    108.   GdipSetSmoothingMode,'GdipSetSmoothingMode',\
    109.   GdipGraphicsClear,'GdipGraphicsClear',\
    110.   GdipDrawEllipseI,'GdipDrawEllipseI',\
    111.   GdipDeleteGraphics,'GdipDeleteGraphics'
    112.   import kernel,\
    113.   ExitProcess,'ExitProcess',\
    114.   GetModuleHandle,'GetModuleHandleA',\
    115.   GetLocalTime,'GetLocalTime'
    116.   import user,\
    117.   BeginPaint,'BeginPaint',\
    118.   EndPaint,'EndPaint',\
    119.   PostQuitMessage,'PostQuitMessage',\
    120.   LoadIcon,'LoadIconA',\
    121.   LoadCursor,'LoadCursorA',\
    122.   RegisterClassEx,'RegisterClassExA',\
    123.   CreateWindowEx,'CreateWindowExA',\
    124.   DefWindowProc,'DefWindowProcA',\
    125.   GetMessage,'GetMessageA',\
    126.   TranslateMessage,'TranslateMessage',\
    127.   DispatchMessage,'DispatchMessageA'
    128.  
     
  3. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    311
    Код (ASM):
    1.  
    2. .386
    3.  
    4. .model flat, stdcall
    5. option casemap :none
    6.  
    7. include \masm32\include\windows.inc
    8. include \masm32\include\gdiplus.inc
    9. include \masm32\include\user32.inc
    10. include \masm32\include\kernel32.inc
    11.  
    12. includelib \masm32\lib\gdiplus.lib
    13. includelib \masm32\lib\user32.lib
    14. includelib \masm32\lib\kernel32.lib
    15.  
    16. DialogProc proto :DWORD,:DWORD,:DWORD,:DWORD
    17. DrawHand proto :DWORD, :DWORD,:DWORD
    18.  
    19. GdiplusStartupInput STRUCT
    20.   GdiplusVersion           dd ?
    21.   DebugEventCallback       dd ?
    22.   SuppressBackgroundThread dd ?
    23.   SuppressExternalCodecs   dd ?
    24. GdiplusStartupInput ENDS
    25.  
    26. UnitPixel                 equ 2
    27. SmoothingModeAntiAlias     equ 4
    28.  
    29. .data      
    30.  
    31. DLG_TEMP     dd WS_OVERLAPPEDWINDOW XOR WS_THICKFRAME OR DS_CENTER, WS_EX_APPWINDOW
    32.              dw 0, 0, 0, 200, 200, 0, 0, 0
    33.  
    34. hPen        dd ?
    35. lToken        dd ?
    36. tGpInput    GdiplusStartupInput {1, 0, 0, 0}
    37. l12            dd 12
    38. l360        dd 360
    39. l60            dd 60
    40. lDegOffset    dd 90
    41.  
    42. .code
    43.                      
    44. start:
    45.  
    46.     invoke GetModuleHandle, NULL;
    47.  
    48.     invoke DialogBoxIndirectParam, eax, offset DLG_TEMP, NULL, offset  DialogProc, NULL;
    49.  
    50.     invoke ExitProcess, 0
    51.    
    52. DialogProc  proc hwndDlg     :DWORD,
    53.                   uMsg         :DWORD,
    54.                   wParam     :DWORD,
    55.                   lParam     :DWORD
    56.     LOCAL ps:PAINTSTRUCT
    57.     LOCAL hGraphics:DWORD
    58.     LOCAL angle:DWORD
    59.     LOCAL locTime:SYSTEMTIME
    60.  
    61.     xor eax, eax
    62.  
    63.     .if uMsg == WM_INITDIALOG                
    64.      
    65.         invoke GdiplusStartup, offset lToken, offset tGpInput, NULL
    66.         invoke GdipCreatePen1, 0ff0000ffh, 40400000h, UnitPixel, offset hPen
    67.         invoke SetTimer, hwndDlg, 1, 1000, NULL
    68.  
    69.     .elseif uMsg == WM_TIMER
    70.      
    71.         invoke InvalidateRect, hwndDlg, NULL, 0
    72.          
    73.     .elseif uMsg == WM_PAINT
    74.      
    75.      
    76.         invoke BeginPaint, hwndDlg, ADDR ps
    77.      
    78.         invoke GdipSetPenWidth, hPen, 40A00000h
    79.         invoke GdipSetPenColor, hPen, 0ffff0000h
    80.      
    81.         invoke GdipCreateFromHDC, ps.hdc, ADDR hGraphics
    82.         invoke GdipSetSmoothingMode, hGraphics, SmoothingModeAntiAlias
    83.         invoke GdipGraphicsClear, hGraphics, 0ffffffffh
    84.         invoke GdipDrawEllipseI, hGraphics, hPen, 100, 100, 200, 200
    85.      
    86.         invoke GetLocalTime, ADDR locTime
    87.      
    88.         invoke GdipSetPenWidth, hPen, 40400000h
    89.      
    90.         ; Часовая стрелка
    91.         fild l360
    92.         fild l12
    93.         fild locTime.wHour
    94.         fild locTime.wMinute
    95.         fidiv l60
    96.         faddp st(1), st
    97.         fprem
    98.         fdivrp st(1), st
    99.         fmulp st(1), st
    100.         fisub lDegOffset
    101.         fstp angle
    102.      
    103.         invoke DrawHand, hGraphics, angle, 75
    104.      
    105.         invoke GdipSetPenColor, hPen, 0ff0000ffh
    106.      
    107.         ; Минутная стрелка
    108.         fild l360
    109.         fild l60
    110.         fild locTime.wMinute
    111.         fild locTime.wSecond
    112.         fidiv l60
    113.         faddp st(1), st
    114.         fdivrp st(1), st
    115.         fmulp st(1), st
    116.         fisub lDegOffset
    117.         fstp angle
    118.      
    119.         invoke DrawHand, hGraphics, angle, 90
    120.      
    121.         invoke GdipSetPenWidth, hPen, 3F800000h
    122.      
    123.         ; Секундная стрелка
    124.         fild l360
    125.         fild locTime.wSecond
    126.         fidiv l60
    127.         fmulp st(1), st
    128.         fisub lDegOffset
    129.         fstp angle
    130.      
    131.         invoke DrawHand, hGraphics, angle, 90
    132.      
    133.         invoke GdipDeleteGraphics, hGraphics
    134.      
    135.         invoke EndPaint, hwndDlg, ADDR ps
    136.      
    137.     .elseif uMsg == WM_CLOSE
    138.      
    139.         invoke KillTimer, hwndDlg, 1
    140.         invoke GdipDeletePen, hPen
    141.         invoke GdiplusShutdown, lToken
    142.         invoke EndDialog, hwndDlg, 0
    143.      
    144.     .endif
    145.  
    146.     ret
    147.  
    148. DialogProc endp  
    149.  
    150. DrawHand proc hGraphics:DWORD, Angle:DWORD, Scale:DWORD
    151.  
    152.     invoke GdipResetWorldTransform, hGraphics
    153.     invoke GdipRotateWorldTransform, hGraphics, Angle, 0
    154.     invoke GdipTranslateWorldTransform, hGraphics, 43480000h, 43480000h, 1
    155.     invoke GdipDrawLineI, hGraphics, hPen, 0, 0, Scale,00
    156.  
    157.     ret
    158.  
    159. DrawHand endp
    160.  
    161. end start                        
    [​IMG]
     
  4. Mikl___

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

    Публикаций:
    6
    Регистрация:
    25 июн 2008
    Сообщения:
    2.473
    Код (ASM):
    1.  
    2. format PE64 GUI 5.0
    3.  
    4. width_of_watch = 256
    5. height_of_watch = width_of_watch
    6. half_of_width_of_watch = width_of_watch/2
    7. half_height_of_watch = hight_of_watch/2
    8.  
    9. entry WinMain
    10. include 'win64a.inc'
    11. section '.text' code readable executable writeable
    12.  
    13. proc WinMain
    14. local msg:MSG
    15.            mov  esi,400000h; hInstance для FASM
    16.            mov eax,10027h; вернула LoadIcon, у вас может быть другое значение
    17.            xor ebx,ebx
    18.            mov edi,_class
    19.            push rax ;hIcon
    20.            push rdi   ;lpszClassName
    21.            push rbx ;lpszMenuName
    22.            push COLOR_WINDOWTEXT      ;hbrBackground
    23.            push 10003h ; вернула LoadCursor, у вас может быть другое значение
    24.            push rax ;hIcon
    25.            push rsi
    26.            push rbx
    27.            push WindowProc
    28.            push sizeof.WNDCLASSEX        ;cbSize & style
    29.            mov ecx,esp
    30.            call  [RegisterClassEx]
    31.            mov [rbp-28h],rbx
    32.            mov [rbp-30h],rsi
    33.            mov [rbp-38h],rbx
    34.            mov [rbp-40h],rbx
    35.            shl esi,9
    36.            mov eax,width_of_watch
    37.            mov [rbp-48h],rax
    38.            mov [rbp-50h],rax
    39.            mov [rbp-58h],rsi; CW_DEFAULT
    40.            mov [rbp-60h],rsi; CW_DEFAULT
    41.            mov r9d,WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU
    42.            mov r8d,edi
    43.            mov edx,edi
    44.            xor ecx,ecx
    45.            call  [CreateWindowEx]
    46.            lea edi,[msg]
    47.   msg_loop:mov ecx,edi
    48.            xor edx,edx
    49.            xor r8,r8
    50.            xor r9,r9
    51.            call [GetMessage]
    52.            mov ecx,edi
    53.            call [DispatchMessage]
    54.            jmp msg_loop
    55. endp
    56. proc WindowProc hwnd:QWORD,wmsg:QWORD,wparam:QWORD,lparam:QWORD
    57. local ps:PAINTSTRUCT
    58. local hdc:QWORD
    59. local hpen:QWORD
    60. local hPenOld:QWORD
    61. local hBrush:QWORD
    62. local hBrushOld:QWORD
    63. local X:DWORD
    64. local Y:DWORD
    65.  
    66.            mov [hwnd],rcx
    67.  
    68.            cmp edx,WM_CREATE
    69.            je wmCREATE
    70.            cmp edx,WM_TIMER
    71.            je wmTIMER
    72.            cmp edx,WM_PAINT
    73.            je wmPAINT
    74.            cmp edx,WM_DESTROY
    75.            je wmDESTROY
    76. .defwndproc:leave
    77.            jmp  [NtdllDefWindowProc]
    78. wmDESTROY: xor ecx,ecx;уничтожаем таймер #0
    79.            call [KillTimer]
    80.            xor ecx,ecx
    81.            call [RtlExitUserProcess]
    82. wmCREATE:  xor r9,r9
    83.            mov r8d,1000  ;WM_TIMER=1 sec
    84.            xor edx,edx   ;таймер #0
    85.            call [SetTimer]          
    86.            fninit
    87.            fldz
    88.            jmp wmBYE
    89. wmTIMER:   mov r8d,TRUE
    90.            xor edx,edx
    91.            call [InvalidateRect]
    92.             jmp wmBYE
    93. wmPAINT:lea edx,[ps]
    94.            call [BeginPaint]
    95.            mov [hdc],rax
    96. ;секундная стрелка
    97.            mov ecx,PS_SOLID
    98.            mov edx,2
    99.            mov r8d,6464FFh;R=255 G=B=100
    100.            call [CreatePen]
    101.            mov [hpen],rax
    102.            mov edx,eax;hpen
    103.            mov rcx,[hdc]
    104.            call [SelectObject]
    105.            mov [hPenOld],rax
    106.            xor r9,r9;NULL
    107.            mov edx,half_of_width_of_watch
    108.            mov r8d,edx;half_height_of_watch
    109.            mov rcx,[hdc]
    110.            call [MoveToEx]
    111.            fld st
    112.            fsincos
    113.            fimul [temp2]
    114.            fistp [X]
    115.            fimul [temp2]
    116.            fistp [Y]
    117.            fadd [temp]   ;увеличили angle на 6 градусов
    118.            mov edx,half_of_width_of_watch
    119.            mov r8d,edx              ;half_height_of_watch
    120.            sub r8d,[Y]
    121.            sub edx,[X]
    122.            mov rcx,[hdc]
    123.            call [LineTo]
    124.            mov rdx,[hPenOld]
    125.            mov rcx,[hdc]
    126.            call [SelectObject]
    127.            mov rcx,[hpen]
    128.            call [DeleteObject]
    129. ;минутная стрелка
    130.            mov ecx,PS_SOLID
    131.            mov edx,3
    132.            mov r8d,808080h;R=G=B=128
    133.            call [CreatePen]
    134.            mov [hpen],rax
    135.            mov edx,eax;hpen
    136.            mov rcx,[hdc]
    137.            call [SelectObject]
    138.            mov [hPenOld],rax
    139.            xor r9,r9;NULL
    140.            mov edx,half_of_width_of_watch
    141.            mov r8d,edx           ;half_height_of_watch
    142.            mov rcx,[hdc]
    143.            call [MoveToEx]
    144.            mov r8d,65
    145.            mov edx,155
    146.            mov rcx,[hdc]
    147.            call [LineTo]
    148.            mov rdx,[hPenOld]
    149.            mov rcx,[hdc]
    150.            call [SelectObject]
    151.            mov rcx,[hpen]
    152.            call [DeleteObject]
    153. ;заглушка в центре циферблата
    154.            mov ecx,PS_SOLID
    155.            mov edx,3
    156.            mov r8d,0AAAAAAh;R=G=B=170
    157.            call [CreatePen]
    158.            mov [hpen],rax
    159.            mov edx,eax;hpen
    160.            mov rcx,[hdc]
    161.            call [SelectObject]
    162.            mov [hPenOld],rax
    163.            mov ecx,505050h;R=G=B=80
    164.            call [CreateSolidBrush]
    165.            mov [hBrush],rax
    166.            mov edx,eax;hBrush
    167.            mov rcx,[hdc]
    168.            call [SelectObject]
    169.            mov [hBrushOld],rax
    170.            mov rcx,[hdc]
    171.            mov edx,half_of_width_of_watch-6
    172.            mov r8d,edx
    173.            mov r9d,half_of_width_of_watch+6
    174.            mov [rbp-60h],r9;125
    175.            call [Ellipse]
    176.            mov rcx,[hdc]
    177.            mov rdx,[hBrushOld]
    178.            call [SelectObject]
    179.            mov rcx,[hBrush]
    180.            call [DeleteObject]
    181.            mov rcx,[hwnd]
    182.            lea edx,[ps]
    183.            call [EndPaint]
    184. wmBYE:     leave
    185.            retn
    186. endp
    187. ;-----------------------------------------------
    188.    temp dd 0.10471975511965977461542144610932;(pi/180)*6=pi/30 =6 градусов в радианах
    189.    temp2 dd 100 ; длина секундной стрелки
    190.   _class TCHAR 'watch x64',0
    191. section '.idata' import data readable writeable
    192.   library ntdll,'ntdll.DLL',\
    193.   user32,'USER32.DLL',\
    194.   gdi32,'GDI32.DLL'
    195.   import ntdll,\
    196. RtlExitUserProcess,'RtlExitUserProcess',\
    197. NtdllDefWindowProc,'NtdllDefWindowProc_A'
    198.   import user32,\
    199. BeginPaint,'BeginPaint',\
    200. EndPaint,'EndPaint',\
    201. RegisterClassEx,'RegisterClassExA',\
    202. CreateWindowEx,'CreateWindowExA',\
    203. DispatchMessage,'DispatchMessageA',\
    204. GetMessage,'GetMessageA',\
    205. InvalidateRect,'InvalidateRect',\
    206. KillTimer,'KillTimer',\
    207. SetTimer,'SetTimer'
    208.   import gdi32,\
    209. CreatePen,'CreatePen',\
    210. CreateSolidBrush,'CreateSolidBrush',\
    211. DeleteObject,'DeleteObject',\
    212. Ellipse,'Ellipse',\
    213. LineTo,'LineTo',\
    214. MoveToEx,'MoveToEx',\
    215. SelectObject,'SelectObject'
    216.  
    Движение минутной и часовой стрелки добавишь по аналогии
    [​IMG]
     

    Вложения:

    • 00.png
      00.png
      Размер файла:
      18,3 КБ
      Просмотров:
      60
    • watch.zip
      Размер файла:
      1 КБ
      Просмотров:
      2
  5. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    1.040
    go back #4.
     
  6. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    95
    Адрес:
    г. Москва
    Спасибо огромное за помощь! Будем разкуривать
     
  7. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    95
    Адрес:
    г. Москва
    Не компилируется:
    width_of_watch = 256
    height_of_watch = width_of_watch
    half_of_width_of_watch = width_of_watch/2
    half_height_of_watch = height_of_watch/2
     
  8. Mikl___

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

    Публикаций:
    6
    Регистрация:
    25 июн 2008
    Сообщения:
    2.473
    пропущена буква "е" "width_of_watch = 256
    height_of_watch = width_of_watch
    half_of_width_of_watch = width_of_watch/2
    half_height_of_watch = height_of_watch/2"
     
  9. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    95
    Адрес:
    г. Москва
  10. Mikl___

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

    Публикаций:
    6
    Регистрация:
    25 июн 2008
    Сообщения:
    2.473
    Orbit,
    какую, какую стрелку? :haha: Чего там рассчитывать? Круг = 360 градусов. Каждую секунду стрелка поворачивается на 360/60=6 градусов. Переводишь градусы в радианы и добавляешь (pi/180)*6=pi/30=0.10471975511965977461542144610932 каждую секунду к переменной angle, вызываешь fsincos(angle), умножаешь длину стрелки на sin и на cos, выводишь на экран
     
  11. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    95
    Адрес:
    г. Москва
    Исходничком поделетесь под fasm ?
     
  12. Mikl___

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

    Публикаций:
    6
    Регистрация:
    25 июн 2008
    Сообщения:
    2.473
    Orbit,
    а в #24 не "исходничек" под fasm? даже минутная стрелка есть, добавь часовую стрелку и каждую секунду поворачивай минутную стрелку на 0,1 градуса (pi/1800=0,00174532925199432957692369076849), а часовую на 0,000029088820866572159615394846141477
     
  13. Orbit

    Orbit Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    95
    Адрес:
    г. Москва