|  | 
				
					
	
		
			
 			Posted on 2010-07-27 22:04 besterChen  阅读(3556) 评论(12)  编辑 收藏 引用   所属分类: 项目工程               大概说下思路,方便以后回忆~在窗口客户区 绘制一个圆,圆心为逻辑坐标。这样,它窗体设备坐标的转换关系如下:
 
  1. 从设备坐标系(x,y)到逻辑坐标系(x',y')
 x' = x - width()/2
 y' = y + height()/2
    2. 从逻辑坐标系(x',y')到设备坐标系(x,y)x = x' + width()/2
 y = height()/2 - y'
 
转换成代码表示如下:     
  1 ;//###################################################################### 2
  ;// 功  能: 从逻辑坐标系到设备坐标系 3
  ;// 函数名: ConvlogicPos2DevicePos 4
  ;// 参数 5
  ;//       ptLogicPos:  逻辑坐标 6
  ;//       pptDevicePos: 输出参数 转换后的设备坐标 7
  ;//###################################################################### 8
  ConvlogicPos2DevicePos proc ptLogicPos:POINT, pptDevicePos:ptr POINT 9
  assume esi:ptr POINT 10
  mov esi,pptDevicePos 11
  mov eax, ptLogicPos.x 12
  add eax, g_ptCoor.x 13
  mov [esi].x, eax 14
   15
  mov eax, g_ptCoor.y 16
  sub eax, ptLogicPos.y 17
  mov [esi].y, eax 18
  assume esi:nothing 19
   20
  ret 21
  ConvlogicPos2DevicePos endp 22
  23
  ;//###################################################################### 24
  ;// 功  能: 从设备坐标系到逻辑坐标系 25
  ;// 函数名: ConvDevicePos2logicPos 26
  ;// 参数 27
  ;//       ptDevicePos: 设备坐标 28
  ;//       pptLogicPos: 输出参数 转换后的逻辑坐标 29
  ;//###################################################################### 30
  ConvDevicePos2logicPos proc ptDevicePos:POINT, pptLogicPos:ptr POINT 31
  assume esi:ptr POINT 32
  mov esi, pptLogicPos 33
   34
  mov eax, ptDevicePos.x 35
  sub eax, g_ptCoor.x 36
  mov [esi].x, eax 37
   38
  mov eax, ptDevicePos.y 39
  add eax, g_ptCoor.y 40
  mov [esi].y, eax 41
  assume esi:nothing 42
   43
  ret 44
  ConvDevicePos2logicPos endp       关于 钟表指针的绘制就比较简单了,用三角函数,根据分钟数,秒数,小时数,可以计算出相应的角度,再乘以半径就可以得到指定圆的交点坐标了,代码如下:
   1 ;//############################################################# 2
  ;// 设置指针长度 3
  ;//############################################################# 4
  SetPointLong proc hDC:HDC, dwPointType:DWORD, pptCoor:ptr POINT 5
  LOCAL @dwSize:DWORD 6
  assume esi:ptr POINT 7
  mov    esi,pptCoor 8
   9
  .if dwPointType == IDT_POINTTYPE_SECOND 10
  mov @dwSize, 25 11
   12
  .elseif  dwPointType == IDT_POINTTYPE_MIN 13
  mov @dwSize, 35 14
   15
  .elseif  dwPointType == IDT_POINTTYPE_HOUR 16
  mov @dwSize, 45 17
   18
  .endif 19
   20
  mov   eax, g_ptCoor.y 21
  SUB   EAX, @dwSize 22
  mov   [esi].y, eax 23
   24
  mov   eax, g_ptCoor.x 25
  SUB   EAX, @dwSize 26
  mov   [esi].x, eax 27
   28
  assume esi:nothing 29
   30
  ret 31
  SetPointLong endp 32
  33
  ;//###################################################################### 34
  ;// 功  能:绘制钟表指针 35
  ;// 函数名: DrawColckPoint 36
  ;// 参数 37
  ;//       hWnd: 窗口句柄 38
  ;//     nColor: 秒针的颜色 39
  ;//###################################################################### 40
  DrawColckPoint proc hDC:HDC, dwPointType:DWORD, nColor:DWORD 41
  LOCAL @sysTime:SYSTEMTIME 42
  LOCAL @ptCoor:POINT 43
  LOCAL @hPen:HPEN 44
  LOCAL @halfNum:WORD 45
  LOCAL @nX:DWORD 46
  LOCAL @nY:DWORD 47
  LOCAL @dwRadian:DWORD 48
  LOCAL @dwTmpTime:WORD 49
  LOCAL @dwSecSize:WORD 50
  51
  assume esi:ptr SYSTEMTIME 52
  lea esi,@sysTime 53
  invoke RtlZeroMemory, esi, sizeof @sysTime 54
  invoke GetLocalTime, esi 55
  mov @halfNum, 180 56
   57
  xor edx, edx 58
  xor eax, eax 59
  mov @hPen, eax 60
   61
  .if dwPointType == IDT_POINTTYPE_SECOND 62
  invoke CreatePen,PS_SOLID, 1, nColor 63
  MOV @hPen, eax 64
  mov ax, [esi].wSecond; 65
  mov @dwTmpTime, ax 66
  mov @dwSecSize, 6 67
   68
  .elseif  dwPointType == IDT_POINTTYPE_MIN 69
  invoke CreatePen,PS_SOLID, 2, nColor 70
  MOV @hPen, eax 71
  mov ax, [esi].wMinute; 72
  mov @dwTmpTime, ax 73
  mov @dwSecSize, 6 74
   75
  .elseif  dwPointType == IDT_POINTTYPE_HOUR 76
  invoke CreatePen,PS_SOLID, 3, nColor 77
  MOV @hPen, eax 78
  mov ax, [esi].wHour; 79
  mov @dwTmpTime, ax 80
  mov @dwSecSize, 30 81
  .endif 82
   83
  invoke SelectObject,hDC, @hPen 84
   85
  .if dwPointType == IDT_POINTTYPE_HOUR 86
  add @dwTmpTime, 9 87
  .if @dwTmpTime > 12 88
  sub @dwTmpTime, 12 89
  .endif 90
   91
  mov ax, 12 92
  sub ax, @dwTmpTime 93
  .if ax == 0 94
  mov @dwTmpTime, 12 95
  .else 96
  mov @dwTmpTime, ax 97
  .endif 98
  .else 99
  add @dwTmpTime, 45 100
  .if @dwTmpTime > 60 101
  sub @dwTmpTime, 60 102
  .endif 103
   104
  mov ax, 60 105
  sub ax, @dwTmpTime 106
  .if ax == 0 107
  mov @dwTmpTime, 60 108
  .else 109
  mov @dwTmpTime, ax 110
  .endif 111
  .endif 112
   113
  mov ax, @dwTmpTime 114
  mul @dwSecSize 115
  mov @dwSecSize, ax;// 相应秒数D 116
   117
  FLDPI 118
  FIDIV @halfNum  ;// 得到 1°角的弧度值 119
  FIMUL @dwSecSize  ;// 得到应秒数角的弧度值 120
  FSTP @dwRadian ; 121
  FLD  @dwRadian 122
   123
  FCOS    ;// 得到单位圆的X 124
  FSTP  @nX 125
  FLD  @dwRadian;// 再保存一次 126
  FSIN    ;// 得到单位圆的Y 127
  FSTP  @nY 128
   129
  invoke SetPointLong, hDC, dwPointType, addr @ptCoor 130
   131
  FLD   @nY 132
  FIMUL @ptCoor.y 133
  FISTP @ptCoor.y 134
   135
  FLD   @nX 136
  FIMUL @ptCoor.x 137
  FISTP @ptCoor.x 138
   139
  push  NULL          ;// 不要返回值 140
  push  g_ptCoor.y     ;// Y坐标 141
  push  g_ptCoor.x     ;// X坐标 142
  push  hDC 143
  call MoveToEx       ;// 移动到指定位置 144
   145
  invoke ConvlogicPos2DevicePos, @ptCoor, addr @ptCoor 146
  147
  push @ptCoor.y 148
  push  @ptCoor.x     ;// X坐标 149
  push  hDC 150
  call  LineTo 151
  invoke DeleteObject, @hPen; 152
  assume esi:nothing 153
   154
  ret 155
  DrawColckPoint endp 最后就是绘制方面,为了防止闪烁,用了双缓存,建了个内存DC,代码如下:
  1 OnPaintSub proc  hWnd:HWND 2
  LOCAL @ps:PAINTSTRUCT 3
  LOCAL @hDlgDC:HDC 4
  LOCAL @hMemDC:HDC 5
  LOCAL @hBmp:HBITMAP 6
  LOCAL @hBrush:HBRUSH 7
  LOCAL @tmpBuf:DWORD 8
   9
  ;// 得到窗口DC 10
  invoke BeginPaint, hWnd, addr @ps 11
  mov @hDlgDC, eax 12
   13
  mov eax, g_Rect.right 14
  sub eax, g_Rect.left 15
  mov @tmpBuf, eax 16
   17
  mov eax, g_Rect.bottom 18
  sub eax, g_Rect.top 19
  invoke CreateCompatibleBitmap, @hDlgDC, @tmpBuf,eax 20
  mov @hBmp, eax 21
   22
  invoke CreateCompatibleDC, @hDlgDC 23
  mov @hMemDC, eax 24
   25
  invoke CreateSolidBrush, 242448h 26
  mov @hBrush, eax 27
   28
  invoke SelectObject,@hMemDC, @hBmp 29
  invoke SelectObject,@hMemDC, @hBrush 30
   31
  invoke FillRect, @hMemDC,addr g_Rect, @hBrush; 32
   33
  invoke DrawClockBK, @hMemDC             ;// 绘制钟表背景 34
  invoke ShowTimeText, @hMemDC, IDT_COLOR_TEXT  ;// 绘制文本时间字符 35
  invoke DrawColckPoint, @hMemDC, IDT_POINTTYPE_HOUR, 0 36
  invoke DrawColckPoint, @hMemDC, IDT_POINTTYPE_MIN, 0 37
  invoke DrawColckPoint, @hMemDC, IDT_POINTTYPE_SECOND, 00000FFh 38
   39
  mov eax, g_Rect.bottom 40
  sub eax, g_Rect.top 41
  invoke BitBlt, @hDlgDC, 0, 0, @tmpBuf, eax, @hMemDC, 0, 0, SRCCOPY 42
   43
  invoke DeleteDC, @hMemDC; 44
  invoke DeleteObject, @hBrush; 45
  invoke DeleteObject, @hBmp; 46
  invoke EndPaint, hWnd, addr @ps; 47
   48
  ret 49
  OnPaintSub endp             最后贴下效果图:                                恩,就这么多了,下面给出完整代码。
 
	    
    
