⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 007.txt

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 5 页
字号:
include   windows.inc

include   user32.inc

includelib      user32.lib

include   kernel32.inc

includelib      kernel32.lib

include   Gdi32.inc

includelib      Gdi32.lib

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; Equ 等值定义

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

ICO_MAIN     equ   1000h

ID_TIMER     equ   1

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 数据段

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

    .data?

hInstance   dd    ?

hWinMain       dd    ?

dwCenterX dd   ? ;圆心X

dwCenterY dd   ? ;圆心Y

dwRadius   dd   ? ;半径

    .const

szClassName   db   ~Clock~,0

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 代码段

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

      .code

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 计算时钟的位置、大小等参数

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_CalcClockParam   proc

    local @stRect:RECT

 

    invoke  GetClientRect,hWinMain,addr @stRect

      mov   eax,@stRect.right

  sub eax,@stRect.left   ;eax = 宽度

    mov   ecx,@stRect.bottom

  sub ecx,@stRect.top ;ecx = 高度

;********************************************************************

; 比较客户区宽度和高度,以小的值用做时钟的直径

;********************************************************************

    .if   ecx > eax

  mov edx,eax   ;高度 > 宽度

      sub   ecx,eax

      shr   ecx,1

      mov   dwCenterX,0

      mov   dwCenterY,ecx

    .else

      mov   edx,ecx

      sub   eax,ecx

      shr   eax,1

      mov   dwCenterX,eax

      mov   dwCenterY,0

    .endif

      shr   edx,1

    mov   dwRadius,edx

    add   dwCenterX,edx

    add   dwCenterY,edx

    ret

 

_CalcClockParam   endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 计算时钟圆周上某个角度对应的 X 坐标

; X = 圆心X + Sin(角度) * 半径

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_dwPara180     dw    180

_CalcX      proc     _dwDegree,_dwRadius

      local @dwReturn

 

    fild     dwCenterX

    fild     _dwDegree

      fldpi

  fmul   ;角度*Pi

    fild     _dwPara180

  fdivp st(1),st   ;角度*Pi/180

    fsin     ;Sin(角度*Pi/180)

    fild     _dwRadius

  fmul   ;半径*Sin(角度*Pi/180)

  fadd   ;X+半径*Sin(角度*Pi/180)

    fistp @dwReturn

    mov   eax,@dwReturn

    ret

 

_CalcX      endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 计算时钟圆周上某个角度对应的 Y 坐标

; Y = 圆心Y - Cos(角度) * 半径

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_CalcY     proc     _dwDegree,_dwRadius

    local @dwReturn

 

    fild     dwCenterY

    fild     _dwDegree

    fldpi

      fmul

      fild     _dwPara180

      fdivp st(1),st

      fcos
    



      fild     _dwRadius

    fmul

      fsubp st(1),st

      fistp @dwReturn

      mov   eax,@dwReturn

      ret

 

_CalcY      endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 按照 _dwDegreeInc 的步进角度,画 _dwRadius 为半径的小圆点

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_DrawDot     proc     _hDC,_dwDegreeInc,_dwRadius

    local @dwNowDegree,@dwR

      local @dwX,@dwY

 

    mov   @dwNowDegree,0

    mov   eax,dwRadius

      sub   eax,10

    mov   @dwR,eax

    .while  @dwNowDegree <= 360

    finit

;********************************************************************

; 计算小圆点的圆心坐标

;********************************************************************

      invoke  _CalcX,@dwNowDegree,@dwR

      mov   @dwX,eax

      invoke  _CalcY,@dwNowDegree,@dwR

      mov   @dwY,eax

  

  mov eax,@dwX   ;画点

      mov   ebx,eax

      mov   ecx,@dwY

      mov   edx,ecx

      sub   eax,_dwRadius

      add   ebx,_dwRadius

        sub   ecx,_dwRadius

      add   edx,_dwRadius

      invoke  Ellipse,_hDC,eax,ecx,ebx,edx

  

      mov   eax,_dwDegreeInc

      add   @dwNowDegree,eax

      .endw

      ret

_DrawDot     endp

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 画 _dwDegree 角度的线条,半径=时钟半径-参数_dwRadiusAdjust

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

_DrawLine   proc     _hDC,_dwDegree,_dwRadiusAdjust

    local @dwR

    local @dwX1,@dwY1,@dwX2,@dwY2

      mov eax,dwRadius

      sub eax,_dwRadiusAdjust

      mov @dwR,eax

;********************************************************************

; 计算线条两端的坐标

;********************************************************************

      invoke  _CalcX,_dwDegree,@dwR

      mov   @dwX1,eax

      invoke  _CalcY,_dwDegree,@dwR

    mov   @dwY1,eax

      add   _dwDegree,180

    invoke  _CalcX,_dwDegree,10

    mov   @dwX2,eax

    invoke  _CalcY,_dwDegree,10

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -