return FALSE;
// TODO: add reinitialization code here // (SDI documents will reuse this document) CMyDlg dlg; dlg.DoModal(); return TRUE; }
重载OnOK()与OnCancel()函数,添加代码如下:
void CMyDlg::OnOK() {
// TODO: Add extra validation here UpdateData(TRUE);
if((m_strUser==\ {
CDialog::OnOK(); } else {
m_strUser=\ m_strPassword=\
AfxMessageBox(\密码输入错误,请重新登录!\ UpdateData(FALSE); }
}
/*****************************************************/
void CMyDlg::OnCancel()
{
// TODO: Add extra cleanup here
CDialog::OnCancel(); exit(0); }
用户名或密码输入错误会出现如图3.3.2所示:
- 15 -
图3.3.2
3.3.2 数据通道选择模块
系统采集得到的数据需对应于每一个通道,每个不同的通道对应一个不同ID的单选按钮,通过判断某个单选按钮是否被选中来判断该通道是否被选中,为实现此功能,需对各按钮控件进行赋值声明如表1.15所示:
表1.15
按钮ID IDC_RADIO1 IDC_RADIO2 IDC_RADIO3 IDC_RADIO4 该模块程序功能流程图如图3.3.3所示:
执行下一步 选择某通道 进行通道选择 备注 通道一选择 通道二选择 通道三选择 通道四选择 图 3.3.3
- 16 -
为实现各通道是否被选中,其代码如下:
/***********通道一选择******************/ void CPage1::OnButton1()
{
// TODO: Add your control notification handler code here CButton* theradio = (CButton*) GetDlgItem(IDC_RADIO1); bool check1=theradio->GetCheck();
if(check1==TRUE) // 如果单选按钮1被选中 {
SetTimer(1,1000,NULL); // 启动时钟触发器,每秒钟触发一次 }
} //其中部分代码略有删除
/***********通道二选择******************/ void CPage1::OnButton2() {
// TODO: Add your control notification handler code here CButton* theradio = (CButton*) GetDlgItem(IDC_RADIO1); bool check1=theradio->GetCheck(); if(check1==TRUE) {
SetTimer(1,1000,NULL); } }
/***********通道三选择******************/ void CPage1::OnButton3() {
// TODO: Add your control notification handler code here CButton* theradio = (CButton*) GetDlgItem(IDC_RADIO1); bool check1=theradio->GetCheck(); if(check1==TRUE) {
SetTimer(1,1000,NULL); } }
/***********通道四选择******************/ void CPage1::OnButton4() {
// TODO: Add your control notification handler code here
- 17 -
CButton* theradio = (CButton*) GetDlgItem(IDC_RADIO1); bool check1=theradio->GetCheck(); if(check1==TRUE) {
SetTimer(1,1000,NULL); } }
3.3.3 实时动态曲线显示模块
实时动态曲线,顾名思义就是曲线在坐标轴上随时间的动态显示过程。通过实时动态曲线能够较直观的反应出采集量的大致变化趋势,实时动态曲线有很多不同的显示方式,本设计所采用的是逐点移动式,绘制结果如图3.3.4所示:
图3.3.4 其软件流程图如图3.3.4所示:
数据采集 实时显示 超出范围 刷屏 重新绘图
图 3.3.4 其绘制过程及代码如下:
- 18 -
1.选定所要绘制的矩形区域绘制时间-采集数据的平面直角坐标系,
其绘制代码如下:
void CPage1::OnPaint() {
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here CPen *pPenBlack=new CPen();
pPenBlack->CreatePen(PS_SOLID,3,RGB(0,0,0)); // 用于定义坐标系的画笔类型、颜色及粗细 CPen *oldpen=NULL;
oldpen=dc.SelectObject(pPenBlack); dc.MoveTo(250,20);
dc.LineTo(250,110); //第一通道坐标系轮廓绘制部分 dc.LineTo(700,110);
for(int i=0;i<=30;i++) {
CString str;
CFont font,*pOldFont;
font.CreateFont(10, // nHeight 4, // nWidth
0, // nEscapement 0, // nOrientation 500, // nWeight FALSE, // bItalic FALSE, // bUnderline 0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision CLIP_DEFAULT_PRECIS, // nClipPrecision DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, //
nPitchAndFamily _T( \
pOldFont=dc.SelectObject(&font); str.Format(\
dc.TextOut(250+15*i,115,str);// 第一通道绘制坐标系值部分 dc.SelectObject(pOldFont);
CPen *pPenBlack1=new CPen();
pPenBlack1->CreatePen(PS_SOLID ,1,RGB(88,88,88));
- 19 -