信号波形绘制

本文介绍了一个在Windows环境下使用C++实现的模拟信号波形绘制程序。通过注册窗口类,创建窗口,并响应绘图消息,程序能够在窗口中绘制出特定频率的复合正弦波。代码详细展示了窗口过程函数的实现,包括初始化参数、获取客户区尺寸、计算信号振幅以及绘制波形。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <Windows.h>
#include <tchar.h>
#include <math.h>

HINSTANCE hInst;

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

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
	hInst = hInstance;
	WNDCLASS wls;
	wls.cbClsExtra = 0;
	wls.cbWndExtra = 0;
	wls.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	wls.hCursor = LoadCursor(NULL, IDC_ARROW);
	wls.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wls.hInstance = hInst;
	wls.lpfnWndProc = WindowProc;
	wls.lpszClassName = _T("MainWnd");
	wls.lpszMenuName = NULL;
	wls.style = CS_HREDRAW | CS_VREDRAW;
	RegisterClass(&wls);

	HWND hwnd = CreateWindow(_T("MainWnd"), _T("Test"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
		NULL, NULL, hInst, NULL);
	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);

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

	return (int)msg.wParam;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT ps;
	HDC hdc;

#define PI 3.1415926
#define NUM 1000 //只画一个周期的信号波形
	static double PMaxAmp, NMaxAmp;
	static POINT apt[NUM];
	static double Amp[NUM];
	double fs;
	RECT rect;

	double Py, Ny;

	switch (uMsg)
	{
	case WM_CREATE:
		fs = 5000;
		NMaxAmp = 0;
		PMaxAmp = 0;
		for (int i = 1; i < NUM; i++)
		{
			//下列模拟信号的最小正周期是1/5,即各个信号周期的最小公倍数
			Amp[i] = 0.5*sin(30 * PI*i / fs) + 2 * sin(80 * PI*i / fs);
			if (Amp[i] >= 0)
			{
				if (Amp[i] > PMaxAmp)
					PMaxAmp = Amp[i];
			}
			else if (Amp[i] < 0)
			{
				if (Amp[i] < NMaxAmp)
					NMaxAmp = Amp[i];
			}
		}
		return 0;

	case WM_PAINT:
		hdc = BeginPaint(hwnd, &ps);

		GetClientRect(hwnd, &rect);
		Ny = -NMaxAmp*rect.bottom / (PMaxAmp - NMaxAmp);
		Py = rect.bottom - Ny;
		//MoveToEx(hdc, 0, Py, NULL);
		//LineTo(hdc, rect.right, Py);
		for (int i = 0; i < NUM; i++)
		{
			apt[i].x = i*rect.right / NUM;
			if (Amp[i] >= 0)
				apt[i].y = Py*(1 - Amp[i] / PMaxAmp);
			else
				apt[i].y = Py + Ny*Amp[i] / NMaxAmp;
		}
		Polyline(hdc,apt,NUM);

		EndPaint(hwnd, &ps);
		return 0;

	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;

	default:
		break;
	}
	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值