sd53852728 发表于 2014-2-7 19:56:05

win32汇编7.2制图问题

   .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
                                      movedx,eax
                                          subecx,eax
                                          shrecx,1
                                          movdwCenterX,0
                                          movdwCenterY,ecx
                                  .else
                      movedx,ecx
                      subeax,ecx
                      shreax,1
                              movdwCenterX,eax
                                          movdwCenterY,0
                  .endif
                  shredx,1
                  movdwRadius,edx
                  adddwCenterX,edx
                  adddwCenterY,edx
                                  ret
_CalcClockParam endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 计算时钟圆周上某个角度对应的 X 坐标
; X = 圆心 X + Sin(角度) * 半径
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_dwPara180dw       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
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMainproc   uses ebxediesihWnd,uMsg,wParam,lParam
            local    @stPS:PAINTSTRUCT
                       
            mov      eax,uMsg
            .if      eax == WM_TIMER
                     invokeInvalidateRect,hWnd,NULL,TRUE
            .elseifeax == WM_PAINT
                     invokeBeginPaint,hWnd,addr @stPS
                     invoke_ShowTime,hWnd,eax
                     invokeEndPaint,hWnd,addr @stPS
                        .elseifeax == WM_CREATE
                     invoke SetTimer,hWnd,ID_TIMER,1000,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>                                       
            .elseifeax == WM_CLOSE
                     invokeKillTimer,hWnd,ID_TIMER
                     invokeDestroyWindow,hWinMain
                     invokePostQuitMessage,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
            .else
                     invokeDefWindowProc,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
            invokeExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
            end    start       
这是从win32 第7章7.2节绘制图形 那里抄来的 等值定义依照资源ID改了 注释地方略
这个编译连接通过为什么我点击执行文件EXE 出现        file:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\270945406\QQ\WinTemp\RichOle\BN(_~1HD.jpgfile:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\270945406\QQ\WinTemp\RichOle\BN(_~1HD.jpg
《windows 无法访问指定设备,路径或文件。你可能没有合适的权限访问这个项目》
求高手帮忙谢谢

梦想与现实 发表于 2014-2-8 14:16:54

不清楚。你尝试 提权 试试看。是win7吗?

sd53852728 发表于 2014-2-11 11:06:11

额过两天打开有正常了可能是系统的问题吧
:sweat:

bubu 发表于 2014-2-13 14:26:40

我来学习一下。

李小涵 发表于 2014-2-15 21:53:00

自己试了下,可以运行的,就是程序有点复杂啊

青玄 发表于 2014-3-27 11:17:52

额......................,我也来学习一下!{:2_29:}

我爱鱼C论坛 发表于 2015-2-19 21:28:52

页: [1]
查看完整版本: win32汇编7.2制图问题