www.pudn.com > FFTdemo.zip > main.c


#include  
 
#include "main.h" 
#include "fft.h" 
 
/* Declare Windows procedure   
 */ 
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); 
 
/* Paint Function by xinwang  
 */ 
void paint(HDC hdc); 
 
/* Make the class name into a global variable */ 
char szClassName[ ] = "WindowsApp"; 
char szAppName[ ] = "resource"; 
 
/* Some GUI interface hwnd  
 */ 
HWND hGroupWFrm;    /* wave form */ 
HWND hRadioWSqu; 
HWND hRadioWSin; 
HWND hRadioWTri;    int  wfsel[3] = {1,0,0}; 
 
HWND hGroupWAtr;    /* wave attribute */ 
HWND hLaberWCyc; 
HWND hEditWCyc;     int cycle = 100; 
HWND hLaberWSco; 
HWND hEditWSco;     int scope = 50; 
HWND hLaberWPar; 
HWND hEditWPar;     int parse = 0; 
 
HWND hGroupSamp;    /* sample control */ 
HWND hLaberSAlt; 
HWND hEditSAlt;     int smp_alter = 1; 
HWND hLaberSNum; 
HWND hEditSNum;     int smp_num = 512; 
 
HWND hButtonOK;     /* Action button */ 
 
/* Userful variable */ 
char strtmp[] = ""; 
char* strstop; 
int nmax; 
 
/* wave form */ 
enum {SQU, SIN, TRI} wave; 
 
/* This instance handle  
 */ 
HINSTANCE hInst; 
 
int WINAPI WinMain (HINSTANCE hThisInstance, 
                    HINSTANCE hPrevInstance, 
                    LPSTR lpszArgument, 
                    int nFunsterStil) 
{ 
    HWND hwnd;               /* This is the handle for our window */ 
    MSG messages;            /* Here messages to the application are saved */ 
    WNDCLASSEX wincl;        /* Data structure for the windowclass */ 
 
    /* The Window structure */ 
    wincl.hInstance = hThisInstance; 
    wincl.lpszClassName = szClassName; 
    wincl.lpfnWndProc = WindowProcedure;/* This function is called by windows */ 
    wincl.style = CS_DBLCLKS;           /* Catch double-clicks */ 
    wincl.cbSize = sizeof (WNDCLASSEX); 
 
    /* Use default icon and mouse-pointer */ 
    wincl.hIcon = LoadIcon (hThisInstance, "mico"); 
    wincl.hIconSm = LoadIcon (hThisInstance, "mico"); 
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW); 
    wincl.lpszMenuName = NULL;       /* No menu */ 
    wincl.cbClsExtra = 0;            /* No extra bytes after the window class */ 
    wincl.cbWndExtra = 0;            /* structure or the window instance */ 
    /* Use Windows's default color as the background of the window */ 
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; 
 
    /* Register the window class, and if it fails quit the program */ 
    if (!RegisterClassEx (&wincl)) 
        return 0; 
 
    /* The class is registered, let's create the program*/ 
    hwnd = CreateWindowEx ( 
           0,                   /* Extended possibilites for variation */ 
           szClassName,         /* Classname */ 
           "Windows App",       /* Title Text */ 
           WS_OVERLAPPEDWINDOW, /* default window */ 
           CW_USEDEFAULT,       /* Windows decides the position */ 
           CW_USEDEFAULT,       /* where the window ends up on the screen */ 
           600,                 /* The programs width */ 
           500,                 /* and height in pixels */ 
           HWND_DESKTOP,        /* The window is a child-window to desktop */ 
           NULL,                /* No menu */ 
           hThisInstance,       /* Program Instance handler */ 
           NULL                 /* No Window Creation data */ 
           ); 
 
    /* Make the window visible on the screen */ 
    ShowWindow (hwnd, nFunsterStil); 
    hInst = hThisInstance; 
    /* Run the message loop. It will run until GetMessage() returns 0 */ 
    while (GetMessage (&messages, NULL, 0, 0)) 
    { 
        /* Translate virtual-key messages into character messages */ 
        TranslateMessage(&messages); 
        /* Send message to WindowProcedure */ 
        DispatchMessage(&messages); 
    } 
 
    /* The program return-value is 0 - The value that PostQuitMessage() gave */ 
    return messages.wParam; 
} 
 
