Часы

Тема в разделе "WASM.BEGINNERS", создана пользователем Mikl___, 9 фев 2022.

  1. Mikl___

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

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

    аналоговые часы

    timer01.jpg
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. W = 256
    4. H = 256
    5. .code
    6. WinMain proc
    7. local hbrBackground:qword
    8. local msg:MSG
    9.        xor ebx,ebx
    10.        mov esi,IMAGE_BASE
    11.        mov edi,offset AppName
    12.        mov qword ptr[rsp+28h],LR_LOADFROMFILE
    13.        mov [rsp+20h],rbx
    14.        mov edx,offset BmpName
    15.        invoke LoadImage,esi,,0,0
    16.        invoke CreatePatternBrush,eax
    17.        mov hbrBackground,rax
    18.        mov ecx,offset FileName
    19.        invoke LoadCursorFromFile
    20.        push rax ;hIconSm
    21.        push rdi ;lpszClassName
    22.        push rbx
    23.        push 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 RegisterClassEx,esp ;addr WNDCLASSEX
    31.  
    32.        push rbx
    33.        push rsi ;rsi=400000h
    34.        shl esi,9 ;rsi=CW_USEDEFAULT
    35.        push rbx
    36.        push rbx
    37.        push H+20
    38.        push W
    39.        push rsi
    40.        push rsi
    41.        sub esp,20h
    42.        mov r9d,WS_OVERLAPPED or WS_VISIBLE or WS_CAPTION or WS_SYSMENU
    43.        invoke CreateWindowEx,0,edi,edi
    44.        mov hWin,rax
    45.        lea edi,msg
    46. @@: invoke GetMessage,edi,NULL,0,0
    47.        invoke DispatchMessage,edi
    48.        jmp @b
    49. WinMain endp
    50. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    51. local ps:PAINTSTRUCT
    52. local hdc:HDC
    53. local hpen:DWORD
    54. local hPenOld:DWORD
    55. local hBrush:DWORD
    56. local hBrushOld:DWORD
    57. local X:DWORD
    58. local temp2:DWORD
    59. local Time:SYSTEMTIME
    60.  
    61.        mov hWnd,rcx
    62.        cmp edx,WM_CREATE
    63.        je wmCREATE
    64.        cmp edx,WM_PAINT
    65.        je wmPAINT
    66.        cmp edx,WM_DESTROY
    67.        je wmDESTROY
    68.        leave
    69.        jmp NtdllDefWindowProc_
    70. wmDESTROY:;уничтожаем таймер
    71.        invoke  timeKillEvent,hTimer
    72.        invoke RtlExitUserProcess,NULL
    73. wmCREATE:mov qword ptr[rsp+20h],TIME_PERIODIC
    74.        mov r8d,offset TimeProc
    75.        invoke  timeSetEvent,1000,1000,,777
    76.        mov hTimer,rax
    77.        lea ecx,Time
    78.        invoke GetLocalTime
    79.        movzx eax,Time.wHour
    80.        sub eax,12
    81.        jnc @f
    82.        add eax,12
    83. @@: cvtsi2ss xmm0,eax
    84.        movss Hour,xmm0
    85.        movzx eax,Time.wMinute
    86.        cvtsi2ss xmm0,eax
    87.        movss Minute,xmm0; преобразовать целые минуты из SYSTEMTIME в вещественные
    88.        movzx eax,Time.wSecond
    89.        cvtsi2ss xmm0,eax
    90.        movss Second,xmm0; преобразовать целые секунды из SYSTEMTIME в вещественные
    91.        mulss xmm0,const1_60; домножить секунды на 1/60 и добавить к минутам
    92.        addss xmm0,Minute
    93.        movss Minute,xmm0;минуты с учетом секунд
    94.        mulss xmm0,const1_60; домножить минуты на 1/60 и добавить к часам
    95.        addss xmm0,Hour
    96.        movss Hour,xmm0;часы с учетом минут
    97.        jmp wmBYE
    98. wmPAINT:lea edx,ps
    99.        invoke BeginPaint;,hWnd
    100.        mov hdc,rax
    101.        invoke CreatePen,PS_SOLID,2,6464FFh;(255,100,100)
    102. ;заводим красный карандаш толщиной 2 для рисования секундной стрелки
    103.        mov hpen,eax
    104.        invoke SelectObject,hdc,eax;hpen
    105.        mov hPenOld,eax;сохраняем старый карандаш
    106.        invoke MoveToEx,hdc,H/2,W/2,NULL;от точки в середине экрана рисуем стрелку длиной 100 точек
    107.        movss xmm0,temp;pi/30
    108.        mulss xmm0,Second;секунды
    109.        movss temp2,xmm0
    110.        invoke cosf
    111.        mulss xmm0,Second_arrow;100*cos(секунды*pi/30)
    112.        cvtss2si eax,xmm0
    113.        mov X,eax;X=100*cos(секунды*pi/30)
    114.        movss xmm0,temp2
    115.        invoke sinf
    116.        mulss xmm0,Second_arrow;100*sin(секунды*pi/30)
    117.        cvtss2si edx,xmm0;edx=100*sin(секунды*pi/30)
    118.        add edx,H/2
    119.        mov r8d,W/2
    120.        sub r8d,X
    121.        invoke LineTo,hdc
    122.        invoke DeleteObject,hpen;удаляем карандаш, который создали для секундной стрелки
    123. ;минутная стрелка
    124.        invoke CreatePen,PS_SOLID,7,808080h;(128,128,128)
    125. ;заводим серый карандаш толщиной 7 для рисования минутной и часовой стрелки
    126.        mov hpen,eax
    127.        invoke SelectObject,hdc,eax
    128.        invoke MoveToEx,hdc,W/2,H/2,NULL
    129. ;------------------------------------------------------
    130.        movss xmm0,temp;pi/30
    131.        mulss xmm0,Minute;минуты*pi/30
    132.        movss temp2,xmm0
    133.        invoke cosf
    134.        mulss xmm0,Minute_arrow;75*cos(минуты*pi/30)
    135.        cvtss2si eax,xmm0
    136.        mov X,eax;X=100*cos(минуты*pi/30)
    137.        movss xmm0,temp2
    138.        invoke sinf
    139.        mulss xmm0,Minute_arrow;75*sin(минуты*pi/30)
    140.        cvtss2si edx,xmm0;Y=50*sin(минуты*pi/30)
    141.        add edx,H/2;119
    142.        mov r8d,W/2;119
    143.        sub r8d,X
    144. ;-------------------------------------------------------
    145.        invoke LineTo,hdc
    146. ;часовая стрелка
    147.        invoke MoveToEx,hdc,W/2,H/2,NULL
    148. ;------------------------------------------------------
    149.        movss xmm0,Hour;часы
    150.        mulss xmm0,temp1;pi/6
    151.        movss temp2,xmm0
    152.        invoke cosf
    153.        mulss xmm0,Hour_arrow;50*cos(минуты*pi/6)
    154.        cvtss2si eax,xmm0
    155.        mov X,eax;X=50*cos(минуты*pi/6)
    156.        movss xmm0,temp2
    157.        invoke sinf
    158.        mulss xmm0,Hour_arrow;50*sin(минуты*pi/6)
    159.        cvtss2si edx,xmm0;Y=50*sin(минуты*pi/6)
    160.        add edx,H/2;119
    161.        mov r8d,W/2;119
    162.        sub r8d,X
    163. ;-------------------------------------------------------
    164.        invoke LineTo,hdc
    165.        invoke SelectObject,hdc,hPenOld;возвращаем системе старый карандпш
    166.        invoke DeleteObject,hpen;удаляем карандаш, который создали для минутной и часовой стрелки
    167. ;заглушка в центре циферблата
    168.        invoke CreatePen,PS_SOLID,3,0AAAAAAh;(170,170,170) создаем светлосерый карандаш для рисования
    169. ;заглушки в центре циферблата
    170.        mov hpen,eax
    171.        invoke SelectObject,hdc,eax
    172.        mov hPenOld,eax
    173.        invoke CreateSolidBrush,505050h;80,80,80 создаем серую кисть для рисования заглушки в центре циферблата
    174.        mov hBrush,eax
    175.        invoke SelectObject,hdc,eax;hBrush
    176.        mov hBrushOld,eax
    177.        invoke Ellipse,hdc,123,123,135,135; рисуем кольцо в центре циферблата
    178.        invoke SelectObject,hdc,hBrushOld;возвращаем системе старую кисть
    179.        invoke DeleteObject,hBrush;удаляем кисть, которую создали для заглушки в центре циферблата
    180.        lea edx,ps
    181.        invoke EndPaint,hWnd;возвращаем системе дескриптор устройства
    182. wmBYE: leave
    183.        retn
    184. WndProc endp
    185. ; Обработчик вытокоточного таймера
    186. TimeProc proc uTimerID:QWORD,uMsg:QWORD,dwUser:QWORD,dw1:QWORD,dw2:QWORD
    187.         movss xmm0,const1
    188.         addss xmm0,Second
    189.         movss Second,xmm0;прошла секунда --> добавить 1 к секундам
    190.         movss xmm0,Minute
    191.         addss xmm0,const1_60
    192.         movss Minute,xmm0;прошла секунда --> добавить 1/60 к минутам
    193.         movss xmm0,Hour
    194.         addss xmm0,const1_3600
    195.         movss Hour,xmm0;прошла секунда --> добавить 1/3600 к часам
    196.         invoke InvalidateRect,hWin,0,TRUE
    197.         leave
    198.         retn
    199. TimeProc endp
    200. ;-----------------------------------------------------------
    201. .data
    202. Second      dd ?
    203. Minute      dd ?
    204. Hour        dd ?
    205. const1_60   dd 0.0166666666666666666666666667;1/60 доля минут в часе
    206. const1_3600 dd 0.0002777777777777777777777778;1/3600 доля секунд в часе
    207. temp        dd 0.1047197551196597746154214461;pi/30 минут, секунд в радиане
    208. temp1       dd 0.5235987755982988730771072305;pi/6 часов в радиане
    209. Second_arrow dd 100.0
    210. Minute_arrow dd 75.0
    211. Hour_arrow  dd 50.0
    212. AppName     db 'Часы',0
    213. FileName    db "br_Rabbit3.cur",0
    214. BmpName     db "clock256.bmp",0
    215. hWin dq ?
    216. hTimer dq ?
    217. const1 dd 1.0
    218. end
    Во вложении asm-/bmp-/cur-/exe-файл
     

    Вложения:

    • timer01.zip
      Размер файла:
      7,8 КБ
      Просмотров:
      135
    DOSAsm386 нравится это.
  2. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    timer02.jpg
    asm-файл
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. TIMER_ID = 10
    4. IDB_MYBITMAP   equ 100
    5. .code
    6. WinMain proc
    7. local msg:MSG
    8.    xor ebx,ebx
    9.    mov esi,IMAGE_BASE
    10.    mov edi,offset AppName
    11.    mov ecx,offset FileName
    12.    invoke LoadCursorFromFile
    13.    push rax ;hIconSm
    14.    push rdi ;lpszClassName
    15.    push rbx
    16.    push COLOR_WINDOW
    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 RegisterClassEx,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 110+10
    30.    push 403+10
    31.    push rsi
    32.    push rsi
    33.    sub esp,20h
    34.    mov r9d,WS_OVERLAPPED or WS_VISIBLE or WS_CAPTION or WS_SYSMENU
    35.     invoke CreateWindowEx,0,edi,edi
    36.    lea edi,msg
    37. @@: invoke GetMessage,edi,NULL,0,0
    38.    invoke DispatchMessage,edi
    39.    jmp @b
    40. WinMain endp
    41. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    42. local ps:PAINTSTRUCT
    43. local hdc:dword
    44. local Time:SYSTEMTIME
    45. local hMemDC:dword
    46.  
    47.        mov hWnd,rcx      
    48.  
    49.        cmp edx,WM_CREATE
    50.        je wmCREATE
    51.        cmp edx,WM_PAINT
    52.        je wmPAINT
    53.        cmp edx,WM_DESTROY
    54.        je wmDESTROY
    55.        cmp edx,WM_TIMER
    56.        je wmTIMER
    57.        leave
    58.         jmp NtdllDefWindowProc_
    59. wmDESTROY:;уничтожаем таймер #10
    60.        invoke KillTimer,,TIMER_ID
    61.        mov ecx,hBitmap
    62.        invoke DeleteObject
    63.        invoke RtlExitUserProcess,NULL
    64. wmCREATE:invoke SetTimer,,TIMER_ID,1000,NULL
    65.        invoke LoadBitmap,IMAGE_BASE,IDB_MYBITMAP
    66.        mov hBitmap,eax
    67. wmTIMER:lea ecx,Time
    68.        invoke GetLocalTime
    69.        movzx eax,Time.wSecond
    70.        mov [rsp+20h],rax
    71.        movzx r9d,Time.wMinute
    72.        movzx r8d,Time.wHour
    73.        mov ecx,offset buffer
    74.        lea edx,fmtstr
    75.        invoke wsprintf
    76.        invoke InvalidateRect,hWnd,NULL,TRUE
    77.        jmp wmBYE
    78. wmPAINT:lea edx,ps
    79.        invoke BeginPaint;,hWnd
    80.        mov hdc,eax
    81.         invoke CreateCompatibleDC,eax
    82.        mov hMemDC,eax
    83.        mov edx,hBitmap
    84.        invoke SelectObject,eax
    85.    
    86.        xor edi,edi
    87.        sub esp,40h
    88. @@: mov eax,hMemDC
    89.        mov [rsp+28h],rax
    90.        and qword ptr[rsp+38h],0
    91.        mov qword ptr[rsp+40h],SRCCOPY
    92.        movzx eax,buffer[rdi]
    93.        and eax,0Fh
    94.        imul eax,53
    95.        mov [rsp+30h],rax
    96.        mov qword ptr[rsp+20h],82
    97.        imul edx,edi,49
    98.        invoke BitBlt,hdc,,0,53
    99.        inc edi
    100.        cmp edi,7
    101.        jbe @b  
    102.        add esp,40h
    103.        invoke DeleteDC,hMemDC
    104.        lea edx,ps
    105.        invoke EndPaint,hWnd;возвращаем системе дескриптор устройства
    106. wmBYE: leave
    107.        retn
    108. WndProc endp
    109. .data
    110. AppName  db 'Часы',0
    111. FileName db "br_Rabbit3.cur",0
    112. fmtstr   db "%02d:%02d:%02d",0
    113. hBitmap  dd ?
    114. buffer   db 50 dup(?)
    115. end
    rc-файл
    Код (C++):
    1. #define IDB_MYBITMAP 100
    2.    IDB_MYBITMAP BITMAP "03.bmp"
    Во вложении asm-/bmp-/cur-/rc-/exe-файл
     

    Вложения:

    • timer02.zip
      Размер файла:
      8,1 КБ
      Просмотров:
      142
    DOSAsm386 нравится это.
  3. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    561
    Прикольно.
    https://www.virustotal.com/gui/file...ceed35d5289905b0095fbe2214ed8356d54?nocache=1
    6 антивиря быкуют.

    Сделал контрол 7ми сегментного индикатора немного по другому, хранятся только атласы самих сегментов, а шрифт отдельно задаётся. Реально лучше заморочится, чтобы потом класс использовать в других проектах. Для калькулятора делал.
    Ещё как можно решить проблему антиалиасинга?
     
  4. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Особенно прекрасны вот такие кундштюки:
    Хоть бы один процентик могучий искусственный интеллект скинул, малейший шанс для себя не выглядеть гавном.
     
  5. DOSAsm386

    DOSAsm386 Member

    Публикаций:
    0
    Регистрация:
    12 янв 2017
    Сообщения:
    64
    Адрес:
    Россия
    При запуске исполнимого файла timer02.exe в окошке не отображаются цифры ???
    Windows 7 64 бит
    [​IMG]
    timer01.exe
    работает нормально, часы отображаются.
     

    Вложения:

    • timer02.jpg
      timer02.jpg
      Размер файла:
      62,4 КБ
      Просмотров:
      738
  6. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    DOSAsm386,
    при сборке ехе, в том же каталоге, где находятся timer02.asm и timer02.rc должен находится файл 03.bmp, или путь к файлу нужно подправить в timer02.rc
    00.jpg
    У 03.bmp глубина цвета 8 (256 цветов), так что картинка должна отображаться даже на слабеньких видеоадаптерах и мониторах :)
     

    Вложения:

    • 03.zip
      Размер файла:
      2 КБ
      Просмотров:
      145
  7. KPG

    KPG Member

    Публикаций:
    0
    Регистрация:
    13 янв 2021
    Сообщения:
    121
  8. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    KPG,
    ссылка нерабочая :)
     
  9. KPG

    KPG Member

    Публикаций:
    0
    Регистрация:
    13 янв 2021
    Сообщения:
    121
    ? :)
    На сттью на Хабр по книге рабочая,
    а ссылка на саму книгу, если это подразумевалось,
    то вот она из статьи
    https://www.xorpd.net/pages/xchg_rax/snip_00.html
     
  10. Mikl___

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

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

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    561
    А зачем х86-64? Нормально х86-32 (386) и WinAPI чтобы и на 95 заработало. Не важно что там у кого-то устарело. На ХР точно должно работать.
     
  12. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.422
    Адрес:
    Россия, Нижний Новгород
    Зачем? Сейчас её днём с огнём не сыщешь. Для чего тянуть поддержку мёртвых систем?
    Новичкам правильнее учить сразу и 32х-битный, и 64х-битный ассемблеры, чтобы видеть различия и приобретать опыт разработки под актуальные архитектуры.
    Знание 64х-битного ассемблера низкоуровневым разработчикам пригодится намного сильнее, нежели поддержка Win95 и WinXP.
     
    Artem_N и Mikl___ нравится это.
  13. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    561
    Зачем? Зачем?
    А какой смысл от новых систем, если нет никакого преимущества. Вот в вынь 10 директха 12 есть, игры с лучшим графоном, тут всё понятно, вопросов нет.
    А тут просто часы какие-то. Зачем тут х64? Какой в этом смысл? А то многие думают что х86-64 в два раза быстрей х86-32. Нет конечно, плюс приложение очень лёгкое, с оптимизацией можно не заморачиваться. Значит надо сделать так, чтобы и на 486 Win95 заработало, может кому-то надо. Вон кто-то и на 5150 сейчас что-то делает.
     
  14. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Смысл наверное в том, что это скорее дидактический материал, чем программный продукт. Если кто-то в быту использует хеловорлд для каких-то утилитарных целей, то он неправ.
     
    Mikl___ нравится это.
  15. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    561
    Ну тогда и для х86-32 надо вариант сделать.
    ЗЫ
    Ещё калькулятор надо сделать с 7ми сегментным контролом и интерактивными кнопками и на двоично-десятичной логики и только 386 без использовании FPU. Чтобы 486SX, 386DX - Win95 или даже Win3.1, т.е. только старый WinAPI.
    ЗЫЫ
    В 7ке, 10ке калькулятор полное говно, делал не то чтобы дебил, но для нормальных программистах полный шлак, не куда не годен. Надо переделать. И чтобы ХР точно работал.
    Изобретём калькулятор? (с)
     
  16. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    В чисто практическом плане сам интерфейс кнопочного калькулятора на экране ПК не самое удачное решение, особенно для нормальных программистов. С настоящим материальным кнопочником он все равно в удобстве не сравнится. И вообще имхО основное назначение виндового calc.exe - evaluate'ить выражения, в том числе со скобками, на ctrl-v. Отсюда кстати программистская версия калькулятора (js, макрос для emeditor):
    Код (Text):
    1. function decimalToHexString(number){ if(number < 0){ number = 0xFFFFFFFF + number + 1; } return number.toString(16).toUpperCase(); }
    2. function multiline_calc() {
    3.     var sel_left = document.selection.GetTopPointX(eePosView);
    4.     var sel_top = document.selection.GetTopPointY(eePosView);
    5.     var sel_right = document.selection.GetBottomPointX(eePosView);
    6.     var sel_bottom = document.selection.GetBottomPointY(eePosView);
    7.     var sel_mode = document.selection.mode & eeModeMask;
    8.     var lines = document.selection.text.split('\r\n');
    9.     for (var i=0;i<lines.length;i++) {
    10.         if (lines[i].length != 0) {
    11.             if (sel_mode == eeModeBox) {
    12.                 document.selection.SetActivePoint(eePosView,sel_left,sel_top+i);
    13.                 document.selection.SetAnchorPoint(eePosView,sel_right,sel_top+i);
    14.             } else {
    15.                 document.selection.SetActivePoint(eePosView,1,sel_top+i);
    16.                 document.selection.EndOfLine(sel_top+i);
    17.             }
    18.             clipboardData.setData('Text',lines[i] + '=0x' + decimalToHexString(eval(lines[i])));
    19.             document.selection.Paste(0);
    20.         }
    21.     }
    22. }
    23. multiline_calc();
     
  17. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    f13nd,

    > evaluate'ить выражения, в том числе со скобками

    Лет 10%15 назад был популярным VB, так вот там можно было в десяток строк такой калк собрать, он умел вычислять любой вложенности выражения матан есчо и с системными для среды командами по типу GetTime(). Наверно самая интересная его фишка, он интерпретировал сам себя.
     
  18. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    А теперь есть петон, где всё это же самое плюс длинная арифметика.
     
  19. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    f13nd,

    На счёт петон я не знаю. Но фишка годная была, тем более что там можно было вирт машину компилить. Я такой калк тоже собирал, но как это работало я не знаю, всмысле на системном уровне. Там мышем в основном всё делалось :)
     
  20. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    f13nd,

    Откопал я ту древнюю сборку, похоже принимает функции вб.

    c.png
     

    Вложения:

    • c.7z
      Размер файла:
      6,5 КБ
      Просмотров:
      119