Feedback
				
					
						# re: 老师布置的作业:让写一个电子钟,发上来留个纪念  回复  更多评论
						  
					
					2010-07-28 08:06 by 
				 高人 
				
					
						# re: 老师布置的作业:让写一个电子钟,发上来留个纪念  回复  更多评论
						  
					
					2010-07-28 08:28 by 
				 啥语言的? 
				
					
						# re: 老师布置的作业:让写一个电子钟,发上来留个纪念  回复  更多评论
						  
					
					2010-07-28 09:31 by 
				 DELPHI 
				
					
						# re: 老师布置的作业:让写一个电子钟,发上来留个纪念[未登录]  回复  更多评论
						  
					
					2010-07-28 10:00 by 
				 这是Delphi??
这分明是pascal嘛。。。。。。
 
 楼主还是学生,我曾在看雪里拜读过你的文章
 
				
					
						# re: 老师布置的作业:让写一个电子钟,发上来留个纪念  回复  更多评论
						  
					
					2010-07-28 10:35 by 
				 pascal,汉……
 不过MASM那堆语法也跟高级语言差不多了
 
 
				
					
						# re: 老师布置的作业:让写一个电子钟,发上来留个纪念[未登录]  回复  更多评论
						  
					
					2010-07-28 17:10 by 
				 @ZUHD
(*^__^*) 嘻嘻……,那些东西就别提了,上不了台面的……
 
				
					
						# re: 老师布置的作业:让写一个电子钟,发上来留个纪念  回复  更多评论
						  
					
					2010-07-28 17:25 by 
				 这个明明是 VB 嘛...  
 唉. 现在的人眼神越来越差了~!
 
				
					
						# re: 老师布置的作业:让写一个电子钟,发上来留个纪念  回复  更多评论
						  
					
					2010-08-05 14:47 by 
				 看到汇编指令 我很纠结 
				
					
						# re: 老师布置的作业:让写一个电子钟,发上来留个纪念  回复  更多评论
						  
					
					2010-08-08 09:06 by 
				 汇编现在还有应用领域吗 搞不懂 
				
					
						# re: 老师布置的作业:让写一个电子钟,发上来留个纪念  回复  更多评论
						  
					
					2010-08-11 16:44 by 
				 @nehCretseB
是VB?笑掉大牙!
 
				
					
						# re: 老师布置的作业:让写一个电子钟,发上来留个纪念  回复  更多评论
						  
					
					2010-09-15 11:23 by 
				 这好像是易语言的吧? 
				
					
						# re: 老师布置的作业:让写一个电子钟,发上来留个纪念[未登录]  回复  更多评论
						  
					
					2012-04-08 17:13 by 
				 应该是WIN32汇编写的吧,我下了金山卫士会报毒。
不过我想应该是误报。不知道是不是
 |