📄 batttestdlg.cpp
字号:
pCursor = sCursors.Item(2);
pBtn2->SetCheck(FALSE);
pCursor.SetVisible(pBtn2->GetCheck()?true:false);
g_bCurveTrack = TRUE;
g_bRunOnce = FALSE;
#endif
}
///////////////////////////////////////////////////////////////////////////////////////
//波形线的可视性
void CBattTestDlg::OnPlotVisible()
{
CNiPlots sPlots= m_Dlg.GetPlots();
CButton *pBtn = (CButton *)GetDlgItem(IDC_PLOT1);
CNiPlot pPlot = sPlots.Item(1);
pPlot.SetVisible(pBtn->GetCheck()?true:false);
if (pBtn->GetCheck())
g_nChnlNo = 1;
//
pBtn = (CButton *)GetDlgItem(IDC_PLOT2);
pPlot = sPlots.Item(2);
pPlot.SetVisible(pBtn->GetCheck()?true:false);
if (pBtn->GetCheck())
g_nChnlNo = 2;
}
HBRUSH CBattTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
pDC->SetBkMode(TRANSPARENT);
switch(nCtlColor)
{
case CTLCOLOR_BTN:
case CTLCOLOR_STATIC:
if (pWnd->GetSafeHwnd() == m_wndMaxMin1.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndMaxMin2.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndMaxMin3.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndMaxMin4.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndMeas1.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndMeas2.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndMeas3.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndMeas4.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndPP1.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndPP2.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndPP3.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndPP4.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndMeasT1.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndMeasT2.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndMeasT3.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndMeasT4.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndMeas12.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndMeas22.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndMeas32.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndMeas42.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndMeasT12.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndMeasT22.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndMeasT32.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndMeasT42.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndDeltaT1.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndDeltaT2.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndDeltaT3.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_wndDeltaT4.GetSafeHwnd()
)
{
pDC->SetTextColor(RGB(0, 4, 5));
hbr = (HBRUSH)m_brushBk1.GetSafeHandle();
}
if (pWnd->GetSafeHwnd() == m_ckCur1.GetSafeHwnd() ||
pWnd->GetSafeHwnd() == m_ckCur2.GetSafeHwnd())
{
pDC->SetTextColor(RGB(190, 164, 28));
}
break;
}
return hbr;
}
UINT fpThreadDisplay(LPVOID pData)
{
pfnCallBack fpShowData = (pfnCallBack)pData;
if (g_strDisplayFile.GetLength() >10)
g_sDataStream.ContShowData(fpShowData, (LPCTSTR)g_strDisplayFile/*某个文件*/);
return 1;
}
void CBattTestDlg::OnOpenTest()
{
//选择文件
#if 1
static CFileDialog dlg(TRUE, _T("dat"), _T("myfile.dat"),
OFN_HIDEREADONLY | OFN_FILEMUSTEXIST,
_T("历史文件 (*.dat)|*.dat|All Files (*.*)|*.*||"), this );
char pstrPath[APPPATHLEN];
::pltCurrentPath(pstrPath, APPPATHLEN);
::memcpy(pstrPath, ::strcat(pstrPath, LPCTSTR("\\Data\\")), 256);
//Set the directory where the file open dialog will start from.
dlg.m_ofn.lpstrInitialDir = (LPCTSTR)pstrPath;
//Set the title for the file open dialog.
dlg.m_ofn.lpstrTitle = _T("打开历史测试文件");
dlg.DoModal();
#endif
//开始显示数据
g_strDisplayFile = dlg.GetPathName();
if (g_strDisplayFile.GetLength() >1)
{
m_LockZeroBtn.EnableWindow(TRUE);
m_btnReport.EnableWindow(TRUE);
double maxValue[USECHNLNUM];
double minValue[USECHNLNUM];
//设定激活电压门限
g_sCurveHelper.SetFireLvl(this->GetFireLvlVal());
g_sDataStream.ContShowData(fpDisplayHistData, (LPCTSTR)g_strDisplayFile/*某个文件*/);
//计算最大值/最小值
::_fpGetMaxMin(maxValue, minValue, USECHNLNUM);
//显示激活时间点
ULONG nMaxPos = g_sCurveHelper.GetFirePosInd();
this->SetFireVal(nMaxPos/10000.0);
//显示最大值/最小值
this->ShowCalcValue(maxValue, minValue);
//显示峰峰值
char szFmt[128];
::sprintf(szFmt, "%.4f", ::fabs(maxValue[0]-minValue[0]));
m_wndPP1.SetWindowText(szFmt);
}
}
//显示最大值/最小值
void CBattTestDlg::ShowCalcValue(double maxValue[2], double minValue[2], int nCount)
{
char szFmt[32];
::sprintf(szFmt, "%.3f/%.3f(V)", maxValue[0], minValue[0]);
m_wndMaxMin1.SetWindowText(szFmt);
::sprintf(szFmt, "%.3f/%.3f(V)", maxValue[1], minValue[1]);
m_wndMaxMin2.SetWindowText(szFmt);
}
//光标测量
void CBattTestDlg::OnCursorChange(long FAR* CursorIndex, VARIANT FAR* XPos, VARIANT FAR* YPos, BOOL FAR* bTracking)
{
CNiCursors sCursors= m_Dlg.GetCursors();
CNiCursor sCursor1 = sCursors.Item(1);
CNiCursor sCursor2 = sCursors.Item(2);
CNiCursor sCursor3 = sCursors.Item(3);
CNiCursor sCursor4 = sCursors.Item(4);
::sprintf(szFmt2, "%.3f", (sCursor2.GetXPosition()-sCursor1.GetXPosition())/10000.0);
if (*CursorIndex == 1) //Left Cursor
{
xVal = sCursor1.GetXPosition();
yVal = sCursor1.GetYPosition();
::sprintf(szFmt, "%.3f", xVal/10000.0);
::sprintf(szFmt1, "%.4f", yVal);
//if (g_nChnlNo == 1) //交流通道
{
m_wndMeasT1.SetWindowText(szFmt); //时间
m_wndMeas1.SetWindowText(szFmt1); //幅值
m_wndDeltaT1.SetWindowText(szFmt2); //时间差
}
sCursor3.SetXPosition(sCursor1.GetXPosition());
yVal = sCursor3.GetYPosition();
::sprintf(szFmt1, "%.4f", yVal);
//else if (g_nChnlNo == 2) //直流通道
{
m_wndMeasT2.SetWindowText(szFmt); //时间
m_wndMeas2.SetWindowText(szFmt1); //幅值
m_wndDeltaT2.SetWindowText(szFmt2); //时间差
}
}
if (*CursorIndex == 2) //Right Cursor
{
xVal = sCursor2.GetXPosition();
yVal = sCursor2.GetYPosition();
//
::sprintf(szFmt, "%.3f", xVal/10000.0);
::sprintf(szFmt1, "%.4f", yVal);
//if (g_nChnlNo == 1) //交流通道
{
m_wndMeasT12.SetWindowText(szFmt); //时间
m_wndMeas12.SetWindowText(szFmt1); //幅值
//时间差
m_wndDeltaT1.SetWindowText(szFmt2);
}
//
sCursor4.SetXPosition(sCursor2.GetXPosition());
yVal = sCursor4.GetYPosition();
::sprintf(szFmt1, "%.4f", yVal);
//else if (g_nChnlNo == 2) //直流通道
{
m_wndMeasT22.SetWindowText(szFmt); //时间
m_wndMeas22.SetWindowText(szFmt1); //幅值
//时间差
m_wndDeltaT2.SetWindowText(szFmt2);
}
}
//////////////////////////////////////////////////////////////////////
//记忆光标位置
CButton *pBtn1 = (CButton *)GetDlgItem(IDC_MEASCURVE1);
CNiCursor pCursor = sCursors.Item(1);
if (pBtn1->GetCheck())
{
g_sOldCursor1 = pCursor.GetXPosition();
}
CButton *pBtn2 = (CButton *)GetDlgItem(IDC_MEASCURVE1);
pCursor = sCursors.Item(2);
if (pBtn2->GetCheck())
{
g_sOldCursor2 = pCursor.GetXPosition();
}
}
BOOL CAboutDlg::OnInitDialog()
{
CDialog::OnInitDialog();
#if 1
m_CapFont.CreatePointFont(160, "宋体");
m_TipFont.CreatePointFont(120, "宋体");
//
m_wndTip1.SetFont(&m_TipFont);
m_wndTip2.SetFont(&m_TipFont);
m_wndTip3.SetFont(&m_TipFont);
m_wndCaption.SetFont(&m_CapFont);
#endif
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
/*****************************************************************/
/* 输出的供外部使用. */
/*****************************************************************/
void _FillIndxDataPt(float sElapse, int nTotalRows, UINT IndPtArr[])
{
if ((UINT(sElapse*40*1024)-1) <= 0)
return ;
for (int j=0; j<nTotalRows; j++)
{
UINT nArrIndx = UINT((sElapse*(j+1))*10*1024)-1;
IndPtArr[j] = nArrIndx;
}
}
#include "RptOptDlg.h"
#include "WordRpt\FTWordRpt.h"
#pragma comment(lib, "WordRpt.lib")
#define WORDTITLE _T("热电池自旋放电测试报告")
static ReportVisInfo g_sReportVisInfo;
void CBattTestDlg::OnReportBtn()
{
char szDateFmt[64];
char szFmt[64];
CFTWordRpt g_sWordRptObj;
COleDateTime sOleDt;
///////////////////////////////////////////////////////////////////////////////
//1.存储图片文件
CRect rc;
char pstrPath[APPPATHLEN];
m_Dlg.GetClientRect(rc);
::pltCurrentPath(pstrPath, 256);
CString strFile = CString(pstrPath) + _T("\\TempBits.bmp");
m_Dlg.SavePic(rc, strFile);
///////////////////////////////////////////////////////////////////////////////
//2.选项
CRptOptDlg dlg(&g_sReportVisInfo, NULL);
if (dlg.DoModal() == IDCANCEL)
return ;
///////////////////////////////////////////////////////////////////////////////
//3.生成WORD文件
if (::strlen((LPCTSTR)g_strDisplayFile) <=8)
{
TRACE1("文件长度 = %d.\n", ::strlen((LPCTSTR)g_strDisplayFile));
::AfxMessageBox("请先打开测试的波形文件");
return;
}
if (g_sReportVisInfo.sElapse<0.001)
{
::AfxMessageBox("实时电压间隔应大于0.1秒");
return;
}
//////////////////////////////////////////////////////////////////////////////
//4.计算实时电压间隔时间
#ifdef _USECALCTIMEMODE
int nTotalRows = int(g_sGlobalArgInfo.fTotalTime/g_sReportVisInfo.sElapse);
#else
int nTotalRows = g_sDataStream.FetchSize((LPCTSTR)g_strDisplayFile) / (g_sReportVisInfo.sElapse*10*1024);
#endif
if (nTotalRows <= 1)
{
::AfxMessageBox("未能设定采集器的读取时间!");
return ;
}
g_sWordRptObj.InitEnv(g_sReportVisInfo.bPlotVis, pstrPath+CString("\\TempBits.bmp"), g_sReportVisInfo.bFeatureVis,
g_sReportVisInfo.bDataTableVis, WORDTITLE, nTotalRows/*行*/);
if (g_sReportVisInfo.bFeatureVis)
{
sOleDt = COleDateTime::GetCurrentTime();
::sprintf(szDateFmt, "%d-%d-%d %d:%d:%d", sOleDt.GetYear(), sOleDt.GetMonth(), sOleDt.GetDay(),
sOleDt.GetHour(), sOleDt.GetMinute(), sOleDt.GetSecond());
//得到激活时间等特征参数?
CString szFmt;
m_wndFireTm.GetWindowText(szFmt);
float fFireTime = ::atof(szFmt.GetBuffer(32));
g_sWordRptObj.FillBattHeader(g_sReportVisInfo.szFmt, szDateFmt, fFireTime/*激活时间*/,
32.0/*max*/, 1.02/*min*/, 120.5/*work time*/);
}
//////////////////////////////////////////////////////////////////////////////////////////
//5.填充实时电压表
if (g_sReportVisInfo.bDataTableVis)
{
TRACE2("当前文件 = %s, 当前行 = %d.\n",__FILE__, __LINE__);
double *dbDCValue[2], *dbACValue[2];
UINT *IndPtArr = new UINT[nTotalRows];
dbDCValue[0] = new double[nTotalRows];
dbACValue[0] = new double[nTotalRows];
dbDCValue[1] = new double[nTotalRows];
dbACValue[1] = new double[nTotalRows];
//
::_FillIndxDataPt(g_sReportVisInfo.sElapse, nTotalRows, IndPtArr);
g_sDataStream.FetchRealData(nTotalRows, IndPtArr, (double **)dbDCValue, (double **)dbACValue, (LPCTSTR)g_strDisplayFile/*某个文件*/);
for(int h=0; h<nTotalRows; h++)
g_sWordRptObj.FillRealTbl(g_sReportVisInfo.sElapse*(h+1), dbDCValue[0][h], dbACValue[0][h], dbDCValue[1][h], dbACValue[1][h]);
delete[] IndPtArr;
delete[] dbDCValue[0];
delete[] dbACValue[0];
delete[] dbDCValue[1];
delete[] dbACValue[1];
}
//////////////////////////////////////////////////////////////////////////////////////////
//6.
::sprintf(szFmt, "\\测试报告\\%d-%d-%d_%d-%d-%d.doc", sOleDt.GetYear(), sOleDt.GetMonth(),
sOleDt.GetDay(), sOleDt.GetHour(), sOleDt.GetMinute(), sOleDt.GetSecond());
CString strAppFile = CString(pstrPath)+CString(szFmt);
g_sWordRptObj.SaveRpt(FALSE, strAppFile);
}
//平移时移动光标
void CBattTestDlg::OnPanGraph()
{
::ShiftCursor(&m_Dlg);
}
//设定电池激活时间
void CBattTestDlg::SetFireVal(float fFireVal)
{
char szFmt[24];
::sprintf(szFmt, "%.2f", fFireVal);
m_wndFireTm.SetWindowText(szFmt);
}
//改变显示
void CBattTestDlg::OnChangeFireVlt()
{
//1.设定激活电压门限
g_sCurveHelper.SetFireLvl(this->GetFireLvlVal(), FALSE);
g_sDataStream.ContShowData(fpDisplayHistData, (LPCTSTR)g_strDisplayFile/*某个文件*/);
//2.显示激活时间点
ULONG nMaxPos = g_sCurveHelper.GetFirePosInd();
this->SetFireVal(nMaxPos/10000.0);
}
#include "ChgAxisDlg.h"
void CBattTestDlg::OnChgYAxis()
{
CChgAxisDlg dlg(&m_Dlg, NULL);
dlg.DoModal();
}
//锁定零时刻
void ShowRangeGraph1(CCalWfmGraph *pDlg, UINT nPlotStartPt, LONG nPlotNum)
{
double* dbValue[USECHNLNUM];
ULONG arrWfmSize[USECHNLNUM];
if (pDlg == NULL)
return ;
pDlg->ClearData();
arrWfmSize[0] = nPlotNum;
arrWfmSize[1] = nPlotNum;
dbValue[0] = &g_sACPlotValue[nPlotStartPt];
dbValue[1] = &g_sDCPlotValue[nPlotStartPt];
//绘制曲线
pDlg->PlotY(dbValue, arrWfmSize, USECHNLNUM);
}
void CBattTestDlg::OnZero()
{
//不满足锁定条件则退出
if (g_sLockEndIndex < 0)
return ;
//移动光标
CNiCursors sCursors = m_Dlg.GetCursors();
CNiCursor sCursor1 = sCursors.Item(1);
/////////////////////////////////////////////////////////
//得到当前索引号
g_sLockStartIndex = max((LONG)sCursor1.GetXPosition(), 0);
if (g_sLockStartIndex >= g_sLockEndIndex)
return ;
::ShowRangeGraph1(&m_Dlg, g_sLockStartIndex, g_sLockEndIndex-g_sLockStartIndex);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -