//通过移动坐标原点来实现正弦曲线,可以减少数组元素的移动 //但要开辟2*NUM空间的数组。 #include <windows.h> #include <math.h> #define ID_TIMER 1 #define NUM 1000 #define STEP 10//每次移动的步长 #define TWOPI (2 * 3.14159) LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("SineWave") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc= WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { MessageBox ( NULL, TEXT ("Program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow ( szAppName, TEXT ("Sine Wave Using Polyline"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)){ TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ static int cxClient, cyClient ; HDC hdc ; int i; PAINTSTRUCT ps ; static POINT apt [2*NUM] ; static HPEN hPen1,hPen2; static int step; switch (message) { case WM_SIZE: cxClient = LOWORD(lParam); cyClient = HIWORD(lParam); for(i = 0; i < 2 * NUM; i++) { apt[i].x = (int)(i * cxClient / NUM); apt[i].y = (int) (cyClient * (1 - sin(TWOPI * i / NUM)) / 2); } return 0; case WM_CREATE: hPen1 = CreatePen(PS_SOLID,4,RGB(255,0,0)); hPen2 = CreatePen(PS_SOLID,2,RGB(0,255,0)); SetTimer(hwnd,ID_TIMER,100,NULL); return 0; case WM_TIMER: step= (step+STEP) % NUM; InvalidateRect(hwnd,NULL,true); UpdateWindow(hwnd); return 0; case WM_PAINT: hdc = BeginPaint(hwnd,&ps); SetViewportOrgEx(hdc,-step*cxClient/NUM,0,NULL); SelectObject(hdc,hPen1); MoveToEx(hdc,-step*cxClient/NUM,cyClient/2,NULL); LineTo(hdc,cxClient+step*cxClient/NUM,cyClient/2); SelectObject(hdc,hPen2); Polyline (hdc, apt+step, NUM) ; EndPaint(hwnd,&ps); return 0; case WM_DESTROY: PostQuitMessage(0); KillTimer(hwnd,ID_TIMER); DeleteObject(hPen1); DeleteObject(hPen2); return 0; } return DefWindowProc(hwnd,message,wParam,lParam); }