WinAPI——模拟正弦波

  1 /***************************
  2  *  
  3  *  程序名称 : 模拟正弦波
  4  *  作    者 : doodle777
  5  *  版    本 : 1.1
  6  *  日    期 : 2012-10-19
  7  *  说    明 : 1.1--解决了闪屏问题
  8  *
  9  ***************************/
 10 
 11 #include<Windows.h>
 12 #include<math.h>
 13 
 14 #define NUM 1000
 15 #define PI  3.14159
 16 
 17 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM) ;
 18 void Draw(HWND, float, float) ;
 19 
 20 static int    cxClient, cyClient, xOffset, yOffset;
 21 POINT        apt[NUM] ;
 22 static int    A = 1000 ;
 23 static float w = 20, g = 0 ;
 24 
 25 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
 26 {
 27     static TCHAR szAppName[] = TEXT("模拟正弦波") ;
 28     HWND     hwnd ;
 29     MSG         msg ;
 30     WNDCLASS wndclass ;
 31     
 32     wndclass.cbClsExtra        = NULL ;
 33     wndclass.cbWndExtra        = NULL ;
 34     wndclass.hbrBackground    = (HBRUSH)GetStockObject(WHITE_BRUSH) ;
 35     wndclass.hCursor        = LoadCursor(NULL, IDC_ARROW) ;
 36     wndclass.hIcon            = LoadIcon(NULL, IDI_APPLICATION) ;
 37     wndclass.hInstance        = hInstance ;
 38     wndclass.lpfnWndProc    = WndProc ;
 39     wndclass.lpszClassName    = szAppName ;
 40     wndclass.lpszMenuName    = NULL ;
 41     wndclass.style            = CS_HREDRAW | CS_VREDRAW ;
 42 
 43     if(!RegisterClass(&wndclass))
 44     {
 45         MessageBox(NULL, TEXT("This Program Requires Windows NT !"), szAppName, MB_ICONERROR) ;
 46         return 0 ;
 47     }
 48 
 49     hwnd = CreateWindow(szAppName, TEXT("模拟正弦波(上下左右控制)"), WS_OVERLAPPEDWINDOW,
 50             CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, 
 51             NULL, NULL, hInstance, NULL) ;
 52     ShowWindow(hwnd, iCmdShow) ;
 53     UpdateWindow(hwnd) ;
 54 
 55     while(TRUE)
 56     {
 57         if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
 58         {
 59             if(msg.message == WM_QUIT)
 60                 break ;
 61             TranslateMessage(&msg) ;
 62             DispatchMessage(&msg) ;
 63         }
 64         else 
 65         {
 66             Draw(hwnd, w, g) ;
 67     //        w += 1 ;
 68     //        g += PI / 6 ;
 69 
 70         }
 71     }
 72     return msg.wParam ;
 73 }
 74 
 75 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 76 {
 77     RECT        rect ;
 78 
 79     rect.bottom = cyClient ;
 80     rect.left    = 0 ;
 81     rect.right  = cxClient ;
 82     rect.top    = 0 ;
 83 
 84     switch(message)
 85     {
 86     case WM_SIZE :
 87         cxClient = LOWORD(lParam) ;
 88         cyClient = HIWORD(lParam) ;
 89         xOffset  = cxClient / 2 ;
 90         yOffset  = cyClient / 2 ;
 91         A = cyClient / 2 ;
 92 
 93         return 0 ;
 94 
 95     case WM_KEYDOWN :
 96         InvalidateRect(hwnd, &rect, TRUE) ;
 97         switch(wParam)
 98         {
 99         case VK_UP :
100             g += PI / 6 ;
101             break ;
102         case VK_DOWN :
103             g -= PI / 6 ;
104             break ;
105         case VK_LEFT :
106             w -= 1 ;
107             break ;
108         case VK_RIGHT :
109             w += 1 ;
110             break ;
111         }
112         return 0 ;
113 
114 
115     case WM_DESTROY :
116         PostQuitMessage(0) ;
117         return 0 ;
118     }
119     return DefWindowProc(hwnd, message, wParam, lParam) ;
120 }
121 
122 void Draw(HWND hwnd, float w, float g)
123 {
124     HDC            hdc ;
125     PAINTSTRUCT ps ;
126     int            t ;
127 
128     hdc = GetDC(hwnd) ;
129 
130     MoveToEx(hdc, 0, yOffset, NULL) ;
131     LineTo(hdc, cxClient, yOffset) ;
132     MoveToEx(hdc, xOffset, 0, NULL) ;
133     LineTo(hdc, xOffset, cyClient) ; 
134 
135     apt[0].x = 0 ;
136     apt[0].y = yOffset + A * sin(g) ;
137     MoveToEx(hdc, apt[0].x, apt[0].y, NULL) ;
138     for(t = 1; t < NUM ; t++)
139     {
140         apt[t].x = cxClient * t / NUM ;
141         apt[t].y = yOffset + A * sin(w * t / NUM  + g ) ;
142         LineTo(hdc, apt[t].x, apt[t].y) ;
143         MoveToEx(hdc, apt[t].x, apt[t].y, NULL) ;    
144     }
145 
146     ReleaseDC(hwnd, hdc) ;
147 }
原文地址:https://www.cnblogs.com/doodle777/p/3160478.html