友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
合租小说网 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

windows环境下32位汇编语言程序设计-第34部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!



;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

; 画 _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  ;画12个大圆点

                        invoke  _DrawDot;_hDC;360/60;1  ;画60个小圆点

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

; 画时钟指针

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

                        invoke  CreatePen;PS_SOLID;1;0

                        invoke  SelectObject;_hDC;eax

                        invoke  DeleteObject;eax

                        movzx   eax;@stTime。wSecond

                        mov     ecx;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

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

                        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



 
来源:电子工业出版社 作者:罗云彬 上一页         回书目         下一页          
上一页         回书目         下一页          
  


第7章 图形操作


7。2 绘 制 图 形(3)

    
                                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

下面简单分析一下程序的结构。

程序首先用标准的方法建立了一个窗口,在窗口的初始化消息WM_CREATE中用SetTimer建立了一个周期为1秒的定时器,用来在窗口的客户区中绘画时钟。这个定时器在WM_CLOSE消息中用KillTimer函数撤销。在定时器消息中,程序用InvalidateRect函数让整个客户区失效,相当于让Windows在消息循环中放入一条WM_PAINT消息,整个时钟的绘画在WM_PAINT消息中完成。

在WM_PAINT消息中程序用标准的方法调用BeginPaint函数获取窗口客户区的hDC,以便在上面绘画时钟,在消息返回的时候用EndPaint函数释放hDC,两个函数的中间,程序把hDC传给_ShowTime子程序,由这个子程序完成整个绘画工作。

在第6章中已经讲到:获取系统时间不能依赖于WM_TIMER消息的计数,所以在_ShowTime子程序的开始,程序调用GetLocalTime来获取当前的系统时间,并根据这个时间来绘画时钟的时、分、秒指针。由于绘画的过程很快,所以整个程序的结构使用前面图7。1中所示的A结构,也就是每次有WM_PAINT消息的时候,程序总是重画整个客户区,所以读者在速度比较慢的计算机上运行这个程序时,可能会看到有个闪烁的过程,因为程序每次总是先将整个客户区清除成背景色(InvalidateRect函数最后的TRUE参数要求Windows在发送WM_PAINT消息前清除客户区),然后绘画四周的刻度,最后画上指针。绘画刻度是由_DrawDot子程序完成的,绘画指针是由_DrawLine子程序完成的。

GetLocalTime后面的_CalcClockParam子程序根据客户区的尺寸计算时钟尺寸参数,它比较客户区高度和宽度,以其中的较小值用做时钟的直径,计算得到的圆心最后存放于全局变量dwCenterX和dwCenterY中,计算得到的半径存放于dwRadius中。

程序中有两个公用的子程序:_CalcX和_CalcY,它们用来计算角度对应的坐标,如图7。5所示,时钟0点时间是从垂直方向开始的,以时间值为角度配合Windows的默认坐标系,对应某个时间点(x,y),x应该是圆心x加上角度的正弦值乘以半径,y应该是圆心y减
返回目录 上一页 下一页 回到顶部 0 0
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!