⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 简易编程器doc.cpp

📁 涉及到SkinMagicLiB等多种界面开发库的应用
💻 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 + -