📄 datashow.cpp
字号:
{
if (second<=0)
{
second=0;
}
SetTimer(2,second*1000,NULL);
}
}
void CDataShow::SaveDateAuto()
{
KillTimer(0);
DataChange("out");
FILE *f;
CTime st=GetCurrentTime();
CString filename,str;
str.Format("H=%d Min=%d Sec=%d",st.GetHour(),st.GetMinute(),st.GetSecond());
filename.Format("Num%d",m_numofData++);
filename=filename+",Time "+str+".data";
f=fopen(filename,"w");
if (f==NULL)
{
AfxMessageBox("文件保存失败!");
DataChange("in");
return;
}
fprintf(f,"%d\n",m_dNumOfData);
for(int i=0;i<m_dNumOfData;i++)
{
fprintf(f,"%f %f\n",m_Data_x[i],m_Data_y[i]);
}
fclose(f);
DataChange("in");
Sleep(200);
SetTimer(0,100,NULL);
}
double CDataShow::GetAxisPosition(int n, CString name)
{
if (name=="x")
{
double dx;
dx=(m_x_end-m_x_start)/10;
return m_x_start+dx*n;
}
else
{
double dy;
dy=(m_y_end-m_y_start)/10;
return m_y_start+dy*n;
}
}
void CDataShow::SetAxisRange(double start, double ed, CString name)
{
DataChange("out");
if (name=="x")
{
m_x_start=start;
m_x_end=ed;
}
else
{
m_y_start=start;
m_y_end=ed;
}
SetAxisChange();
DataChange("in");
}
void CDataShow::DataChange(CString name)
{
if (name=="in")//写入除变换因子
{
for (int i=0;i<m_dNumOfData;i++)
{
m_Data_x[i]=(m_Data_x[i]-m_x_start)/m_xFactor;
m_Data_y[i]=(m_Data_y[i]-m_y_start)/m_yFactor;
}
}
else//读出时恢复
{
for (int i=0;i<m_dNumOfData;i++)
{
m_Data_x[i]=(m_Data_x[i])*m_xFactor+m_x_start;
m_Data_y[i]=(m_Data_y[i])*m_yFactor+m_y_start;
}
}
}
void CDataShow::CaptureSaveBMP(CString filename)
{
int iWidth = m_frameRect.Width();
int iHeight = m_frameRect.Height();
int iPixel = 16;
//图形格式参数
LPBITMAPINFO lpbmih = new BITMAPINFO;
lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpbmih->bmiHeader.biWidth = iWidth;
lpbmih->bmiHeader.biHeight = iHeight;
lpbmih->bmiHeader.biPlanes = 1;
lpbmih->bmiHeader.biBitCount = iPixel;
lpbmih->bmiHeader.biCompression = BI_RGB;
lpbmih->bmiHeader.biSizeImage = 0;
lpbmih->bmiHeader.biXPelsPerMeter = 0;
lpbmih->bmiHeader.biYPelsPerMeter = 0;
lpbmih->bmiHeader.biClrUsed = 0;
lpbmih->bmiHeader.biClrImportant = 0;
//创建位图数据
HDC hdc,hdcMem;
HBITMAP hBitMap = NULL;
CBitmap *pBitMap = NULL;
CDC *pMemDC =NULL;
BYTE *pBits;
hdc = CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL);
hdcMem = CreateCompatibleDC(hdc);
hBitMap = CreateDIBSection(hdcMem,lpbmih,DIB_PAL_COLORS,(void **)&pBits,NULL,0);
pBitMap = new CBitmap;
pBitMap->Attach(hBitMap);
//pMemDC = new CDC;
pMemDC=new CDC;
pMemDC->Attach(hdcMem);
pMemDC->SelectObject(pBitMap);
//
CRect rc(0,0,iWidth,iHeight);
//添加自绘图形
pMemDC->SetBkMode(TRANSPARENT);//设置透明字体
pMemDC->SetTextColor(RGB(255,0,0));
Draw_frameRect(pMemDC);
Draw_childRect(pMemDC);
Draw_MousePoint(pMemDC);
Draw_Title(pMemDC);
Draw_Axis(pMemDC);
Draw_Axis_xyLebal(pMemDC);
Draw_Data(pMemDC);
Draw_CrossLine(pMemDC);
Draw_SelectRect(pMemDC);
Draw_Grid(pMemDC);
//保存到文件并创建位图结构
BITMAPFILEHEADER bmfh;
ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
*((char *)&bmfh.bfType) = 'B';
*(((char *)&bmfh.bfType) + 1) = 'M';
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmfh.bfSize = bmfh.bfOffBits + (iWidth * iHeight) * iPixel / 8;
TCHAR szBMPFileName[128];
int iBMPBytes = iWidth * iHeight * iPixel / 8;
strcpy(szBMPFileName,filename);
CFile file;
if(file.Open(szBMPFileName,CFile::modeWrite | CFile::modeCreate))
{
file.Write(&bmfh,sizeof(BITMAPFILEHEADER));
file.Write(&(lpbmih->bmiHeader),sizeof(BITMAPINFOHEADER));
file.Write(pBits,iBMPBytes);
file.Close();
}
pMemDC->DeleteDC();
delete pMemDC; pMemDC = NULL;
delete pBitMap; pBitMap = NULL;
delete lpbmih; lpbmih = NULL;
}
void CDataShow::SetMaxCapturePicture(int max_p)
{
if (max_p<=0)
{
m_max_CapturePictre=1;
}
else
m_max_CapturePictre=max_p;
}
void CDataShow::Move(CPoint p)
{
if (m_IsMove)
{
double dx,dy;
dx=(p.x-m_move_formerpoint.x)*m_xFactor/50;
dy=(-p.y+m_move_formerpoint.y)*m_yFactor/50;
SetAxisRange(m_x_start-dx,m_x_end-dx,"x");
SetAxisRange(m_y_start-dy,m_y_end-dy,"y");
}
}
void CDataShow::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
// m_IsSelect_enlarge=FALSE;
m_move_formerpoint=point;
m_IsMove=true;
CStatic::OnRButtonDown(nFlags, point);
}
void CDataShow::OnRButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_move_formerpoint=m_pOrth;
m_IsMove=false;
CStatic::OnRButtonUp(nFlags, point);
}
void CDataShow::OnMButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_enlarge_point=point;
m_IsEnlarge=true;
CStatic::OnMButtonDown(nFlags, point);
}
void CDataShow::OnMButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_IsEnlarge=false;
CStatic::OnMButtonUp(nFlags, point);
}
void CDataShow::Enlarge(CPoint p)
{
if (m_IsEnlarge)
{
double dx,dy;
dx=(p.x-m_enlarge_point.x);
dy=(-p.y+m_enlarge_point.y);
if (dx<0)
{
SetAxisRange(m_x_start*(1+0.005),m_x_end*(1+0.005),"x");
}
else
SetAxisRange(m_x_start*(1-0.005),m_x_end*(1-0.005),"x");
if (dy<0)
{
SetAxisRange(m_y_start*(1+0.005),m_y_end*(1+0.005),"y");
}
else
SetAxisRange(m_y_start*(1-0.005),m_y_end*(1-0.005),"y");
}
}
void CDataShow::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (m_IsSelect_enlarge==true)
{
m_IsSelect_enlarge=false;
}
else
m_IsSelect_enlarge=true;
m_Select_Enlarge_p1=point;
m_Select_Enlarge_p2=point;
CStatic::OnLButtonDblClk(nFlags, point);
}
void CDataShow::Draw_SelectArea(CDC *pDC)
{
if (m_IsSelect_enlarge)
{
CPen P;
P.CreatePen(0,0,m_selectRect_color);
CBrush b;
b.CreateSolidBrush(m_pdc_childRect.c);
pDC->SelectObject(&b);
pDC->SelectObject(&P);
pDC->Rectangle(m_Select_Enlarge_p1.x,m_Select_Enlarge_p1.y,m_Select_Enlarge_p2.x,m_Select_Enlarge_p2.y);
P.DeleteObject();
b.DeleteObject();
// AfxMessageBox("dr_c");
}
}
void CDataShow::SetSelectRectColor(COLORREF C)
{
m_selectRect_color=C;
}
void CDataShow::EnlargeSelectLarge()
{
if (m_IsSelect_enlarge&&m_IsEnlargeClose)
{
double x1,x2,y1,y2;
x1=m_Select_Enlarge_p1.x-m_pOrth.x;
y1=m_Select_Enlarge_p1.y-m_pOrth.x;
x2=m_Select_Enlarge_p2.x-m_pOrth.y;
y2=m_Select_Enlarge_p2.y-m_pOrth.y;
x1=(x1)*m_xFactor+m_x_start;
y1=(y1)*m_yFactor+m_y_start;
x2=(x2)*m_xFactor+m_x_start;
y2=(y2)*m_yFactor+m_y_start;
SetAxisRange(y1,y2,"y");
SetAxisRange(x1,x2,"x");
m_IsEnlargeClose=false;
}
}
void CDataShow::OnRButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
// m_IsEnlargeClose=true;
CMenu PopupMenu;
POINT curPos;
GetCursorPos(&curPos);
PopupMenu.CreatePopupMenu();
PopupMenu.AppendMenu(MF_ENABLED, IDC_DATA_INPUT, _T("&I数据导入"));
PopupMenu.AppendMenu(MF_ENABLED, IDC_SAVE_DATA, _T("&D保存数据"));
PopupMenu.AppendMenu(MF_ENABLED, IDC_SAVE_BMP, _T("&B保存当前图片"));
if (!m_bIsGridOn)
{
PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_GRID_ON_OFF, _T("&O网格控制:on"));
}
else
PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_GRID_ON_OFF, _T("&O网格控制:off"));
if (!m_IsNoteOn)
{
PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_NOTE_ON_OFF, _T("&N文字说明:on"));
}
else
PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_NOTE_ON_OFF, _T("&N文字说明:off"));
if (!m_IsTimeShow)
{
PopupMenu.AppendMenu(MF_ENABLED, IDB_SET_TIME_SHOW, _T("&S显示时间:on"));
}
else
PopupMenu.AppendMenu(MF_ENABLED, IDB_SET_TIME_SHOW, _T("&S显示时间:off"));
PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_TITLE_COLOR, _T("&T颜色:标题"));
PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_AXIS_COLOR, _T("&A颜色:坐标轴"));
PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_GRID_COLOR, _T("&G颜色:网格"));
PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_DATA_COLOR, _T("&Q颜色:数据曲线"));
PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_XYLEBAL_COLOR, _T("&X颜色:坐标文字"));
PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_BK_COLOR, _T("&G颜色:主框背景"));
PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_FACE_COLOR, _T("&F颜色:曲线背景"));
PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_CROSSLINE_COLOR, _T("&S颜色:十字线"));
PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_NOTE_COLOR, _T("&W颜色:说明文字"));
PopupMenu.AppendMenu(MF_ENABLED, IDB_SET_TIME_TEXT_COLOR, _T("&W颜色:时间显示"));
PopupMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, curPos.x, curPos.y, this);
PopupMenu.DestroyMenu();
CString str;
//str.Format("%d",PopupMenu.GetMenuState)
CStatic::OnRButtonDblClk(nFlags, point);
}
void CDataShow::Draw_Text(CDC*pDC,CString str)
{
pDC->SetBkMode(TRANSPARENT);
pDC->SelectObject(m_pdc_data.new_pen);
pDC->TextOut(m_text_point[m_numOf_Text++].x,m_text_point[m_numOf_Text].y,str);
}
void CDataShow::TextControl(CDC *pDC)
{
for (int i=0;i<m_numOf_Text;i++)
{
Draw_Text(pDC,m_Text[i]);
}
}
//DEL void CDataShow::DataOutputControl(double n,CString in_or_out)
//DEL {
//DEL
//DEL if (in_or_out=="in")
//DEL {
//DEL for (int i=0;i<m_dNumOfData;i++)
//DEL {
//DEL m_Data_x[i]=m_Data_x[i]*n;
//DEL m_Data_y[i]=m_Data_y[i]*n;
//DEL
//DEL }
//DEL m_High=m_High*n;
//DEL m_Low=m_Low*n;
//DEL m_Top=m_Top*n;
//DEL m_Bottom=m_Bottom*n;
//DEL
//DEL m_dataRect.right=m_dataRect.Width()*n;
//DEL m_dataRect.bottom=m_dataRect.Height()*n;
//DEL m_frameRect.right=m_frameRect.Width()*n;
//DEL m_frameRect.bottom=m_frameRect.Height()*n;
//DEL h*=n;
//DEL w*=n;
//DEL }
//DEL else
//DEL {
//DEL for (int i=0;i<m_dNumOfData;i++)
//DEL {
//DEL m_Data_x[i]=m_Data_x[i]/n;
//DEL m_Data_y[i]=m_Data_y[i]/n;
//DEL
//DEL }
//DEL m_High=m_High/n;
//DEL m_Low=m_Low/n;
//DEL m_Top=m_Top/n;
//DEL m_Bottom=m_Bottom/n;
//DEL m_dataRect.right+=m_dataRect.Width()*n;
//DEL m_dataRect.bottom+=m_dataRect.Height()*n;
//DEL m_frameRect.right+=m_frameRect.Width()*n;
//DEL m_frameRect.bottom+=m_frameRect.Height()*n;
//DEL h*=n;
//DEL w*=n;
//DEL
//DEL }
//DEL
//DEL }
void CDataShow::OnSetAxisColor()
{
SetColor("axis");
}
void CDataShow::OnSetXYlebalColor()
{
SetColor("xy");
}
void CDataShow::OnSetGridColor()
{
SetColor("grid");
}
void CDataShow::OnSetBKColor(){
SetColor("bk");
}
void CDataShow::OnSetTitleColor()
{
SetColor("title");
}
void CDataShow::OnSetCrossLineColor()
{
SetColor("crossline");
}
void CDataShow::OnSetFaceColor()
{
SetColor("face");
}
void CDataShow::OnSetDataInput()
{
LoadData();
}
void CDataShow::OnSetNoteColor()
{
SetColor("note");
}
void CDataShow::OnSetGridOnOff()
{
if (m_bIsGridOn)
{
Grid("off");
m_bIsGridOn=false;
}
else{
Grid("off");
m_bIsGridOn=true;
}
}
void CDataShow::OnSaveBmp()
{
// TODO: Add your command handler code here
SaveBmp();
}
void CDataShow::OnSaveData()
{
// TODO: Add your command handler code here
SaveData();
}
void CDataShow::SetColor(CString name)
{
CColorDialog dlg;
if (dlg.DoModal()==IDOK)
{
if (name=="data")
SetDataColor(dlg.GetColor());
if (name=="axis")
SetAxisColor(dlg.GetColor());
if (name=="xy")
{
SetTextColor(dlg.GetColor());
}
if (name=="face")
{
SetChildRectColor(dlg.GetColor());
}
if (name=="crossline")
{
SetCrossColor(dlg.GetColor());
}
if (name=="title")
{
SetTitleColor(dlg.GetColor());
}
if (name=="bk")
{
SetFrameColor(dlg.GetColor());
}
if (name=="grid")
{
SetGridColor(dlg.GetColor());
}
if (name=="note")
{
SetNoteColor(dlg.GetColor());
}
if (name=="time")
{
SetTimeTextColor(dlg.GetColor());
}
}
}
void CDataShow::Draw_NoteWord(CDC *pDC)
{
SetNotePoint();
if (m_IsNoteOn)
{
CString in[100],out,st;
out=m_sNote_text;
st=out;
int n;
n=(m_dataRect.right-m_pNote_point.x)/8;
pDC->SetTextColor(m_color_note);
pDC->TextOut(m_pNote_point.x+13*5,m_pNote_point.y-20,"NOTE");
int len=m_sNote_text.GetLength();
int count=len/n;
for(int i=0;i<count;i++)
{
in[i]="";
for(int j=i*n;j<=i*n+n-2;j=j+2)
{
in[i]=in[i]+st.GetAt(j)+st.GetAt(j+1);
out.Delete(0,2);
}
}
in[count]=out;
for(i=0;i<=count;i++)
pDC->TextOut(m_pNote_point.x,m_pNote_point.y+2*h*i,in[i]);
}
}
void CDataShow::SetNoteText(CString note)
{
m_sNote_text=note;
}
void CDataShow::SetNotePoint()
{
double x,y;
x=m_dataRect.right-m_dataRect.Width()/2.5;
y=m_dataRect.top+8*h;
m_pNote_point.x=x;
m_pNote_point.y=y;
}
void CDataShow::SetNoteWordOn(bool IsOn)
{
m_IsNoteOn=IsOn;
}
void CDataShow::SetNoteColor(COLORREF C)
{
m_color_note=C;
}
CString CDataShow::GetTimeFormat()
{
CTime t;
t=CTime::GetCurrentTime();
CString y,mo,h,m,s;
int x;
x=t.GetHour();
h.Format("%d",t.GetHour());
if (x<10)
{
h="0"+h;
}
m.Format("%d",t.GetMinute());
if (t.GetMinute()<10)
{
m="0"+m;
}
s.Format("%d",t.GetSecond());
if (t.GetSecond()<10)
{
s="0"+s;
}
y.Format("%d",t.GetYear());
mo.Format("%d",t.GetMonth());
if (t.GetMonth()<10)
{
mo="0"+mo;
}
return y+"-"+mo+"-"+h+":"+m+":"+s;
}
void CDataShow::SetTimeTextColor(COLORREF C)
{
m_time_color=C;
}
void CDataShow::SetTimeShow(bool IsShow)
{
m_IsTimeShow=IsShow;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -