以下是我用C语言写的一个实现了示波器功能的Windows程序,显示波形,其显示风格同示波器一样,以下是源码,如有不正支持求大神赐教!
#include
#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);
}