鱼C论坛

 找回密码
 立即注册
查看: 2071|回复: 6

win32汇编7.2制图问题

[复制链接]
发表于 2014-2-7 19:56:05 | 显示全部楼层 |阅读模式
3鱼币
   .386
   .model flat,stdcall
    option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>       
include windows.inc
include user32.inc
include Gdi32.inc
include kernel32.inc
includelib Gdi32.lib
includelib user32.lib
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN     equ    101
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         ;ecx = 高度
                                  sub         ecx,@stRect.top
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 比较客户区宽度和高度,以小的值用做时钟的直径
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                                  
                                  .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
                        fild     _dwPara180
                        fdivp    st(1),st
                        fsin
                        fild     _dwRadius
                        fmul
                        fadd
                        fistp    @dwReturn
                        mov      eax,@dwReturn
                        ret
_CalcX                endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 计算时钟圆周上某个角度对应的 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
            mov      @dwY2,eax
                        invoke   MoveToEx,_hDC,@dwX1,@dwY1,NULL
                        invoke   LineTo,_hDC,@dwX2,@dwY2
                        ret
_DrawLine   endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ShowTime   proc     _hWnd,_hDC
            local    @stTime:SYSTEMTIME

                        pushad
                        invoke   GetLocalTime,addr @stTime
                        invoke   _CalcClockParam
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 画时钟圆周上的点
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                       
            invoke   GetStockObject,BLACK_BRUSH
            invoke   SelectObject,_hDC,eax
            invoke   _DrawDot,_hDC,360/12,3
            invoke   _DrawDot,_hDC,360/60,1
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 画时钟指针
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                       
            invoke   CreatePen,PS_SOLID,1,0
            invoke   SelectObject,_hDC,eax
            invoke   DeleteObject,eax
                        movzx    eax,@stTime.wSecond
                        mov      eax,360/60
                        mul      ecx             ;秒针度数 = 秒 * 360、60
                        invoke   _DrawLine,_hDC,eax,15
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>               
                        invoke   CreatePen,PS_SOLID,2,0
                        invoke   SelectObject,_hDC,eax
                        invoke   DeleteObject,eax
                        movzx    eax,@stTime.wMinute
                        mov      ecx,360/60
                        mul      ecx             ;秒针度数 = 分 * 360、60
                        invoke   _DrawLine,_hDC,eax,20
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                       
                        invoke   CreatePen,PS_SOLID,3,0
                        invoke   SelectObject,_hDC,eax
                        invoke   DeleteObject,eax
                        movzx    eax,@stTime.wHour
                        .if      eax >=   12
                                 sub     eax,12
                        .endif
            mov      ecx,360/12                       
            mul      ecx                       
                        movzx    ecx,@stTime.wMinute
                        shr      ecx,1
                        add      eax,ecx
                        invoke   _DrawLine,_hDC,eax,30
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                       
                        invoke   GetStockObject,NULL_PEN
                        invoke   SelectObject,_hDC,eax
                        invoke   DeleteObject,eax   
                        popad
                        ret
_ShowTime   endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain  proc   uses ebx  edi  esi  hWnd,uMsg,wParam,lParam
            local    @stPS:PAINTSTRUCT
                       
            mov      eax,uMsg
            .if      eax == WM_TIMER
                     invoke  InvalidateRect,hWnd,NULL,TRUE
            .elseif  eax == WM_PAINT
                     invoke  BeginPaint,hWnd,addr @stPS
                     invoke  _ShowTime,hWnd,eax
                     invoke  EndPaint,hWnd,addr @stPS
                        .elseif  eax == WM_CREATE
                     invoke SetTimer,hWnd,ID_TIMER,1000,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                                         
            .elseif  eax == WM_CLOSE
                     invoke  KillTimer,hWnd,ID_TIMER
                     invoke  DestroyWindow,hWinMain
                     invoke  PostQuitMessage,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
            .else
                     invoke  DefWindowProc,hWnd,uMsg,wParam,lParam
                     ret
            .endif
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                       
             xor    eax,eax
             ret
_ProcWinMain    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain    proc
            local    @stWndClass:WNDCLASSEX
            local    @stMsg:MSG
                       
                        invoke   GetModuleHandle,NULL
                        mov      hInstance,eax
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 注册窗口类
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                       
            invoke   RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
            invoke   LoadIcon,hInstance,ICO_MAIN
            mov      @stWndClass.hIcon,eax
            mov      @stWndClass.hIconSm,eax
            invoke   LoadCursor,0,IDC_ARROW
            mov      @stWndClass.hCursor,eax
            push     hInstance
            pop      @stWndClass.hInstance       
            mov      @stWndClass.cbSize,sizeof WNDCLASSEX
            mov      @stWndClass.style,CS_HREDRAW or CS_VREDRAW
            mov      @stWndClass.lpfnWndProc,offset _ProcWinMain
            mov      @stWndClass.hbrBackground,COLOR_WINDOW + 1
            mov      @stWndClass.lpszClassName,offset szClassName            
                        invoke   RegisterClassEx,addr @stWndClass
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 建立并显示窗口
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                       
            invoke   CreateWindowEx,WS_EX_CLIENTEDGE,\
                     offset szClassName,offset szClassName,\
                     WS_OVERLAPPEDWINDOW,\
                     100,100,250,270,\
                     NULL,NULL,hInstance,NULL
            mov      hWinMain,eax
            invoke   ShowWindow,hWinMain,SW_SHOWNORMAL
            invoke   UpdateWindow,hWinMain
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                       
            .while   TRUE
                     invoke GetMessage,addr @stMsg,NULL,0,0
                     .break  .if eax == 0
                     invoke TranslateMessage,addr @stMsg
                     invoke DispatchMessage,addr @stMsg
            .endw
            ret
_WinMain    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
            call    _WinMain
            invoke  ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
            end    start       
这是从win32 第7章  7.2节绘制图形 那里抄来的 等值定义依照资源ID改了 注释地方略
这个编译连接通过  为什么我点击执行文件EXE 出现        [img]file:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\270945406\QQ\WinTemp\RichOle\BN(_~[484_R%1EBNF$Q]1HD.jpg[/img][img]file:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\270945406\QQ\WinTemp\RichOle\BN(_~[484_R%1EBNF$Q]1HD.jpg[/img]
《windows 无法访问指定设备,路径或文件。你可能没有合适的权限访问这个项目》
求高手帮忙  谢谢

QQ图片20140207194946.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-2-8 14:16:54 | 显示全部楼层
不清楚。你尝试 提权 试试看。是win7吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-2-11 11:06:11 | 显示全部楼层
额过两天打开有正常了  可能是系统的问题吧
:sweat:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-2-13 14:26:40 | 显示全部楼层
我来学习一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-2-15 21:53:00 | 显示全部楼层
自己试了下,可以运行的,就是程序有点复杂啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-3-27 11:17:52 | 显示全部楼层
额......................,我也来学习一下!{:2_29:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

我爱鱼C论坛 该用户已被删除
发表于 2015-2-19 21:28:52 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-28 05:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表