?? oscilloscopedlg.cpp
字號:
// OscilloscopeDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Oscilloscope.h"
#include "OscilloscopeDlg.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CBitmapDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CBitmapDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CBitmapDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CBitmapDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// COscilloscopeDlg dialog
COscilloscopeDlg::COscilloscopeDlg(CWnd* pParent /*=NULL*/)
: CBitmapDialog(COscilloscopeDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(COscilloscopeDlg)
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void COscilloscopeDlg::DoDataExchange(CDataExchange* pDX)
{
CBitmapDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(COscilloscopeDlg)
DDX_Control(pDX, IDC_BTN_SIGNALTYPE, m_btnSignalType);
DDX_Control(pDX, IDC_BTN_CHANEL, m_btnChannel);
DDX_Control(pDX, IDC_SCROLLBAR, m_ScrollBar);
DDX_Control(pDX, IDC_BTN_FREQSAMPLE, m_btnFreqSample);
DDX_Control(pDX, IDC_BTN_WIDTH, m_btnWidth);
DDX_Control(pDX, IDC_BTN_PHASE, m_btnPhase);
DDX_Control(pDX, IDC_BTN_OFFSET, m_btnOffset);
DDX_Control(pDX, IDC_BTN_AMPLITUDE, m_btnAmplitude);
DDX_Control(pDX, IDC_BTN_FREQSIGNAL, m_btnFreqSignal);
DDX_Control(pDX, IDOK, m_OkRndBtn);
DDX_Control(pDX, IDC_START, m_StartRndBtn);
DDX_Control(pDX, IDC_CHTWO, m_ChTwoRndBtn);
DDX_Control(pDX, IDC_CHTHREE, m_ChThreeRndBtn);
DDX_Control(pDX, IDC_CHONE, m_ChOneRndBtn);
DDX_Control(pDX, IDC_CURVE, m_ctrlCurveFrame);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(COscilloscopeDlg, CBitmapDialog)
//{{AFX_MSG_MAP(COscilloscopeDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_BN_CLICKED(IDC_START, OnStart)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_SELECTCOLOR, OnSelectcolor)
ON_CBN_SELCHANGE(IDC_CMB_CHANNEL, OnSelchangeCmbChannel)
ON_CBN_SELCHANGE(IDC_CMB_SIGNALTYPE, OnSelchangeCmbSignaltype)
ON_WM_SIZE()
ON_BN_CLICKED(IDC_BTN_FREQSIGNAL, OnBtnFreqsignal)
ON_BN_CLICKED(IDC_BTN_AMPLITUDE, OnBtnAmplitude)
ON_BN_CLICKED(IDC_BTN_OFFSET, OnBtnOffset)
ON_BN_CLICKED(IDC_BTN_PHASE, OnBtnPhase)
ON_BN_CLICKED(IDC_BTN_WIDTH, OnBtnWidth)
ON_BN_CLICKED(IDC_BTN_FREQSAMPLE, OnBtnFreqsample)
ON_WM_HSCROLL()
ON_BN_CLICKED(IDC_BTN_CHANEL, OnBtnChanel)
ON_BN_CLICKED(IDC_BTN_SIGNALTYPE, OnBtnSignaltype)
//}}AFX_MSG_MAP
ON_CONTROL_RANGE(BN_CLICKED, IDC_CHONE, IDC_CHTHREE, OnChannel)
ON_WM_NCHITTEST()
ON_WM_NCPAINT()
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// COscilloscopeDlg message handlers
BOOL COscilloscopeDlg::OnInitDialog()
{
CBitmapDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
SetBitmap(IDB_BACKGROUND, BITMAP_STRETCH);
for (int i=0; i<3; i++)
{//波形數(shù)據(jù)
Signal[i].SignalType = 0;
Signal[i].Frequency = 10;
Signal[i].Phase = 0.0;
Signal[i].Amplitude = 0.2;
for (int j=0; j<1024; j++)
Signal[i].Data[j] = 0.0;
Signal[i].Number = 100;
}
Signal[0].Offset = 0.0;
Signal[1].Offset = 0.6;
Signal[2].Offset = -0.6;
m_bStart = FALSE;//缺省為停止示波
m_btnFreqSample.SetRange(0, 10000);
m_btnFreqSample.SetData(1000);//缺省采樣率為1000Hz
m_nCurChannel = 0;//缺省為第一通道
m_btnChannel.InitButton(IDB_CH01, IDB_CH03);
m_btnSignalType.InitButton(IDB_TYPE01, IDB_TYPE05);
//波形顯示數(shù)據(jù)
UINT width;
m_ctrlCurveFrame.GetCurveWidth(width, m_nCurChannel);
m_btnWidth.SetRange(1, 50);
m_btnWidth.SetData(double(width));
m_ctrlCurveFrame.GetCurveColor(m_Color, m_nCurChannel);
//波形數(shù)據(jù)
m_btnChannel.SetCurSel(m_nCurChannel);
m_btnSignalType.SetCurSel(Signal[m_nCurChannel].SignalType);
//信號頻率、振幅、偏移、相位
m_btnFreqSignal.SetRange(0.0, 100.0);
m_btnFreqSignal.SetData(Signal[m_nCurChannel].Frequency);
m_btnAmplitude.SetRange(0.0, 2.0);
m_btnAmplitude.SetData(Signal[m_nCurChannel].Amplitude);
m_btnOffset.SetRange(-1.0, 1.0);
m_btnOffset.SetData(Signal[m_nCurChannel].Offset);
m_btnPhase.SetRange(0, 360);
m_btnPhase.SetData(Signal[m_nCurChannel].Phase);
for (i=0; i<3; i++)
{
m_nNumPerCircle[i] = 100;
m_nCurNumOfSample[i] = 0;
m_bChannel[i] = FALSE;
}
// SaveDlgItemRect(this, IDC_FIRST, IDC_LAST);
SCROLLINFO info;
info.cbSize = sizeof(SCROLLINFO);
info.fMask = SIF_ALL;
info.nMin = 0;
info.nMax = 5;
info.nPage = 2;
info.nPos = 0;
info.nTrackPos = 2;
m_ScrollBar.SetScrollInfo(&info);
nTimes = 0;
return TRUE; // return TRUE unless you set the focus to a control
}
void COscilloscopeDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CBitmapDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void COscilloscopeDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CBitmapDialog::OnPaint();
//繪制客戶區(qū)
// DrawClient(this);
// DrawNCClient(this);
CPen pen;
CPen *pOldPen;
CBrush brush;
CBrush *pOldBrush;
pen.CreateStockObject(NULL_PEN);
CWnd *pWnd;
CRect r;
CDC *pDC;
brush.CreateSolidBrush(m_Color);
pWnd = GetDlgItem(IDC_COLOR);
pWnd->GetClientRect(&r);
pDC = pWnd->GetDC();
pOldPen = pDC->SelectObject(&pen);
pOldBrush = pDC->SelectObject(&brush);
pDC->Rectangle(&r);
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
brush.DeleteObject();
pWnd->ReleaseDC(pDC);
}
}
void COscilloscopeDlg::OnStart()
{
m_StartRndBtn.SetLighted(!m_StartRndBtn.GetLightedState());
// TODO: Add your control notification handler code here
if (!m_bStart)
{
//m_ctrlCurveFrame.SetCurveChannel(TRUE,FALSE,FALSE);
int n = int(100*1000/m_btnFreqSample.GetData());
SetTimer(10, 100 , NULL);
GetDlgItem(IDC_START)->SetWindowText("停止");
}
else
{
KillTimer(10);
GetDlgItem(IDC_START)->SetWindowText("示波");
}
m_bStart = !m_bStart;
}
void COscilloscopeDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
for (int i=0; i<3; i++)
{
if(m_bChannel[i])
{
if (m_nCurNumOfSample[i] >= m_nNumPerCircle[i])
m_nCurNumOfSample[i] %= m_nNumPerCircle[i];
CreateWave(
Signal[i].SignalType,
m_nCurNumOfSample[i],
Signal[i].Number,
Signal[i].Amplitude,
Signal[i].Frequency,
m_btnFreqSample.GetData(),
Signal[i].Phase,
Signal[i].Offset,
Signal[i].Data);
m_nCurNumOfSample[i] += Signal[i].Number;
//存儲數(shù)據(jù)以備回顧所用
}
}
m_ctrlCurveFrame.DrawCurve(Signal[0].Data, Signal[0].Number,
Signal[1].Data, Signal[1].Number,
Signal[2].Data, Signal[2].Number,
m_btnFreqSample.GetData());
SaveSignal(Signal[0], Signal[1],Signal[2]);
CBitmapDialog::OnTimer(nIDEvent);
}
void COscilloscopeDlg::OnSelectcolor()
{
// TODO: Add your control notification handler code here
CColorDialog dlg(m_Color,CC_FULLOPEN);
if (dlg.DoModal() == IDOK)
{
m_Color = dlg.GetColor();
SendMessage(WM_PAINT);
UpdateData(TRUE);
m_ctrlCurveFrame.SetCurveColor(m_Color, m_nCurChannel);
}
}
void COscilloscopeDlg::OnSelchangeCmbChannel()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
//保存前一通道的數(shù)據(jù)
//波形顯示數(shù)據(jù)
m_ctrlCurveFrame.SetCurveWidth(UINT(m_btnWidth.GetData()), m_nCurChannel);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -