📄 recorder.cpp
字号:
// Recorder.cpp : implementation file
//
#include "stdafx.h"
#include "wgl_32.h"
#include "Recorder.h"
#include "ConfigRec.h"
#include <direct.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
const int RecordLimit = 3;
/////////////////////////////////////////////////////////////////////////////
// CRecorder dialog
CRecorder::CRecorder(CWnd* pParent /*=NULL*/)
: CDialog(CRecorder::IDD, pParent)
{
//{{AFX_DATA_INIT(CRecorder)
m_StrRecorderList = _T("");
//}}AFX_DATA_INIT
m_StrFileName = _T("wstation.daw");
RecordNum = 0;
}
void CRecorder::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CRecorder)
DDX_Control(pDX, IDC_RECORDER_LIST, m_RecorderList);
DDX_LBString(pDX, IDC_RECORDER_LIST, m_StrRecorderList);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CRecorder, CDialog)
//{{AFX_MSG_MAP(CRecorder)
ON_BN_CLICKED(IDC_ADD_RECORDER, OnAddRecorder)
ON_BN_CLICKED(IDC_DELETE_RECORDER, OnDeleteRecorder)
ON_BN_CLICKED(IDC_RECONFIG_RECORDER, OnReconfigRecorder)
ON_LBN_SELCHANGE(IDC_RECORDER_LIST, OnSelchangeRecorderList)
ON_LBN_SELCANCEL(IDC_RECORDER_LIST, OnSelcancelRecorderList)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRecorder message handlers
void CRecorder::OnAddRecorder()
{
// TODO: Add your control notification handler code here
CConfigRec MyConfigRec;
MyConfigRec.bCityEnable = TRUE;
MyConfigRec.bStationEnable = TRUE;
MyConfigRec.bRecordIDEnable = TRUE;
CString m_PathStr = ((CWgl_32App *)AfxGetApp())->m_PathStr;
/* if(RecordNum - RecordLimit >= 0)
{
AfxMessageBox("对不起,你只有三个站的建站权,\n请与软件供应商联系!");
return;
}*/
Start:
if(MyConfigRec.DoModal()==IDOK)
{
m_StrDataPath = MyConfigRec.m_StrDataPath;
m_StrCity = MyConfigRec.m_StrCity;
m_StrID = MyConfigRec.m_StrID;
m_StrName = MyConfigRec.m_StrName;
m_StrPhoneNumber = MyConfigRec.m_StrPhoneNumber;
m_StrStation = MyConfigRec.m_StrStation;
m_StrType = MyConfigRec.m_StrType;
if(m_StrDataPath.IsEmpty() ||
m_StrCity.IsEmpty() ||
m_StrID.IsEmpty() ||
m_StrName.IsEmpty() ||
m_StrPhoneNumber.IsEmpty() ||
m_StrStation.IsEmpty() ||
m_StrType.IsEmpty() )
{
AfxMessageBox("所有字段不能为空, 请重新输入!",MB_OK);
MyConfigRec.m_StrDataPath = m_StrDataPath;
MyConfigRec.m_StrCity = m_StrCity;
MyConfigRec.m_StrID = m_StrID;
MyConfigRec.m_StrName = m_StrName;
MyConfigRec.m_StrPhoneNumber = m_StrPhoneNumber;
MyConfigRec.m_StrStation = m_StrStation;
MyConfigRec.m_StrType = m_StrType;
goto Start;
}
else
{
_mkdir(m_PathStr + m_StrCity);
_mkdir(m_PathStr + m_StrCity + "\\" + m_StrStation);
_mkdir(m_PathStr + m_StrCity + "\\" + m_StrStation + "\\" + m_StrID);
fp = fopen(m_StrFileName, "r+b");
ReadHead(&Head);
Head.Number++;
WriteHead(&Head);
Record.RecordNo = Head.Number-1;
lstrcpy((char *)Record.RecordID, m_StrID);
lstrcpy((char *)Record.StationName, m_StrStation);
lstrcpy((char *)Record.CityName, m_StrCity);
lstrcpy((char *)Record.DataPath, m_StrDataPath);
lstrcpy((char *)Record.TeleNumber, m_StrPhoneNumber);
lstrcpy((char *)Record.Type, m_StrType);
lstrcpy((char *)Record.RecordName, m_StrName);
WriteARecord(Head.Number-1, &Record);
fclose(fp);
RecordNum++;
((CListBox *)GetDlgItem(IDC_RECORDER_LIST))->InsertString(-1, (char *)Record.RecordID);
}
}
}
void CRecorder::OnDeleteRecorder()
{
// TODO: Add your control notification handler code here
char SelStr[20];
int k = ((CListBox *)GetDlgItem(IDC_RECORDER_LIST))->GetCurSel();
((CListBox *)GetDlgItem(IDC_RECORDER_LIST))->GetText(k, SelStr);
if( lstrlen(SelStr) > 0 && k >=0)
{
if( AfxMessageBox("请确认删除本录波器吗?",MB_OKCANCEL) == IDOK)
{
DelARecord(k);
((CListBox *)GetDlgItem(IDC_RECORDER_LIST))->DeleteString(k);
if(RecordNum>0)RecordNum--;
}
}
}
void CRecorder::OnReconfigRecorder()
{
// TODO: Add your control notification handler code here
CConfigRec MyConfigRec;
MyConfigRec.bCityEnable = FALSE;
MyConfigRec.bStationEnable = FALSE;
MyConfigRec.bRecordIDEnable = FALSE;
CString m_PathStr = ((CWgl_32App *)AfxGetApp())->m_PathStr;
char SelStr[20];
int k = ((CListBox *)GetDlgItem(IDC_RECORDER_LIST))->GetCurSel();
((CListBox *)GetDlgItem(IDC_RECORDER_LIST))->GetText(k, SelStr);
if( lstrlen(SelStr) > 0 && k >=0)
{
fp = fopen(m_StrFileName, "r+b");
if(fp == NULL)
{
AfxMessageBox("录波器数据库不存在!", MB_OK);
return;
}
ReadARecord(k, &Record);
MyConfigRec.m_StrDataPath = Record.DataPath;
MyConfigRec.m_StrCity = Record.CityName;
MyConfigRec.m_StrID = Record.RecordID;
MyConfigRec.m_StrName = Record.RecordName;
MyConfigRec.m_StrPhoneNumber = Record.TeleNumber;
MyConfigRec.m_StrStation = Record.StationName;
MyConfigRec.m_StrType = Record.Type;
if(MyConfigRec.DoModal() == IDOK)
{
m_StrDataPath = MyConfigRec.m_StrDataPath;
m_StrCity = MyConfigRec.m_StrCity;
m_StrID = MyConfigRec.m_StrID;
m_StrName = MyConfigRec.m_StrName;
m_StrPhoneNumber = MyConfigRec.m_StrPhoneNumber;
m_StrStation = MyConfigRec.m_StrStation;
m_StrType = MyConfigRec.m_StrType;
//_mkdir(m_PathStr + m_StrCity);
//_mkdir(m_PathStr + m_StrCity + "\\" + m_StrStation);
//_mkdir(m_PathStr + m_StrCity + "\\" + m_StrStation + "\\" + m_StrID);
lstrcpy((char *)Record.RecordID, m_StrID);
lstrcpy((char *)Record.StationName, m_StrStation);
lstrcpy((char *)Record.CityName, m_StrCity);
lstrcpy((char *)Record.DataPath, m_StrDataPath);
lstrcpy((char *)Record.TeleNumber, m_StrPhoneNumber);
lstrcpy((char *)Record.Type, m_StrType);
lstrcpy((char *)Record.RecordName, m_StrName);
WriteARecord(k, &Record);
}
fclose(fp);
}
}
BOOL CRecorder::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
fp = fopen(m_StrFileName, "r+b");
if(fp == NULL)
{
if(AfxMessageBox("录波器数据库不存在,是否创建一个新的数据库?", MB_OKCANCEL) == IDOK)
{
fp = fopen(m_StrFileName, "wb");
Head.Flag = 0x30;
Head.Number = 0;
Head.HeadLength = sizeof(HEAD);
Head.RecordLength = sizeof(RECORD);
WriteHead(&Head);
fclose(fp);
}
else return FALSE;
}
else
{
fseek(fp, 0L, SEEK_SET);
fread(&Head, sizeof(HEAD), 1, fp);
for(UINT i=0; i< Head.Number; i++)
{
ReadARecord(i, &Record);
((CListBox *)GetDlgItem(IDC_RECORDER_LIST))->InsertString(-1, (char *)Record.RecordID);
// RecordNum ++ ;
// if(RecordNum - RecordLimit >= 0)
// break;
}
fclose(fp);
}
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
int CRecorder::ReadHead(HEAD *Head)
{
fseek(fp, 0L, SEEK_SET);
fread(Head, sizeof(HEAD), 1, fp);
return (1);
}
int CRecorder::WriteHead(HEAD *Head)
{
fseek(fp, 0L, SEEK_SET);
fwrite(Head, sizeof(HEAD), 1, fp);
return (1);
}
int CRecorder::ReadARecord(UINT No, RECORD *Record)
{
unsigned long offset = sizeof(HEAD) + No *sizeof(RECORD);
fseek(fp, offset, SEEK_SET);
fread(Record, sizeof(RECORD), 1 ,fp);
return (1);
}
RECORD* CRecorder::SearchARecord(CString m_strRecordID, RECORD *TempRecord )
{
HEAD TempHead;
fp = fopen(m_StrFileName, "rb");
if(fp == NULL)
{
AfxMessageBox(_T("打不开文件:") + m_StrFileName);
return (NULL);
}
fseek(fp, 0L, SEEK_SET);
fread(&TempHead, sizeof(HEAD), 1 ,fp);
UINT TotalSize = TempHead.Number;
UINT index =0;
unsigned long offset;
while(index < TotalSize)
{
offset = sizeof(HEAD) + index *sizeof(RECORD);
fread(TempRecord, sizeof(RECORD), 1 ,fp);
if(strcmp((char *)(TempRecord->RecordID), m_strRecordID)==0)
{fclose(fp); return (TempRecord);}
index++;
}
fclose(fp);
return NULL;
}
int CRecorder::WriteARecord(UINT No, RECORD *Record)
{
unsigned long offset = sizeof(HEAD) + No *sizeof(RECORD);
fseek(fp, offset, SEEK_SET);
fwrite(Record, sizeof(RECORD), 1 ,fp);
return (1);
}
int CRecorder::DelARecord(UINT No)
{
FILE *tempfp;
unsigned long offset;
fp = fopen(m_StrFileName, "r+b");
tempfp = fopen("temp.bak", "wb");
ReadHead(&Head);
if(Head.Number>0)Head.Number--;
else return(0);
fwrite(&Head, sizeof(HEAD), 1, tempfp);
for(UINT i=0; i<No; i++)
{
ReadARecord(i, &Record);
offset = sizeof(HEAD) + i*sizeof(RECORD);
fseek(tempfp, offset, SEEK_SET);
fwrite(&Record, sizeof(RECORD), 1, tempfp);
}
for(i=No; i<Head.Number; i++)
{
ReadARecord(i+1, &Record);
offset = sizeof(HEAD) + i*sizeof(RECORD);
fseek(tempfp, offset, SEEK_SET);
fwrite(&Record, sizeof(RECORD), 1, tempfp);
}
fclose(tempfp);
fclose(fp);
remove(m_StrFileName);
rename("temp.bak", m_StrFileName);
return (1);
}
void CRecorder::OnSelchangeRecorderList()
{
// TODO: Add your control notification handler code here
((CButton *)GetDlgItem(IDC_DELETE_RECORDER))->EnableWindow(TRUE);
((CButton *)GetDlgItem(IDC_RECONFIG_RECORDER))->EnableWindow(TRUE);
}
void CRecorder::OnSelcancelRecorderList()
{
// TODO: Add your control notification handler code here
((CButton *)GetDlgItem(IDC_DELETE_RECORDER))->EnableWindow(FALSE);
((CButton *)GetDlgItem(IDC_RECONFIG_RECORDER))->EnableWindow(FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -