类似示波器显示波形的Windows程序(Win32 API实现)

以下是我用C语言写的一个实现了示波器功能的Windows程序,显示波形,其显示风格同示波器一样,以下是源码,如有不正支持求大神赐教!

#include<Windows.h>

#define ID_START_BTN 1

#define POINTS 500

#define START_BTN_WIDTH 50
#define START_BTN_HEIGHT 30

HINSTANCE hInst;
HWND hWaveWnd;
HPEN hPen;

POINT apt[POINTS];
int nLastNewPointPos;

int waveWndWidth, waveWndHeight;

LRESULT CALLBACK MainWndProc(HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
    );

LRESULT CALLBACK WaveWndProc(HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
    );

int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
    )
{
    WNDCLASS wls;
    HWND hwnd;
    MSG msg;

    hInst = hInstance;

    wls.cbClsExtra = 0;
    wls.cbWndExtra = 0;
    wls.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
    wls.hCursor = LoadCursor(NULL, IDC_ARROW);
    wls.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wls.hInstance = hInst;
    wls.lpfnWndProc = MainWndProc;
    wls.lpszClassName = TEXT("MainWnd");
    wls.lpszMenuName = NULL;
    wls.style = CS_HREDRAW | CS_VREDRAW;

    RegisterClass(&wls);

    hwnd = CreateWindow(TEXT("MainWnd"), TEXT("示波器"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, NULL, hInst, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

LRESULT CALLBACK MainWndProc(HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
    )
{
    int clientWidth, clientHeight;
    WNDCLASS cls;
    static HWND hBtn;

    switch (uMsg)
    {
    case WM_CREATE:
        hPen = CreatePen(PS_SOLID,1,RGB(0,255,64));
        cls.cbClsExtra = 0;
        cls.cbWndExtra = 0;
        cls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
        cls.hCursor = LoadCursor(NULL, IDC_ARROW);
        cls.hIcon = NULL;
        cls.hInstance = hInst;
        cls.lpfnWndProc = WaveWndProc;
        cls.lpszClassName = TEXT("ChildWnd");
        cls.lpszMenuName = NULL;
        cls.style = CS_HREDRAW | CS_VREDRAW;
        RegisterClass(&cls);
        hWaveWnd = CreateWindow(TEXT("ChildWnd"), NULL, WS_VISIBLE | WS_CHILD, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, NULL, hInst, NULL);
        hBtn = CreateWindow(TEXT("Button"), TEXT("开始"), WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
            CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, (HMENU)ID_START_BTN, hInst, NULL);
        return 0;
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case ID_START_BTN:
            SetTimer(hWaveWnd,1,2,NULL);
            break;
        }
        return 0;
    case WM_SIZE:
        clientWidth = LOWORD(lParam);
        clientHeight = HIWORD(lParam);
        MoveWindow(hBtn, clientWidth - START_BTN_WIDTH, 0, START_BTN_WIDTH, START_BTN_HEIGHT, TRUE);
        MoveWindow(hWaveWnd, 0, 0, clientWidth - START_BTN_WIDTH, clientHeight, TRUE);
        return 0;
    case WM_DESTROY:
        DeleteObject(hPen);
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

LRESULT CALLBACK WaveWndProc(HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
    )
{
    PAINTSTRUCT ps;
    HDC hdc;
    HGDIOBJ hOld;
    int i;

    switch (uMsg)
    {
    case WM_TIMER:
        if (nLastNewPointPos >= POINTS)
            nLastNewPointPos = 0;
        apt[nLastNewPointPos].y = rand() % (waveWndHeight - 0 + 1) + 0;
        nLastNewPointPos++;
        InvalidateRect(hwnd, NULL, TRUE);
        return 0;
    case WM_SIZE:
        waveWndWidth = LOWORD(lParam);
        waveWndHeight = HIWORD(lParam);
        for (i = 0; i < POINTS; i++)
        {
            apt[i].x = i*waveWndWidth / POINTS;
            apt[i].y = -10;
        }
        nLastNewPointPos = 0;
        return 0;
    case WM_PAINT:
        hdc = BeginPaint(hwnd,&ps);
        hOld = SelectObject(hdc,hPen);
        Polyline(hdc, apt, nLastNewPointPos);
        Polyline(hdc, apt + nLastNewPointPos, POINTS - nLastNewPointPos);
        SelectObject(hdc,hOld);
        EndPaint(hwnd, &ps);
        return 0;
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

猜你喜欢

转载自blog.csdn.net/csdn_gddf102384398/article/details/81389431