|
|
Windows程序之滚动的正弦曲线(一)
#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 [NUM] ; static HPEN hPen1,hPen2; static int step; int copyApt[STEP]; switch (message) { case WM_SIZE: cxClient = LOWORD(lParam); cyClient = HIWORD(lParam); for(i = 0; i < 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: for(i = 0; i < STEP; i++) { copyApt[i] = apt[i].y; } for(i = 0; i < NUM-STEP; i++) { apt[i].y = apt[i+STEP].y; } for(i = 0; i < STEP; i++){ apt[i + NUM - STEP].y = copyApt[i]; } InvalidateRect(hwnd,NULL,true); UpdateWindow(hwnd); return 0; case WM_PAINT: hdc = BeginPaint(hwnd,&ps); SelectObject(hdc,hPen1); MoveToEx(hdc,0,cyClient/2,NULL); LineTo(hdc,cxClient,cyClient/2); SelectObject(hdc,hPen2); Polyline (hdc, apt, 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);} |
|