📄 datashow.cpp
字号:
}
bool bs=true;
int m_i=0;
while ((m_i<m_dNumOfData))
{
if (!IsDataOut(m_pOrth.x+m_Data_x[m_i],m_pOrth.y-m_Data_y[m_i]))
{
pDC->MoveTo(m_pOrth.x+m_Data_x[m_i],m_pOrth.y-m_Data_y[m_i]);
break;
}
m_i++;
}
// pDC->MoveTo(m_pOrth.x+m_Data_x[0],m_pOrth.y-m_Data_y[0]);
for (int i=m_i;i<m_dNumOfData;i++)
{
if(!IsDataOut(m_pOrth.x+m_Data_x[i],m_pOrth.y-m_Data_y[i]))
{
switch (m_lineStyle)
{
case 0:
pDC->LineTo(m_pOrth.x+m_Data_x[i],m_pOrth.y-m_Data_y[i]);
break;
case 1:
pDC->TextOut(m_pOrth.x+m_Data_x[i]-1,m_pOrth.y-m_Data_y[i]-1,"*");
break;
case 2:
pDC->Ellipse(m_pOrth.x+m_Data_x[i]-2,m_pOrth.y-m_Data_y[i]-2
,m_pOrth.x+m_Data_x[i]+2,m_pOrth.y-m_Data_y[i]+2);
//pDC->TextOut(m_pOrth.x+m_Data_x[i]-1,
// m_pOrth.y-m_Data_y[i]-1,"0");
break;
case 3:
pDC->Rectangle(m_pOrth.x+m_Data_x[i]-2,m_pOrth.y-m_Data_y[i]-2
,m_pOrth.x+m_Data_x[i]+2,m_pOrth.y-m_Data_y[i]+2);
break;
case 4:
case 5:
case 6:
pDC->LineTo(m_pOrth.x+m_Data_x[i],m_pOrth.y-m_Data_y[i]);
break;
}
//
}
//
}
}
bool CDataShow::IsDataOut(double x,double y)
{
if (x>m_dataRect.right||x<m_dataRect.left||y<m_dataRect.top||y>m_dataRect.bottom)
{
return true;
}
return false;
}
void CDataShow::Draw_CrossLine(CDC *pDC)
{
CPen p;
p.CreatePen(0,0,m_cross_color);
pDC->SelectObject(&p);
int x,y;
x=m_pMousePoint.x;
y=m_pMousePoint.y;
CPoint w_s,w_e,h_s,h_e;
w_s.x=m_pOrth.x;
w_s.y=y;
w_e.x=m_dataRect.right-w;
w_e.y=y;
h_s.x=x;
h_s.y=m_pOrth.y;
h_e.x=x;
h_e.y=m_dataRect.top+h;
pDC->MoveTo(w_s);
pDC->LineTo(w_e);
pDC->MoveTo(h_s);
pDC->LineTo(h_e);
p.DeleteObject();
}
double CDataShow::GetDistance(CPoint p, double x, double y)
{
return sqrtl((p.x-x)*(p.x-x)+(p.y-y)*(p.y-y));
}
int CDataShow::GetNearPoint()
{
for (int i=0;i<m_dNumOfData;i++)
{
double x,y;
x=m_Data_x[i];
y=m_Data_y[i];
// x=(x-m_x_start)/m_xFactor;
// y=(y-m_y_start)/m_yFactor;
if (abs(GetDistance(m_pMousePoint,double(x+m_pOrth.x),double(-y+m_pOrth.y)))<5)
{
return i;
}
}
return -1;
}
void CDataShow::SetNearMousePoint()
{
if (GetNearPoint()!=-1&&GetNearPoint()!=m_dNumOfData)
{
m_pMousePoint.x=double(m_Data_x[GetNearPoint()])+m_pOrth.x;
m_pMousePoint.y=double(m_Data_y[GetNearPoint()])+m_pOrth.y;
}
CString s;
s.Format("%d",GetNearPoint());
//GetDC()->TextOut(0,0,s);
}
void CDataShow::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (m_IsSelect_enlarge==false)
{
m_pMousePoint=point;
m_IsCrossMove=true;
}
if (!IsDataOut(point.x,point.y))//保证选择框不超出数据框范围
{
m_Select_Enlarge_p1=point;
}
m_IsEnlargeClose=false;
CStatic::OnLButtonDown(nFlags, point);
}
void CDataShow::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (m_IsSelect_enlarge==false)
{
m_IsCrossMove=false;
}
m_IsEnlargeClose=true;
CStatic::OnLButtonUp(nFlags, point);
}
void CDataShow::SetText(CString str, CString name)
{
if (name=="x")
{
m_sAxis_xstr=str;
}
else
if (name=="y")
{
m_sAxis_ystr=str;
}
else
{
m_sTitle_str=str;
}
}
bool CDataShow::SaveBmp()
{
//定义图形大小
CFileDialog dlg(false,NULL,"数据",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"bmp文件(*.bmp)|*.bmp|",
NULL);
char title[]= {"保存数据文件"};
dlg.m_ofn.lpstrTitle= title;
if (dlg.DoModal()!= IDOK) return false;
CString filename = dlg.GetFileName() + ".bmp";
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_SelectArea(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);
Draw_NoteWord(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;
return true;
}
void CDataShow::LoadData()
{
CFileDialog dlg(true,NULL,"数据",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"data文件(*.data)|*.data|",
NULL);
char title[]= {"打开数据文件"};
dlg.m_ofn.lpstrTitle= title;
if (dlg.DoModal()!= IDOK) return;
CString filename = dlg.GetFileName() ;
FILE *f;
f=fopen(filename,"r");
if (f==NULL)
{
AfxMessageBox("打开文件错误");
return;
}
fscanf(f,"%d",&m_dNumOfData);
for (int i=0;i<m_dNumOfData;i++)
{
fscanf(f,"%f",&m_Data_x[i]);
fscanf(f,"%f",&m_Data_y[i]);
}
fclose(f);
m_start_POINT.x=m_Data_x[0];
m_start_POINT.y=m_Data_y[0];
m_end_point.x=m_Data_x[m_dNumOfData-1];
m_end_point.y=m_Data_y[m_dNumOfData-1];
DataChange("in");
}
void CDataShow::SaveData()
{
DataChange("out");
KillTimer(0);
FILE *f;
CFileDialog dlg(false,NULL,"数据",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"data文件(*.data)|*.data|",
NULL);
char title[]= {"保存数据文件"};
dlg.m_ofn.lpstrTitle= title;
if (dlg.DoModal()!= IDOK)
{
DataChange("in");
return;
}
CString filename = dlg.GetFileName() + ".data";
f=fopen(filename,"w");
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");
SetTimer(0,100,NULL);
}
void CDataShow::Grid(CString IsOn)
{
if (IsOn=="on"||IsOn=="oN"||IsOn=="On")
{
m_bIsGridOn=true;
}
else
{
m_bIsGridOn=false;
}
}
void CDataShow::Draw_Grid(CDC *pDC)
{
if (m_bIsGridOn)
{
pDC->SelectObject(m_pdc_grid.new_pen);
double x,y;
for (int i=1;i<=m_dNum;i++)
{
if((i%m_GridControl)==0)
{
x=i*10+m_pOrth.x;
y=m_pOrth.y;
pDC->MoveTo(x,y);
x=i*10+m_pOrth.x;
y=m_dataRect.top+h;
pDC->LineTo(x,y);
}
}
for (i=1;i<=m_dnum_top_bottom;i++)
{
if((i%m_GridControl)==0)
{
x=m_pOrth.x;
y=m_pOrth.y-i*10;
pDC->MoveTo(x,y);
x=m_dataRect.right-w;
pDC->LineTo(x,y);
}
}
}
}
void CDataShow::SetGridDensity(int density)
{
if (density>0)
m_GridControl=density;
}
void CDataShow::SetGridColor(COLORREF C)
{
m_pdc_grid.new_pen.DeleteObject();
m_pdc_grid.new_pen.CreatePen(2,0,C);
}
void CDataShow::OnSetNoteOnOff()
{
if (m_IsNoteOn)
{
SetNoteWordOn(true);
m_IsNoteOn=false;
}
else
{
SetNoteWordOn(false);
m_IsNoteOn=true;
}
}
void CDataShow::OnSetTimeShow()
{
if (m_IsTimeShow)
{
SetTimeShow(true);
m_IsTimeShow=false;
}
else
{
SetTimeShow(false);
m_IsTimeShow=true;
}
}
void CDataShow::SetDataColor(COLORREF C)
{
m_pdc_data.new_pen.DeleteObject();
m_pdc_data.new_pen.CreatePen(0,m_lineWide,C);
m_pdc_data.c=C;
m_pdc_data.new_brush.DeleteObject();
m_pdc_data.new_brush.CreateSolidBrush(m_pdc_childRect.c);
m_datacolor=C;
}
void CDataShow::SetTextColor(COLORREF C)
{
text_color=C;
}
void CDataShow::SetCrossColor(COLORREF C)
{
m_cross_color=C;
}
void CDataShow::SetTitleColor(COLORREF C)
{
title_color=C;
}
void CDataShow::SetData(double *x, double *y, int n)
{
if (n<=2000)
{
m_dNumOfData=n;
for (int i=0;i<m_dNumOfData;i++)
{
m_Data_x[i]=x[i];
m_Data_y[i]=y[i];
}
DataChange("in");
}
}
void CDataShow::Init()
{
SetTimer(0,10,NULL);
// Invalidate();
}
void CDataShow::SetAxisChange()
{
m_xFactor=double(m_x_end-m_x_start)/double(m_High-m_Low);
m_yFactor=double(m_y_end-m_y_start)/double(m_Top-m_Bottom);
}
void CDataShow::Draw_SelectRect(CDC *pdc)
{
if (GetNearPoint()!=-1&&GetNearPoint()!=m_dNumOfData)
{
CPen p;
CBrush b;
b.CreateSolidBrush(m_selectRect_color);
p.CreatePen(0,0,m_selectRect_color);
pdc->SelectObject(&p);
pdc->SelectObject(&b);
pdc->Rectangle(m_pMousePoint.x-3,m_pMousePoint.y-3,m_pMousePoint.x+3,m_pMousePoint.y+3);
p.DeleteObject();
b.DeleteObject();
m_IsCaptureSaveBMP=true;
}
else
m_IsCaptureSaveBMP=false;
}
int CDataShow::SetDrawLineStyle(int style,int lineWide)
{
m_lineStyle=style;
m_lineWide=lineWide;
if ((style<0||style>=7))
{
m_lineStyle=0;
}
if ((lineWide<0||lineWide>20))
{
m_lineWide=0;
}
m_pdc_data.new_pen.DeleteObject();
if (style>=4)
{
m_pdc_data.new_pen.CreatePen(m_lineStyle-3,m_lineWide,m_datacolor);
}
else
m_pdc_data.new_pen.CreatePen(0,m_lineWide,m_datacolor);
return style;
}
void CDataShow::SaveBmp(double second,bool stop)
{
if (stop==true)
{
KillTimer(1);
}
else
{
SetTimer(1,second*1000,NULL);
}
SaveBmpWithTheOfTime();
}
void CDataShow::SaveBmpWithTheOfTime()
{
KillTimer(0);
CTime st=CTime::GetCurrentTime();
CString filename,str;
str.Format("H=%d Min=%d Sec=%d",st.GetHour(),st.GetMinute(),st.GetSecond());
filename.Format("Num%d",m_numOfBMP++);
filename=filename+",Time "+str+".bmp";
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_SelectArea(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);
Draw_NoteWord(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;
Sleep(200);
SetTimer(0,100,NULL);
}
void CDataShow::SaveData(double second, bool stop)
{
if (stop==true)
{
KillTimer(2);
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -