?? historyform.cpp
字號(hào):
// HistoryForm.cpp : implementation file
//
#include "stdafx.h"
#include "datasvr.h"
#include "HistoryForm.h"
#include "glovar.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CHistoryForm
IMPLEMENT_DYNCREATE(CHistoryForm, TVisualFormView)
CHistoryForm::CHistoryForm()
: TVisualFormView(CHistoryForm::IDD)
{
//{{AFX_DATA_INIT(CHistoryForm)
m_dt1 = COleDateTime::GetCurrentTime();
m_dt2 = COleDateTime::GetCurrentTime();
//}}AFX_DATA_INIT
data=NULL;
pic_valid=false;
data_valid=false;
DCMEM.m_hDC=NULL;
m_pDC=NULL;
count=0;
}
static int oldx=-1;
static int oldtextx=-1;
static CString oldstr;
CHistoryForm::~CHistoryForm()
{
}
void CHistoryForm::DoDataExchange(CDataExchange* pDX)
{
TVisualFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CHistoryForm)
DDX_Control(pDX, IDC_CBX_RT, m_ctlRT);
DDX_Control(pDX, IDC_DATETIMEPICKER2, m_ctldt2);
DDX_Control(pDX, IDC_DATETIMEPICKER1, m_ctldt1);
DDX_DateTimeCtrl(pDX, IDC_DATETIMEPICKER1, m_dt1);
DDX_DateTimeCtrl(pDX, IDC_DATETIMEPICKER2, m_dt2);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CHistoryForm, TVisualFormView)
//{{AFX_MSG_MAP(CHistoryForm)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_CBN_SELENDOK(IDC_CBX_RT, OnSelendokCbxRt)
ON_NOTIFY(DTN_DATETIMECHANGE, IDC_DATETIMEPICKER1, OnDatetimechangeDatetimepicker1)
ON_NOTIFY(DTN_DATETIMECHANGE, IDC_DATETIMEPICKER2, OnDatetimechangeDatetimepicker2)
ON_WM_SIZE()
ON_WM_MOUSEMOVE()
ON_BN_CLICKED(IDC_BTN_SAVE, OnBtnSave)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CHistoryForm diagnostics
#ifdef _DEBUG
void CHistoryForm::AssertValid() const
{
TVisualFormView::AssertValid();
}
void CHistoryForm::Dump(CDumpContext& dc) const
{
TVisualFormView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CHistoryForm message handlers
int CHistoryForm::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (TVisualFormView::OnCreate(lpCreateStruct) == -1)
return -1;
m_pDC=new CClientDC(this);
wz.CreatePen(PS_SOLID, 1, RGB(0,0,255));
m_pDC->SelectObject(&wz);
m_pDC->SetROP2(R2_XORPEN);
m_pDC->SetTextColor(RGB(255,255,0));
m_pDC->SetBkMode( TRANSPARENT );
Font1.CreatePointFont(8*10,"Arial");
Font2.CreateFont(
12, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_NORMAL, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
GB2312_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
"Arial");
LOGBRUSH lb;
lb.lbStyle = BS_SOLID;
lb.lbColor = RGB(255,0,0);
LineBrush.CreateBrushIndirect(&lb);
NewPen.CreatePen(PS_SOLID, 1, RGB(0,255,0));
RedPen.CreatePen(PS_DASH , 1, RGB(255,0,0));
return 0;
}
void CHistoryForm::OnDestroy()
{
if(data!=NULL)delete data;
delete m_pDC;
TVisualFormView::OnDestroy();
}
void CHistoryForm::OnDraw(CDC* pDC)
{
static bool processin=false;
if(!processin)
{
processin=true;
CRect clientrect;
this->GetClientRect(&clientrect);
if(pic_valid==false)
{
bool result;
if(DCMEM.m_hDC!=NULL)
{
DCMEM.SelectObject(m_pbmpOldDCMEM);
// DCMEM.Detach();//.DeleteDC();
// DCMEM.DeleteDC();
// m_bmpDCMEM.Detach();
result=m_bmpDCMEM.DeleteObject();
if(!result)
{
::AfxMessageBox("delete object error");
}
}
else
{
result = DCMEM.CreateCompatibleDC(pDC);
if(!result)
{
::AfxMessageBox("CreateCompatibleDC error");
}
}
result = m_bmpDCMEM.CreateCompatibleBitmap(pDC,1024,768);
if(!result)
{
::AfxMessageBox("CreateCompatibleBitmap error");
}
m_pbmpOldDCMEM=DCMEM.SelectObject(&m_bmpDCMEM);
if(data_valid)
{
pic_valid=DrawMe(data,count,&DCMEM);
}
}
oldx=-1;
pDC->BitBlt(2, 40,clientrect.Width()-4,clientrect.Height()-40-2, &DCMEM, 0, 0, SRCCOPY);
processin=false;
}
}
bool CHistoryForm::DrawMe(HISTORY_DATA *data, int count, CDC *pDC)
{
if(data==NULL || count==0)return false;
int rtid;
int sel;
sel=m_ctlRT.GetCurSel();
bool valid=false;
NPRT nprt;
if(sel!=CB_ERR)
{
rtid=m_ctlRT.GetItemData(sel);
for(int i=0;i<arrRT.GetSize();i++)
{
nprt=arrRT.GetAt(i);
if(nprt->rtid==rtid)break;
}
}
else return false;
int viewcount=0;
CRect rect;
GetClientRect( &rect );
int viewh=rect.Height()-40-2;
int vieww=rect.Width()-4;
int OldBKMode = pDC->SetBkMode( TRANSPARENT );
COLORREF OldColor = pDC->SetTextColor(RGB(128,128,128));
CFont *OldFont=(CFont *)pDC->SelectObject(CFont::FromHandle(Font2));
CBrush *OldBrush = pDC->SelectObject( &LineBrush);
CPen *OldPen=pDC->SelectObject(&RedPen);
float maxvalue=data[0].value,minvalue=data[0].value;
for(int j=0;j<count;j++)
{
if(data[j].state==101)
{
if(data[j].value>maxvalue)maxvalue=data[j].value;
if(data[j].value<minvalue && data[j].value>=0)minvalue=data[j].value;
}
}
//zdp add 20031227
if(nprt->range_hi>nprt->range_low)
{
maxvalue=nprt->range_hi;
minvalue=nprt->range_low;
}
if(maxvalue-minvalue==0)minvalue-=minvalue/100;
if(maxvalue==minvalue && minvalue==0)maxvalue=1;
int viewt=30;int viewb=viewh-20-2;
CString maxstr,minstr;
maxstr.Format("%f",maxvalue);
minstr.Format("%f",minvalue);
pDC->MoveTo(2,viewt);pDC->LineTo(vieww-4,viewt);pDC->TextOut(2,viewt-5,maxstr);
pDC->MoveTo(2,viewb);pDC->LineTo(vieww-4,viewb);pDC->TextOut(2,viewb-5,minstr);
CString str;
str.Format("%s %s",dtfrom.Format("%Y-%m-%d %H:%M"),dtto.Format("%Y-%m-%d %H:%M"));
pDC->TextOut(2,2,str);
viewh=viewb-viewt;
pDC->SelectObject(&NewPen);
if(true)
{
double oldvalidvalue=minvalue;
int begin=0;
int x,y,xx;
xx=(vieww-2)/count;
x=2;
y=(int)(viewb-(data[begin].value-minvalue)*viewh/(maxvalue-minvalue));
pDC->MoveTo(x,y);
int invalidcount=0;
for(int j=1;j<count;j++)
{
if(data[j].state==101 && data[j].value>=minvalue && data[j].value<=maxvalue)
{
invalidcount=0;
oldvalidvalue=data[j].value;
}
else
invalidcount++;
// if(data[j].value<minvalue)oldvalidvalue=minvalue;
// if(data[j].value>maxvalue)oldvalidvalue=maxvalue;
if(invalidcount>5)oldvalidvalue=minvalue;
pDC->MoveTo(x,y);
x=(vieww-2)*j/count+2;
y=(int)(viewb-(oldvalidvalue-minvalue)*viewh/(maxvalue-minvalue));
//y=viewb;
pDC->LineTo(x,y);
}
viewcount++;
}
pDC->SetTextColor( OldColor );
pDC->SelectObject( OldFont );
pDC->SelectObject( OldBrush);
pDC->SelectObject( OldPen);
pDC->SetBkMode( OldBKMode );
return true;
}
void CHistoryForm::OnInitialUpdate()
{
TVisualFormView::OnInitialUpdate();
m_ctlRT.ResetContent();
NPRT nprt;
for(int i=0;i<arrRT.GetSize();i++)
{
nprt=arrRT.GetAt(i);
if(nprt->saving_cycle>0)
{
NPCD npcd;
NPCS npcs;
for(int j=0;j<arrCD.GetSize();j++)
{
npcd=arrCD.GetAt(j);
if(npcd->cdid==nprt->cdid)break;
}
for(j=0;j<arrCS.GetSize();j++)
{
npcs=arrCS.GetAt(j);
if(npcs->csid==nprt->csid)break;
}
CString str;
str.Format("%-15s%10s",npcd->cdname,npcs->csname);
int cur=m_ctlRT.AddString(str);
m_ctlRT.SetItemData(cur,nprt->rtid);
}
}
m_ctlRT.SetCurSel(0);
}
void CHistoryForm::OnSelendokCbxRt()
{
pic_valid=false;
data_valid=ReadData();
this->Invalidate();
}
void CHistoryForm::OnDatetimechangeDatetimepicker1(NMHDR* pNMHDR, LRESULT* pResult)
{
OnSelendokCbxRt();
*pResult = 0;
}
void CHistoryForm::OnDatetimechangeDatetimepicker2(NMHDR* pNMHDR, LRESULT* pResult)
{
OnSelendokCbxRt();
*pResult = 0;
}
bool CHistoryForm::ReadData()
{
this->UpdateData();
int rtid;
int sel;
if(data!=NULL)
{
delete data;
data=NULL;
}
sel=m_ctlRT.GetCurSel();
bool valid=false;
if(sel!=CB_ERR)
{
rtid=m_ctlRT.GetItemData(sel);
// int count;
dtfrom.SetDateTime(m_dt1.GetYear(),m_dt1.GetMonth(),m_dt1.GetDay(),0,0,0);
dtto.SetDateTime(m_dt2.GetYear(),m_dt2.GetMonth(),m_dt2.GetDay(),23,59,59);
data=::ReadDataFromFile(rtid,dtfrom,dtto,count);
if(data!=NULL && count>0)
// DrawMe(data,count,&DCMEM);
valid=true;
}
return valid;
}
void CHistoryForm::OnSize(UINT nType, int cx, int cy)
{
TVisualFormView::OnSize(nType, cx, cy);
pic_valid=false;
}
void CHistoryForm::OnMouseMove(UINT nFlags, CPoint point)
{
if(count<=0)return;
CRect rect;
this->GetClientRect(&rect);
CRect picrect(2,40,rect.Width()-2,rect.Height()-2);
if(picrect.PtInRect(point))
{
CString str1,str2;
if(oldx!=-1)
{
m_pDC->MoveTo(oldx,40);
m_pDC->LineTo(oldx,600);
m_pDC->BitBlt(oldtextx,60,100,50,&DCMEM,oldtextx-2,20,SRCCOPY);
}
oldx=point.x;
int pos;
pos=(oldx-2)*count/(rect.Width()-4);
COleDateTimeSpan dtspan;
if(pos<count)
{
dtspan.SetDateTimeSpan(pos/(24*60),pos%(24*60)/60,(pos%(24*60))%60,0);
COleDateTime dt;
dt=dtfrom+dtspan;
str1.Format("%s",dt.Format("%Y%m%d %H%M"));
str2.Format("%f",data[pos].value);
}
else
{
str1.Format("%d,%d",point.x,point.y);
str2="";
}
if(oldx>(picrect.right-102))oldtextx=oldx-102;
else oldtextx=oldx;
CRect rc(oldtextx,60,oldtextx+100,85);
CRect rc1(oldtextx,85,oldtextx+100,100);
m_pDC->DrawText(str1,-1,&rc,0);
m_pDC->DrawText(str2,-1,&rc1,0);
// m_ctlPoint.SetWindowText(str);
m_pDC->MoveTo(point.x,40);
m_pDC->LineTo(point.x,600);
}
TVisualFormView::OnMouseMove(nFlags, point);
}
void CHistoryForm::OnBtnSave()
{
this->UpdateData();
int rtid;
int sel;
if(data==NULL||count<1)
{
return;
}
sel=m_ctlRT.GetCurSel();
if(sel!=CB_ERR)
{
rtid=m_ctlRT.GetItemData(sel);
NPRT nprt;NPCD npcd;NPCS npcs;
for(int x=0;x<arrRT.GetSize();x++)
{
nprt=arrRT.GetAt(x);
if(nprt->rtid==rtid)break;
}
for(x=0;x<arrCD.GetSize();x++)
{
npcd=arrCD.GetAt(x);
if(npcd->cdid==nprt->cdid)break;
}
for(x=0;x<arrCS.GetSize();x++)
{
npcs=arrCS.GetAt(x);
if(npcs->csid==nprt->csid)break;
}
CString filename,buf;
filename="c:\\a.txt";
CFileDialog dlg( TRUE,_T("TXT"),_T("*.TXT"),
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
_T("文本文件 (*.TXT)|*.TXT|"));
if( dlg.DoModal()==IDOK )
{
CFile file;
filename=dlg.GetPathName();
file.Open(filename,CFile::modeWrite|CFile::modeCreate);
file.SetLength(0);
buf="測(cè)點(diǎn)名稱,參數(shù)名稱,日期時(shí)間,數(shù)據(jù)值,有效性";
buf+="\r\n";
file.Write(buf,buf.GetLength());
for(int i=0;i<count;i++)
{
buf=npcd->cdname+","+npcs->csname+",";
COleDateTimeSpan dtspan;
dtspan.SetDateTimeSpan(i/(24*60),i%(24*60)/60,(i%(24*60))%60,0);
COleDateTime dt;
dt=dtfrom+dtspan;
CString str;
str.Format("%s",dt.Format("%Y-%m-%d %H:%M"));
buf+=str+",";
str.Format("%f,%d",data[i].value,data[i].state);
buf+=str;
buf+="\r\n";
file.Write(buf,buf.GetLength());
}
file.Close();
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -