📄 datashow.cpp
字号:
// DataShow.cpp : implementation file
//
/************************************************************************/
/* 数据显示类:
作者:南京航空航天大学能源与动力学院 庄三少
2009年1月11日
Email:viualsan@yahoo.cn
tel:13512524413
说明:
本类无任何限制,可自由改动传播。只需附上该段说明。 */
/************************************************************************/
#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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -