WinAPI——谐振动的合成

  1 #include<Windows.h>
  2 #include<math.h>
  3 
  4 #define NUM 1000
  5 #define PI  3.14159
  6 
  7 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM) ;
  8 void Draw(HWND) ;
  9 
 10 static int    cxClient, cyClient, xOffset, yOffset;
 11 POINT        apt[NUM] ;
 12 static int    A = 100 ;
 13 
 14 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
 15 {
 16     static TCHAR szAppName[] = TEXT("谐振动合成") ;
 17     HWND     hwnd ;
 18     MSG         msg ;
 19     WNDCLASS wndclass ;
 20     
 21     wndclass.cbClsExtra        = NULL ;
 22     wndclass.cbWndExtra        = NULL ;
 23     wndclass.hbrBackground    = (HBRUSH)GetStockObject(WHITE_BRUSH) ;
 24     wndclass.hCursor        = LoadCursor(NULL, IDC_ARROW) ;
 25     wndclass.hIcon            = LoadIcon(NULL, IDI_APPLICATION) ;
 26     wndclass.hInstance        = hInstance ;
 27     wndclass.lpfnWndProc    = WndProc ;
 28     wndclass.lpszClassName    = szAppName ;
 29     wndclass.lpszMenuName    = NULL ;
 30     wndclass.style            = CS_HREDRAW | CS_VREDRAW ;
 31 
 32     if(!RegisterClass(&wndclass))
 33     {
 34         MessageBox(NULL, TEXT("This Program Requires Windows NT !"), szAppName, MB_ICONERROR) ;
 35         return 0 ;
 36     }
 37 
 38     hwnd = CreateWindow(szAppName, TEXT("谐振动合成"), WS_OVERLAPPEDWINDOW,
 39             CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, 
 40             NULL, NULL, hInstance, NULL) ;
 41     ShowWindow(hwnd, iCmdShow) ;
 42     UpdateWindow(hwnd) ;
 43 
 44     while(TRUE)
 45     {
 46         if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
 47         {
 48             if(msg.message == WM_QUIT)
 49                 break ;
 50             TranslateMessage(&msg) ;
 51             DispatchMessage(&msg) ;
 52         }
 53         else 
 54         {
 55             Draw(hwnd) ;
 56         }
 57     }
 58     return msg.wParam ;
 59 }
 60 
 61 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 62 {
 63 
 64     switch(message)
 65     {
 66     case WM_SIZE :
 67         cxClient = LOWORD(lParam) ;
 68         cyClient = HIWORD(lParam) ;
 69         xOffset  = cxClient / 2 ;
 70         yOffset  = cyClient / 2 ;
 71         A = xOffset < yOffset ? xOffset : yOffset ;
 72 
 73         return 0 ;
 74 
 75     case WM_DESTROY :
 76         PostQuitMessage(0) ;
 77         return 0 ;
 78     }
 79     return DefWindowProc(hwnd, message, wParam, lParam) ;
 80 }
 81 
 82 void Draw(HWND hwnd)
 83 {
 84     HDC            hdc ;
 85     PAINTSTRUCT ps ;
 86     RECT        rect ;
 87     int            t ;
 88     static double    w1 = 4, w2 = 5 ;                // w1 : w2 = 1 : 2
 89     static double    g = PI / 2 ;                    // 初相位之差
 90 
 91     hdc = GetDC(hwnd) ;
 92 
 93     apt[0].x = xOffset ;
 94     apt[0].y = yOffset + A * sin(g) ;
 95     MoveToEx(hdc, apt[0].x, apt[0].y, NULL) ;
 96     for(t = 1; t < NUM ; t++)
 97     {
 98         apt[t].x = xOffset + A * sin(t * 2 * w1 * w2 * PI /( NUM * w1 ));
 99         apt[t].y = yOffset + A * sin(t * 2 * w1 * w2 * PI /( NUM * w2 ) + g ) ;
100         LineTo(hdc, apt[t].x, apt[t].y) ;
101         MoveToEx(hdc, apt[t].x, apt[t].y, NULL) ;    
102     }
103 //    Polyline(hdc, apt, NUM ) ;
104 
105     rect.bottom = cyClient ;
106     rect.left    = 0 ;
107     rect.right  = cxClient ;
108     rect.top    = 0 ;
109 
110 //    Sleep(1000) ;
111 //    w1 ++ ;
112 //    w2 ++ ;
113 //    g += PI / 4 ;
114 //    InvalidateRect(hwnd, &rect, TRUE) ;
115 
116     ReleaseDC(hwnd, hdc) ;
117 }
原文地址:https://www.cnblogs.com/doodle777/p/3160019.html