/*--------------------------------------------------- sinwave.h --- sinwave, (c) jiyun.xia 2011 ---------------------------------------------------*/ #ifndef SINWAVE_H_ #define SINWAVE_H_ #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); #endif /*----------------------------------------------- sinwave.cpp --- draw sine. ------------------------------------------------*/ #include "sinwave.h" #include <math.h> #include <time.h> #define ID_TIME1 1 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT("sinwave"); HWND hWnd; MSG msg; WNDCLASS wndClass; wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hbrBackground = (HBRUSH)::GetStockObject(BLACK_BRUSH); wndClass.hCursor = ::LoadCursor(NULL, IDC_ARROW); wndClass.hIcon = ::LoadIcon(NULL, IDI_APPLICATION); wndClass.hInstance = hInstance; wndClass.lpfnWndProc = WndProc; wndClass.lpszClassName = szAppName; wndClass.lpszMenuName = NULL; wndClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; if (!::RegisterClass(&wndClass)) { ::MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR); return 0; } hWnd = ::CreateWindow(szAppName, TEXT("sinwave No.1"), 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 lineNum; static int cyClient, yHight; static int cxClient; HDC hdc; PAINTSTRUCT ps; HPEN hPen, hBlackPen; static int sign = -2; static unsigned char rColor, gColor, bColor; int i; static POINT *pPt; switch (message) { case WM_CREATE: ::SetTimer(hWnd, ID_TIME1, 10, NULL); return 0; case WM_SIZE: cyClient = HIWORD(lParam); cxClient = LOWORD(lParam); yHight = cyClient; sign = -2; if (!pPt) delete [] pPt; pPt = new POINT[cxClient + 1]; return 0; case WM_TIMER: if (wParam == ID_TIME1) { hdc = ::GetDC(hWnd); ::Polyline(hdc, pPt, cxClient); yHight +=sign; if (yHight <= -cyClient || yHight >= cyClient) sign *= -1; for (i = 0; i <= cxClient; ++i) { pPt[i].x = i; pPt[i].y =int(cyClient / 2.0 - yHight / 2.0 * sin(2 * 2 * 3.1415926 / cxClient * i)); } srand( (unsigned)time(NULL)); rColor = rand() % 255; gColor = rand() % 255; bColor = rand() % 255; hPen = ::CreatePen(PS_SOLID, 1, RGB(rColor, gColor, bColor)); hBlackPen= (HPEN)::SelectObject(hdc, (HPEN)hPen); ::Polyline(hdc, pPt, cxClient); SelectObject(hdc, (HPEN)hBlackPen); ::DeleteObject((HPEN)hPen); ::ReleaseDC(hWnd, hdc); } return 0; case WM_PAINT: hdc = ::BeginPaint(hWnd, &ps); for (i = 0; i <= cxClient; ++i) { pPt[i].x = i; pPt[i].y =int(cyClient / 2.0 * (1 - sin(2 * 3.1415926 / cxClient * i))); } ::Polyline(hdc, pPt, cxClient); ::EndPaint(hWnd, &ps); return 0; case WM_DESTROY: ::PostQuitMessage(0); return 0; } return ::DefWindowProc(hWnd, message, wParam, lParam); }