/*  This function is called by the Windows function DispatchMessage()  */ 
 
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    /* for message wm_paint */ 
    HDC hdc; 
    PAINTSTRUCT ptstr; 
     
    switch (message)                  /* handle the messages */ 
    { 
        case WM_CREATE: 
            /* Add display control. 
             */ 
            hGroupWFrm = CreateWindow("BUTTON",  
                "波形", 
                WS_CHILD|WS_VISIBLE|BS_GROUPBOX, 
                FRX, FRY, 130, 110, 
                hwnd, (HMENU)IDG_WFRM, 
                hInst, NULL 
                ); 
            hRadioWSqu = CreateWindow("BUTTON", 
                "方波", 
                WS_CHILD|WS_VISIBLE|BS_RADIOBUTTON, 
                FRX+30, FRY+25, 80, 20, 
                hwnd, (HMENU)IDR_WSQU, 
                hInst, NULL 
                ); 
            hRadioWSin = CreateWindow("BUTTON", 
                "正弦波", 
                WS_CHILD|WS_VISIBLE|BS_RADIOBUTTON, 
                FRX+30, FRY+50, 80, 20, 
                hwnd, (HMENU)IDR_WSIN, 
                hInst, NULL 
                ); 
            hRadioWTri = CreateWindow("BUTTON", 
                "三角波", 
                WS_CHILD|WS_VISIBLE|BS_RADIOBUTTON, 
                FRX+30, FRY+75, 80, 20, 
                hwnd, (HMENU)IDR_WTRI, 
                hInst, NULL 
                ); 
 
            hGroupWAtr = CreateWindow("BUTTON",  
                "波形属性", 
                WS_CHILD|WS_VISIBLE|BS_GROUPBOX, 
                FRX+150, FRY, 180, 110, 
                hwnd, (HMENU)IDG_WATR, 
                hInst, NULL 
                ); 
            hLaberWCyc = CreateWindow("STATIC", 
                "周期", 
                WS_CHILD|WS_VISIBLE, 
                FRX+180, FRY+25, 40, 20, 
                hwnd, (HMENU)IDS_WCYC, 
                hInst, NULL 
                ); 
            hEditWCyc = CreateWindow("EDIT", 
                "100", 
                WS_CHILD|WS_VISIBLE|WS_BORDER|ES_RIGHT, 
                FRX+220, FRY+25, 80, 20, 
                hwnd, (HMENU)IDE_WCYC, 
                hInst, NULL 
                ); 
            hLaberWSco = CreateWindow("STATIC", 
                "幅值", 
                WS_CHILD|WS_VISIBLE, 
                FRX+180, FRY+50, 40, 20, 
                hwnd, (HMENU)IDS_WSCO, 
                hInst, NULL 
                ); 
            hEditWSco = CreateWindow("EDIT", 
                "50", 
                WS_CHILD|WS_VISIBLE|WS_BORDER|ES_RIGHT, 
                FRX+220, FRY+50, 80, 20, 
                hwnd, (HMENU)IDE_WSCO, 
                hInst, NULL 
                ); 
            hLaberWPar = CreateWindow("STATIC", 
                "相位", 
                WS_CHILD|WS_VISIBLE, 
                FRX+180, FRY+75, 40, 20, 
                hwnd, (HMENU)IDS_WPAR, 
                hInst, NULL 
                ); 
            hEditWPar = CreateWindow("EDIT", 
                "0", 
                WS_CHILD|WS_VISIBLE|WS_BORDER|ES_RIGHT, 
                FRX+220, FRY+75, 80, 20, 
                hwnd, (HMENU)IDE_WPAR, 
                hInst, NULL 
                ); 
                 
            hGroupSamp = CreateWindow("BUTTON",  
                "取样", 
                WS_CHILD|WS_VISIBLE|BS_GROUPBOX, 
                FRX+350, FRY, 200, 110, 
                hwnd, (HMENU)IDG_SAMP, 
                hInst, NULL 
                ); 
            hLaberSAlt = CreateWindow("STATIC", 
                "取样间隔", 
                WS_CHILD|WS_VISIBLE, 
                FRX+380, FRY+25, 80, 20, 
                hwnd, (HMENU)IDS_SALT, 
                hInst, NULL 
                ); 
            hEditSAlt = CreateWindow("EDIT", 
                "1", 
                WS_CHILD|WS_VISIBLE|WS_BORDER|ES_RIGHT, 
                FRX+450, FRY+25, 80, 20, 
                hwnd, (HMENU)IDE_SALT, 
                hInst, NULL 
                ); 
            hLaberSNum = CreateWindow("STATIC", 
                "取样数", 
                WS_CHILD|WS_VISIBLE, 
                FRX+380, FRY+50, 80, 20, 
                hwnd, (HMENU)IDS_SNUM, 
                hInst, NULL 
                ); 
            hEditSNum = CreateWindow("EDIT", 
                "512", 
                WS_CHILD|WS_VISIBLE|WS_BORDER|ES_RIGHT, 
                FRX+450, FRY+50, 80, 20, 
                hwnd, (HMENU)IDE_SNUM, 
                hInst, NULL 
                ); 
            hButtonOK = CreateWindow("BUTTON", 
                "OK", 
                WS_CHILD|WS_VISIBLE, 
                FRX+450, FRY+80, 80, 20, 
                hwnd, (HMENU)IDC_OK, 
                hInst, NULL 
                ); 
            SendMessage(hRadioWSqu, BM_SETCHECK, 1, 0); 
            break; 
        case WM_DESTROY: 
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */ 
            break; 
        case WM_PAINT: 
            hdc = BeginPaint(hwnd, &ptstr); 
            paint(hdc); 
            EndPaint(hwnd, &ptstr); 
            break; 
        case WM_COMMAND: 
            switch (LOWORD(wParam)) 
            { 
                case IDR_WSQU: 
                    wfsel[0]=1; wfsel[1]=0; wfsel[2]=0; 
                    SendMessage(hRadioWSqu, BM_SETCHECK, wfsel[0], 0); 
                    SendMessage(hRadioWSin, BM_SETCHECK, wfsel[1], 0); 
                    SendMessage(hRadioWTri, BM_SETCHECK, wfsel[2], 0); 
                    break; 
                case IDR_WSIN: 
                    wfsel[0]=0; wfsel[1]=1; wfsel[2]=0; 
                    SendMessage(hRadioWSqu, BM_SETCHECK, wfsel[0], 0); 
                    SendMessage(hRadioWSin, BM_SETCHECK, wfsel[1], 0); 
                    SendMessage(hRadioWTri, BM_SETCHECK, wfsel[2], 0); 
                    break; 
                case IDR_WTRI: 
                    wfsel[0]=0; wfsel[1]=0; wfsel[2]=1; 
                    SendMessage(hRadioWSqu, BM_SETCHECK, wfsel[0], 0); 
                    SendMessage(hRadioWSin, BM_SETCHECK, wfsel[1], 0); 
                    SendMessage(hRadioWTri, BM_SETCHECK, wfsel[2], 0); 
                    break; 
                case IDC_OK: 
                    if (wfsel[0]==1) 
                        wave = SQU; 
                    if (wfsel[1]==1) 
                        wave = SIN; 
                    if (wfsel[2]==1) 
                        wave = TRI; 
                         
                    nmax = GetWindowTextLength(hEditWCyc)+1; 
                    GetWindowText(hEditWCyc, strtmp, nmax); 
                    cycle = strtol(strtmp, &strstop, 10); 
                     
                    nmax = GetWindowTextLength(hEditWSco)+1; 
                    GetWindowText(hEditWSco, strtmp, nmax); 
                    scope = strtol(strtmp, &strstop, 10); 
                     
                    nmax = GetWindowTextLength(hEditWPar)+1; 
                    GetWindowText(hEditWPar, strtmp, nmax); 
                    parse = strtol(strtmp, &strstop, 10); 
                     
                    nmax = GetWindowTextLength(hEditSAlt)+1; 
                    GetWindowText(hEditSAlt, strtmp, nmax); 
                    smp_alter = strtol(strtmp, &strstop, 10); 
                     
                    nmax = GetWindowTextLength(hEditSNum)+1; 
                    GetWindowText(hEditSNum, strtmp, nmax); 
                    smp_num = strtol(strtmp, &strstop, 10); 
                     
                    InvalidateRect(hwnd, NULL, TRUE); 
                    break; 
            } 
            break; 
        default:                      /* for messages that we don't deal with */ 
            return DefWindowProc (hwnd, message, wParam, lParam); 
    } 
 
    return 0; 
} 
 
/* paint function */ 
void paint(HDC hdc) 
{    
    int L=0, N=1; 
    while (N