?? 簡易編程器doc.cpp
字號:
// 簡易編程器Doc.cpp : implementation of the CMyDoc class
//
#include "stdafx.h"
#include "簡易編程器.h"
#include "MainFrm.h"
#include "簡易編程器Doc.h"
#include "HexEditView.h"
#include "stdlib.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
const DWORD dwBufSize = 65535;
extern CMainFrame* pMainFrame;
IMPLEMENT_DYNCREATE(CMyDoc, CDocument)
BEGIN_MESSAGE_MAP(CMyDoc, CDocument)
//{{AFX_MSG_MAP(CMyDoc)
ON_COMMAND(ID_FILE_SAVE, OnFileSave)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyDoc construction/destruction
CMyDoc::CMyDoc()
{
// TODO: add one-time construction code here
pcBuf = NULL;
pcBuf = new char[dwBufSize];
}
CMyDoc::~CMyDoc()
{
}
BOOL CMyDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
for(unsigned int i=0;i<dwBufSize;i++)
pcBuf[i]=0;
((CHexEditView *)m_viewList.GetHead())->SetText(pcBuf, dwBufSize);
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CMyDoc serialization
void CMyDoc::Serialize(CArchive& ar)
{
}
/////////////////////////////////////////////////////////////////////////////
// CMyDoc diagnostics
#ifdef _DEBUG
void CMyDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CMyDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMyDoc commands
BOOL CMyDoc::HexToBin(char *tmp,char *buf,ULONG &size)
{
char dat[5]="",*p;
char var,v;
UINT addess,len,type,i;
p=tmp+1;
if(tmp[0]!=':') return false;
memcpy(dat,p,2);dat[2]=0;
len=strtol(dat,NULL,16);
p+=2;
memcpy(dat,p,4);dat[4]=0;
addess=strtol(dat,NULL,16);
if(addess>65534)return false;
p+=4;
if(size<addess+len)size=addess+len;
memcpy(dat,p,2);dat[2]=0;
type=strtol(dat,NULL,16);
p+=2;i=0;
switch(type)
{
case 0:
{
var=0;
while(strlen(p)>2||i>len)
{
memcpy(dat,p,2);dat[3]=0;
v=(UCHAR)strtol(dat,NULL,16);
buf[addess++]=v;
p+=2;i++;
var+=v;
}
memcpy(dat,p-2,2);dat[2]=0;
v=(UCHAR)strtol(dat,NULL,16);
//if(var+v!=0){ar.Close; return false;}
break;
}
case 1:
case 2:
case 3:
case 4:
case 5:
{
AfxMessageBox("文件中存在不支持的格式! ");
return false;
}
}
return true;
}
BOOL CMyDoc::OnSaveDocument(LPCTSTR lpszPathName)
{
HANDLE hFile = NULL;
hFile = ::CreateFile(lpszPathName, GENERIC_WRITE, FILE_SHARE_READ, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (hFile == INVALID_HANDLE_VALUE)
return FALSE;
DWORD dwCurSize;
if (! ::WriteFile(hFile, pcBuf, ((CHexEditView *)m_viewList.GetHead())->m_CharCount, &dwCurSize, NULL))
return FALSE;
CloseHandle(hFile);
return TRUE;
}
void CMyDoc::OnCloseDocument()
{
if(pcBuf != NULL)
delete[] pcBuf;
CString s;
s=GetPathName();
s="關閉文件:"+s;
CDocument::OnCloseDocument();
pMainFrame->m_wndMyBars.AppendText(s);
}
BOOL CMyDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;
char tmp[dwBufSize];
CFile file;
CString s;
char ext[10];
m_pSize=0;
if(!file.Open(lpszPathName,CFile::modeRead))return false;
s=file.GetFilePath();
_splitpath(s,NULL,NULL,NULL,ext);
s=ext;
s.MakeUpper();
memset(pcBuf,0,dwBufSize);
if(s==".HEX")
{
CArchive ar( &file, CArchive::load );
while(1)
{
ar.ReadString(tmp,65534);
if(!strcmp(tmp,":00000001FF"))break;
if(!HexToBin(tmp,pcBuf,m_pSize))
{
AfxMessageBox("文件打開錯誤! ");
m_pSize=0;
memset(pcBuf,0,dwBufSize);
ar.Close();
file.Close();
return false;
}
}
ar.Close();
}
else
{
m_pSize=file.GetLength();
file.Read(pcBuf,m_pSize);
}
file.Close();
((CHexEditView *)m_viewList.GetHead())->SetText(pcBuf,m_pSize);
s.Format("打開文件:%s",lpszPathName);
pMainFrame->m_wndMyBars.AppendText(s);
return TRUE;
}
void CMyDoc::OnFileSave()
{
CFile file;
CString lpszPathName=GetPathName();
if(lpszPathName=="")
{
CString s;
s="二進制文件 *.BIN|*.BIN|所有文件|*.*||";
CFileDialog m_FileDlg(FALSE,"bin",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,s);
if(m_FileDlg.DoModal()==IDOK)
lpszPathName=m_FileDlg.GetFileName();
else return;
}
CString lpszPathNameNew=lpszPathName.Left(lpszPathName.GetLength()-4);
lpszPathNameNew+=".Bin";
file.Open(lpszPathNameNew,CFile::modeCreate|CFile::modeWrite);
file.Write(pcBuf,m_pSize);
file.Close();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -