www.gusucode.com > VC++数据曲线动态绘制显示类源码程序 > VC++数据曲线动态绘制显示类源码程序/code/DataShow.cpp
// DataShow.cpp : implementation file // /************************************************************************/ /* 数据显示类: 作者:南京航空航天大学能源与动力学院 庄三少 2009年1月11日 Email:viualsan@yahoo.cn tel:13512524413 友情发布:http://www.NewXing.com 说明: 本类无任何限制,可自由改动传播。只需附上该段说明。 */ /************************************************************************/ #include "stdafx.h" #include "DataShow.h" #include <math.h> #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CDataShow CDataShow::CDataShow() { m_IsTimeShow=true; m_time_color=RGB(255,0,255); m_IsNoteOn=true; m_sNote_text="南京航空航天大学创建于 1952 年 10 月,座落于六朝古都南京。目前有两校区."; m_IsEnlargeClose=false; m_IsSelect_enlarge=false; m_IsEnlarge=false; m_IsMove=false; m_captureNum=0; m_IsCaptureSaveBMP=3; m_IsCaptureSaveBMP=false; m_numofData=0; m_numOfBMP=0; m_lineStyle=0; m_lineWide=0; m_color_note=RGB(0,200,180); title_color=RGB(0,250,230); text_color=RGB(255,255,255); m_cross_color=RGB(0,255,255); m_selectRect_color=RGB(250,0,0); m_pMousePoint.x=0; m_pMousePoint.y=0; m_dNumOfData=0; m_selectRect_color=RGB(122,30,200); //初始化主框画笔 m_pdc_framRect.new_brush.CreateSolidBrush(RGB(0,100,100)); m_pdc_framRect.new_pen.CreatePen(0,0,RGB(255,255,0)); //初始化数据框画笔 m_pdc_data.new_brush.CreateSolidBrush(RGB(0,100,100)); m_pdc_data.new_pen.CreatePen(0,0,RGB(255,255,0)); m_datacolor=RGB(255,255,0); //参数化数据框画笔 m_pdc_childRect.new_brush.CreateSolidBrush(RGB(0,0,0)); m_pdc_childRect.new_pen.CreatePen(0,0,RGB(255,255,0)); m_pdc_childRect.c=RGB(0,0,0); //参数化轴画笔 m_pdc_axis.new_brush.CreateSolidBrush(RGB(0,100,100)); m_pdc_axis.new_pen.CreatePen(0,0,RGB(255,255,0)); //初始化网格画笔 m_pdc_grid.new_pen.CreatePen(2,0,RGB(0,255,255)); m_High=500; m_Low=0; m_Top=500; m_Bottom=0; /////////////////// double dx=m_High/200.0; for (int i=0;i<200;i++) { m_Data_x[i]=dx*i; m_Data_y[i]=sin(m_Data_x[i]/30)*150; m_dNumOfData++; } 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]; m_IsCrossMove=true; m_sTitle_str="visualsan@yahoo.cn TEL:13512524413 南京航空航天大学——庄三少"; m_sAxis_xstr="时间轴"; m_sAxis_ystr="数据轴"; m_dNum=(m_High - m_Low)/10; m_dnum_top_bottom=(m_Top - m_Bottom)/10; m_bIsGridOn=false; m_GridControl=5; m_x_start=-100; m_y_start=-100; m_x_end=500; m_y_end=500; m_xFactor=(m_x_end-m_x_start)/double(m_High-m_Low); m_yFactor=(m_y_end-m_y_start)/double(m_Top-m_Bottom); m_pdc_data.c=m_pdc_childRect.c; m_pdc_data.new_brush.DeleteObject(); m_pdc_data.new_brush.CreateSolidBrush(RGB(0,0,0)); for (i=0;i<20;i++) { m_Text[i]="love"; } } CDataShow::~CDataShow() { } BEGIN_MESSAGE_MAP(CDataShow, CStatic) //{{AFX_MSG_MAP(CDataShow) ON_WM_TIMER() ON_WM_MOUSEMOVE() ON_WM_PAINT() ON_WM_CREATE() ON_WM_ERASEBKGND() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_RBUTTONDOWN() ON_WM_RBUTTONUP() ON_WM_MBUTTONDOWN() ON_WM_MBUTTONUP() ON_WM_LBUTTONDBLCLK() ON_WM_RBUTTONDBLCLK() ON_COMMAND(IDC_SAVE_BMP, OnSaveBmp) ON_COMMAND(IDC_SAVE_DATA, OnSaveData) ON_COMMAND(IDC_SET_DATA_COLOR,OnSetDataColor) ON_COMMAND(IDC_SET_AXIS_COLOR,OnSetAxisColor) ON_COMMAND(IDC_SET_XYLEBAL_COLOR,OnSetXYlebalColor) ON_COMMAND(IDC_SET_GRID_COLOR,OnSetGridColor) ON_COMMAND(IDC_SET_BK_COLOR,OnSetBKColor) ON_COMMAND(IDC_SET_TITLE_COLOR,OnSetTitleColor) ON_COMMAND(IDC_SET_CROSSLINE_COLOR,OnSetCrossLineColor) ON_COMMAND(IDC_SET_FACE_COLOR,OnSetFaceColor) ON_COMMAND(IDC_DATA_INPUT,OnSetDataInput) ON_COMMAND(IDC_SET_GRID_ON_OFF,OnSetGridOnOff) ON_COMMAND(IDC_SET_NOTE_ON_OFF,OnSetNoteOnOff) ON_COMMAND(IDC_SET_NOTE_COLOR,OnSetNoteColor) ON_COMMAND(IDB_SET_TIME_SHOW,OnSetTimeShow) ON_COMMAND(IDB_SET_TIME_TEXT_COLOR,OnSetTimeColor) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDataShow message handlers void CDataShow::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default if (nIDEvent==0) { Invalidate(); } if (nIDEvent==1) { SaveBmpWithTheOfTime(); if (m_numOfBMP>1000) { m_numOfBMP=0; } } if (nIDEvent==2) { SaveDateAuto(); if (m_numofData>1000) { m_numofData=0; } } /*if ((m_IsCaptureSaveBMP)&&m_captureNum<=m_max_CapturePictre ) { 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_numOfBMP++); filename=filename+",Time "+str+".bmp"; CaptureSaveBMP(filename); m_captureNum++; }*/ CStatic::OnTimer(nIDEvent); } void CDataShow::OnSetDataColor() { SetColor("data"); } void CDataShow::OnSetTimeColor() { SetColor("time"); } void CDataShow::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if(m_IsSelect_enlarge&&!m_IsEnlargeClose) { if (!IsDataOut(point.x,point.y))//保证选择框不超出数据框范围 { m_Select_Enlarge_p2=point; } } SetTimer(0,10,NULL); SetDataRect(); Move(point); Enlarge(point); if (m_dataRect.left<point.x&&point.x<m_dataRect.right &&point.y>m_dataRect.top&&point.y<m_dataRect.bottom) { if (m_IsCrossMove) { if (GetNearPoint()!=-1&&GetNearPoint()!=m_dNumOfData) { SetNearMousePoint(); } else{ m_pMousePoint.x=point.x; m_pMousePoint.y=point.y; } } } Move(point); CStatic::OnMouseMove(nFlags, point); } void CDataShow::OnPaint() { CPaintDC dc(this); // device context for painting m_High=(m_dataRect.right-m_dataRect.left); m_Low=0; m_Top=(-m_dataRect.top+m_dataRect.bottom-2*h); m_Bottom=0; m_dNum=(m_High - m_Low)/10; m_dnum_top_bottom=(m_Top - m_Bottom)/10; //CDC *pDC; //pDC=GetDC(); GetClientRect(m_frameRect); CBitmap bitmap; bitmap.CreateCompatibleBitmap(&dc, m_frameRect.Width(), m_frameRect.Height());//生成空间的内存位图 CDC me; me.CreateCompatibleDC(NULL);//生成内存cd me.SelectObject(&bitmap); me.SetBkMode(TRANSPARENT);//设置透明字体 me.SetTextColor(RGB(255,0,0)); ////////////////////////添加绘图函数 // EnlargeSelectLarge(); SetAxisChange(); Draw_frameRect(&me); Draw_childRect(&me); Draw_SelectArea(&me); Draw_MousePoint(&me); Draw_Title(&me); Draw_Axis(&me); Draw_Axis_xyLebal(&me); Draw_Data(&me); Draw_CrossLine(&me); Draw_Grid(&me); Draw_SelectRect(&me); Draw_NoteWord(&me); // TextControl(&me); /////////////////////////////////////////////////////////////////////////// me.SetROP2(R2_WHITE); dc.BitBlt(0, 0, m_frameRect.Width(), m_frameRect.Height(), &me, 0, 0, SRCCOPY);//拷备 bitmap.DeleteObject(); me.DeleteDC(); // pDC->DeleteDC(); // Do not call CStatic::OnPaint() for painting messages } int CDataShow::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CStatic::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here GetClientRect(m_frameRect); return 0; } BOOL CDataShow::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default return FALSE; } void CDataShow::Draw_frameRect(CDC *dc) { GetClientRect(m_frameRect); dc->FillRect(m_frameRect,&m_pdc_framRect.new_brush); } //DEL void pdc::SetOldObject() //DEL { //DEL pDC->SelectObject(old_brush); //DEL pDC->SelectObject(old_pen); //DEL //DEL } //DEL void pdc::SetNewObject() //DEL { //DEL old_pen=pDC->SelectObject(&new_pen); //DEL old_brush=pDC->SelectObject(&new_brush); //DEL //DEL } //DEL pdc::~pdc() //DEL { //DEL SetOldObject(); //DEL } //DEL pdc::pdc() //DEL { //DEL //DEL //DEL } void CDataShow::Draw_childRect(CDC *dc) { GetClientRect(m_frameRect); SetDataRect(); // SetChildRectColor(RGB(0,0,0)); dc->FillRect(m_dataRect,&m_pdc_childRect.new_brush); } void CDataShow::SetDataRect() { w=m_frameRect.Width()/10.0; h=m_frameRect.Height()/10.0; if (w>20) { w=20; } if (h>10) { h=10; } if (w<10) { w=10; } if (h<5) { h=5; } m_dataRect.left=m_frameRect.left+w*3; m_dataRect.right=m_frameRect.right-w; m_dataRect.top=m_frameRect.top+h; m_dataRect.bottom=m_frameRect.bottom-h; } void CDataShow::SetFrameColor(COLORREF C) { m_pdc_framRect.new_brush.DeleteObject(); m_pdc_framRect.new_brush.CreateSolidBrush(C); } void CDataShow::SetChildRectColor(COLORREF C) { m_pdc_childRect.new_brush.DeleteObject(); m_pdc_childRect.new_brush.CreateSolidBrush(C); m_pdc_childRect.c=C; m_pdc_data.new_brush.DeleteObject(); m_pdc_data.new_brush.CreateSolidBrush(C); } void CDataShow::Draw_MousePoint(CDC *pdc) { CString str; str.Format("x=%.1f",double((m_pMousePoint.x-m_pOrth.x)*m_xFactor+m_x_start)); pdc->TextOut(m_frameRect.left+5,m_frameRect.bottom-30,str); str.Format("y=%.1f",double((-m_pMousePoint.y+m_pOrth.y)*m_yFactor+m_y_start)); pdc->TextOut(m_frameRect.left+5,m_frameRect.bottom-50,str); if (m_IsTimeShow) { pdc->SetTextColor(m_time_color); pdc->TextOut(m_dataRect.right-120,m_pOrth.y-30,GetTimeFormat()); } } void CDataShow::Draw_Title(CDC *pdc) { CPen p; p.CreatePen(0,0,title_color); SetTitlePosition(); pdc->SetTextColor(title_color); pdc->TextOut(m_pTextPosition.x,m_pTextPosition.y,m_sTitle_str); p.DeleteObject(); } void CDataShow::SetTitlePosition() { SetDataRect(); /* CPaintDC dc(this); TEXTMETRIC tm; dc.GetTextMetrics(&tm); int text_height_ ,text_width_,l; l=m_sTitle_str.GetLength(); text_height_ = tm.tmHeight + tm.tmExternalLeading; // Height of font text_width_ = tm.tmMaxCharWidth; // width of widest char in font if (l<100) { for (int i=0;i<=l*text_width_/m_dataRect.Width();i++) {*/ m_pTextPosition.x=(m_dataRect.left+m_dataRect.right)/2-4*m_sTitle_str.GetLength();//((text_width_*m_sTitle_str.GetLength())/(l*text_width_/m_dataRect.Width()+1))/2*text_width_; m_pTextPosition.y=m_dataRect.top+h;//+text_height_*i; /* } } else { }*/ } void CDataShow::Draw_Axis(CDC*pDC) { pDC->SetTextColor(text_color); pDC->SelectObject(&m_pdc_axis.new_pen); CRect rect; SetDataRect(); rect=m_dataRect; CString str; int i; int m_left,m_top,m_right,m_bottom; int m_Interval = (m_High - m_Low)/10; m_dNum=m_Interval; if (m_Interval < 1) m_Interval = 1; m_left = rect.left+20; m_top = rect.top+10; m_right = rect.right-10; m_bottom = rect.bottom-40; int m_IntervalPan = (m_right - m_left)/10; if (m_IntervalPan < 1 ) m_IntervalPan =1; // 选中当前红色画笔,并保存以前的画笔 // CGdiObject* pOldPen = pDC->SelectObject(pPenRed); // 绘制坐标轴 pDC->MoveTo(m_left,m_top); // 垂直轴 pDC->LineTo(m_left,m_bottom); // 水平轴 pDC->LineTo(m_right,m_bottom); m_pOrth.x=m_left; m_pOrth.y=m_bottom; // 写X轴刻度值 for(i=0;i<10;i++) { //str.Format(_T("%d"),m_Min+i*m_Interval); str.Format(_T("%.1f"),GetAxisPosition(i,"x")); pDC->TextOut(m_left+double(i*m_IntervalPan),m_bottom+3,str); } //str.Format(_T("%d"),m_Max); str.Format(_T("%.1f"),m_x_end); pDC->TextOut(m_left+10*m_IntervalPan,m_bottom+3,str); ////////////////////////////////////////////////////////////////// m_Interval = (m_High - m_Low)/10; // 绘制X轴刻度 for (i = 0; i < 20; i ++) { if ((i%2) == 0) { // 10的倍数 pDC->MoveTo(i*m_Interval/2 + m_pOrth.x, m_bottom); pDC->LineTo(i*m_Interval/2 + m_pOrth.x, m_bottom+8); } else { // 10的倍数 pDC->MoveTo(i*m_Interval/2 +m_pOrth.x, m_bottom); pDC->LineTo(i*m_Interval/2 + m_pOrth.x, m_bottom+3); } } // 绘制Y轴箭头 pDC->MoveTo(m_right-5,m_bottom-5); pDC->LineTo(m_right,m_bottom); pDC->LineTo(m_right-5,m_bottom+5); // 绘制X轴箭头 pDC->MoveTo(m_left-5,m_top+5); pDC->LineTo(m_left,m_top); pDC->LineTo(m_left+5,m_top+5); // 绘制Y轴网格 选择绿色画笔 // pDC->SelectObject(pPenGreen); // ////////////////////////////////////////////////////////////////// //数组赋值 m_Interval=(-m_Bottom+m_Top)/10; m_dnum_top_bottom=m_Interval; CFont* pFont = pDC->GetCurrentFont(); LOGFONT logFont ; pFont->GetLogFont(&logFont); logFont.lfEscapement = 900 ;//900/10 = 90 HFONT hFont=CreateFontIndirect(&logFont); pDC->SelectObject(hFont); // 写y轴刻度值 for(i=0;i<10;i++) { //str.Format(_T("%d"),m_Min+i*m_Interval); str.Format(_T("%.1f"),GetAxisPosition(i,"y")); pDC->TextOut(m_pOrth.x-20,m_bottom-(i)*m_Interval+10,str); } // 绘制y轴刻度 for (i=0;i<20;i++) { if (i%2 == 0) { // 10的倍数 pDC->MoveTo(m_pOrth.x, m_Bottom+i*m_Interval/2); pDC->LineTo(m_pOrth.x-8, m_Bottom+i*m_Interval/2); } else { pDC->MoveTo(m_pOrth.x, m_Bottom+i*m_Interval/2); pDC->LineTo(m_pOrth.x-5, m_Bottom+i*m_Interval/2); } } DeleteObject(hFont); pDC->SelectObject(pFont); pFont->DeleteObject(); } void CDataShow::SetAxisColor(COLORREF C) { m_pdc_axis.new_pen.DeleteObject(); m_pdc_axis.new_pen.CreatePen(0,0,C); } void CDataShow::SetXYLebalColor(COLORREF C) { m_axis_xyLebal.new_pen.DeleteObject(); m_axis_xyLebal.new_pen.CreatePen(0,0,C); } void CDataShow::Draw_Axis_xyLebal(CDC *pdc) { SetDataRect(); CFont* pFont = pdc->GetCurrentFont(); LOGFONT logFont ; pFont->GetLogFont(&logFont); logFont.lfEscapement = 900 ;//900/10 = 90 HFONT hFont=CreateFontIndirect(&logFont); ///////////////x轴文字输出 pdc->TextOut((m_dataRect.left+m_dataRect.right)/2-4*m_sAxis_xstr.GetLength(),m_pOrth.y+h+20,m_sAxis_xstr); ////////////////////y轴文字输出 pdc->SelectObject(hFont); pdc->TextOut(m_pOrth.x+5,(m_dataRect.bottom+m_dataRect.top)/2.5+4*m_sAxis_ystr.GetLength(),m_sAxis_ystr); DeleteObject(hFont); pdc->SelectObject(pFont); pFont->DeleteObject(); // delete hFont; } void CDataShow::Draw_Data(CDC *pDC) { int a,b; pDC->SelectObject(&m_pdc_data.new_pen); pDC->SetTextColor(m_datacolor); pDC->SelectObject(&m_pdc_data.new_brush); if (m_lineStyle>=4) { m_pdc_data.new_pen.DeleteObject(); m_pdc_data.new_pen.CreatePen(m_lineStyle-3,m_lineWide,m_datacolor); pDC->SelectObject(&m_pdc_data.new_pen); } 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 { 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; }