return 0 ; case WM_PAINT : hdc = BeginPaint (hwnd, &ps) ; SetIsotropic (hdc, cxClient, cyClient) ; DrawClock (hdc) ; DrawHands (hdc, &stPrevious, TRUE) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY : KillTimer (hwnd, ID_TIMER) ; PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
CLOCK萤幕显示如图8-2。
等方向性(isotropic)映射对於这样的应用来说是理想的,CLOCK.C中的SetIsotropic函式负责设定此模式。在呼叫SetMapMode之後,SetIsotropic将视窗范围设定为1000,并将视埠范围设定为显示区域的一半宽度和显示区域的负的一半高度。视埠原点被设定为显示区域的中心。我在第五章中讨论过,这将建立一个笛卡儿座标系,其点(0,0)位於显示区域的中心,在所有方向上的范围都是1000。
RotatePoint函式是用到三角函数的地方,此函式的三个参数分别是一个或者多个点的阵列、阵列中点的个数以及以度为单位的旋转角度。函式以原点为中心按顺时针方向(这对一个时钟正合适)旋转这些点。例如,如果传给函式的点是(0,100)-即12:00的位置-而角度为90度,那么该点将被变换为(100,0)-即3:00。它使用下列公式来做到这一点:
x' = x * cos (a) + y * sin (a) y' = y * cos (a) - x * sin (a)
RotatePoint函式在绘制时钟表面的点和表针时都是有用的,我们将马上看到这一点。
DrawClock函式绘制60个时钟表面的点,从顶部(12:00)开始,其中每个点离原点900单位,因此第一个点位於(0,900),此後的每个点按顺时针依次增加6度。这些点 |