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

📄 showtxtfiledlg.cpp

📁 一个windows ce上的notepad
💻 CPP
字号:
// ShowTxtFileDlg.cpp : implementation file
//

#include "stdafx.h"
#include "UITemplate.h"
#include "ShowTxtFileDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define EXIT_READ 0
#define NEXT_PAGE 1
#define PRE_PAGE  2
/////////////////////////////////////////////////////////////////////////////
// CShowTxtFileDlg dialog


const DWORD FILE_UNIT_SIZE = 3*1024;


CShowTxtFileDlg::CShowTxtFileDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CShowTxtFileDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CShowTxtFileDlg)
	m_strEdit = _T("");
	strFileData = new CString();


	//}}AFX_DATA_INIT
}

CShowTxtFileDlg::~CShowTxtFileDlg()
{
	if(strFileData !=NULL)
	{	delete strFileData;
		strFileData=NULL;
	}
	CloseHandle(m_hAsciiFile);
	m_hAsciiFile = INVALID_HANDLE_VALUE;
}
void CShowTxtFileDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CShowTxtFileDlg)
	DDX_Control(pDX, IDC_SHOW_DATA, m_EditCtrl);
	DDX_Text(pDX, IDC_SHOW_DATA, m_strEdit);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CShowTxtFileDlg, CDialog)
	//{{AFX_MSG_MAP(CShowTxtFileDlg)
	ON_WM_CTLCOLOR()
	ON_WM_PAINT()
	ON_WM_LBUTTONDOWN()
	ON_WM_KEYUP()
	ON_WM_KEYDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CShowTxtFileDlg message handlers

HBRUSH CShowTxtFileDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr;
	hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	if(pWnd->GetDlgCtrlID() == IDC_SHOW_DATA)
	{
		pDC->SetBkColor(RGB(255,255,255));
		pDC->SetTextColor(RGB(0,0,0));
		hbr = (HBRUSH)::GetStockObject(WHITE_BRUSH);
	}
	return hbr;
}

void CShowTxtFileDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
//	if(!m_bFirstDraw)
//	{
/*	CRect EdgeRect(0,0,350,12);
		CBrush brush;
		brush.CreateSolidBrush(RGB(255,255,255));
		dc.FillRect( &EdgeRect, &brush);*/
		for(int i=0; i<m_nBtnCount; i++)
			this->DrawBmpButton(i);
		m_bFirstDraw = true;
//	}
	
	// Do not call CDialog::OnPaint() for painting messages
}

void CShowTxtFileDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	int idCurIndex = GetCurPressBtnID(point);
	WIDGET_NODE wn;
	if(idCurIndex != -1 ) //有按钮按下
	{
		if(m_nPreBtnIndex != -2 && idCurIndex != m_nPreBtnIndex)
		{
			wn = m_WidgetNode.GetAt(m_nPreBtnIndex);
			if(wn.nCurState == 0)
			{
				wn.nCurState = 1;
				m_WidgetNode.SetAt(m_nPreBtnIndex,wn);
				DrawBmpButton(m_nPreBtnIndex);
			}
		}
		wn = m_WidgetNode.GetAt(idCurIndex);
		if(wn.nCurState == 1)
		{
			wn.nCurState = 0;
			m_WidgetNode.SetAt(idCurIndex,wn);
			DrawBmpButton(idCurIndex);
		}
		m_nPreBtnIndex = idCurIndex;
		switch(m_WidgetNode.GetAt(idCurIndex).nBtnID)
		{
			case EXIT_READ:
				 EndDialog(0);
				 break;
			case NEXT_PAGE:
				 NextPage();
				 break;
			case PRE_PAGE:
				 PrePage();
				 break;
			default:
				break;
		}
	}
	else
	{
		if(m_nPreBtnIndex != -2 )
		{
			wn = m_WidgetNode.GetAt(m_nPreBtnIndex);
			wn.nCurState = 1;
			m_WidgetNode.SetAt(m_nPreBtnIndex,wn);
			
			DrawBmpButton(m_nPreBtnIndex);
		}
	}

	CDialog::OnLButtonDown(nFlags, point);
}






///////////////////////////////////////////////////////////////
void CShowTxtFileDlg::NextPage()
{
//	int nLines = m_EditCtrl.GetLineCount();
//	if(nLines <= 0)
//		return ;
	if(m_nCurFilePart >= 0)
	{
		if(m_nCurPage < m_BlockNode.GetAt(m_nCurFilePart).nPageCount )
		{
			m_nCurPage++;
			m_EditCtrl.LineScroll(12,0);
			
		}
		else //看有没有下一块数据
		{
		//	AfxMessageBox(_T("获取下一块数据。"));
			if(GetNextBlock() != NULL) //文件中还有下一块数据
			{
				//UpdateData(false);
				m_nCurPage = 0;
			}
		}
	}
/*	CString ss;
	ss.Format(_T("当前块%d 当前总页数%d 当前页%d"),m_nCurFilePart,
		m_BlockNode.GetAt(m_nCurFilePart).nPageCount, m_nCurPage);
	this->m_staPageInfo.SetWindowText(ss);
	UpdateData(false);
	if(nLines>m_nCurPage*8)
	{
		m_EditCtrl.LineScroll(8,0);
	}
	else
		m_EditCtrl.LineScroll(nLines-m_nCurPage*8,0);
		
	m_nCurPage++;
	CString str;
	str.Format(_T("总页数 %d   当前第 %d 页"),m_nPageCount,m_nCurPage+1);
	this->m_staPageInfo.SetWindowText(str);
	int nFirstVisible = m_EditCtrl.GetFirstVisibleLine();
	CString s;
	s.Format(_T("first visible line:%d"),nFirstVisible);
	AfxMessageBox(s);
	if (nFirstVisible > 0)
	{
	  m_EditCtrl.LineScroll(-nFirstVisible, 0);
	}
	*/
}

void CShowTxtFileDlg::PrePage() //只涉及到对当前页变量的操作,而不对当前数据块进行操作
{
	if(m_nCurPage > 0 )
	{
		m_EditCtrl.LineScroll(-12,0);
		m_nCurPage--;
	}
	else
	{
		if(GetPreBlock() != NULL)
		{
			int LinesScroll;
			m_nCurPage=(m_BlockNode.GetAt(m_nCurFilePart)).nPageCount;
			LinesScroll = m_nCurPage*12;
			UpdateData(false);
			m_EditCtrl.LineScroll(LinesScroll,0);
		}
	}
}


CString *CShowTxtFileDlg::ReadTextFile(CString sFilePathName,DWORD nStartPos, DWORD size,DWORD &dwReadSize)
{
    DWORD   dwBytesWritten = 0, dwFileSize;
    TCHAR*  pszUnicodeBuff;
    CHAR*   pszFileBuff = 0;
 //   HANDLE  hAsciiFile;


    LPOPENFILENAME lpof = NULL;
/*	hAsciiFile = CreateFile( sFilePathName,
							 GENERIC_READ ,
							 FILE_SHARE_READ,
							 NULL, 
							 OPEN_EXISTING, 
							 FILE_ATTRIBUTE_NORMAL,
							 NULL);*/
	dwFileSize = GetFileSize( m_hAsciiFile, NULL );

	//不在本这里设置当前读取的数据为第几部分
	pszFileBuff = (char*)LocalAlloc( LPTR, dwFileSize );
	if( !pszFileBuff )
		return	NULL;
	if(m_nCurFilePart == -1)
		m_dwFileSize = dwFileSize;

	DWORD TempReadSize;
	if(dwFileSize - nStartPos < size)
		TempReadSize = dwFileSize - nStartPos;
	else
		TempReadSize = size;
	SetFilePointer(m_hAsciiFile, nStartPos,NULL, FILE_BEGIN);
	ReadFile( m_hAsciiFile,(LPVOID)pszFileBuff, TempReadSize, &dwBytesWritten, NULL);
	if(dwBytesWritten <= 0)
		return NULL;
	dwReadSize = dwBytesWritten;
	pszUnicodeBuff = (TCHAR*)LocalAlloc( LPTR, sizeof(TCHAR) * ( dwFileSize + 1 ));
	mbstowcs( pszUnicodeBuff, (const char *)pszFileBuff, (size_t)strlen(pszFileBuff) );
//	CString *strFileData = new CString();
	strFileData->Format(_T("%s"),pszUnicodeBuff);

	LocalFree(pszUnicodeBuff);
	LocalFree(pszFileBuff);
//	CloseHandle(hAsciiFile);
	return strFileData;
}

bool CShowTxtFileDlg::HasNextBlock()
{
	return m_bHasNextBlock;
}

//计算下一个文件结点的分块信息、
BLOCK_INFO CShowTxtFileDlg::CurBlockInfo(bool bLastBlock)
{
	BLOCK_INFO pbi;
	long len = m_strEdit.GetLength();
	int CharSize,nPageCnt;
	int LineCount = this->m_EditCtrl.GetLineCount();
	nPageCnt = LineCount/12;
	if(LineCount%12 != 0) //行数不是为12的整数倍
	{
		pbi.nPageCount = nPageCnt - 1;
		CharSize = m_EditCtrl.LineIndex(nPageCnt*12);
		if(bLastBlock) //在最后一页添加回车符
		{
			int AddLinesCount = 12 - LineCount%12;//必须添加的回车符个数
			for(int i=0;i<AddLinesCount;i++)
				m_strEdit += _T("\r\n");
		}
	}
	else
	{
		pbi.nPageCount =  nPageCnt - 2;
		CharSize = len;
	}
	if(bLastBlock)
		pbi.nPageCount += 1;
	UpdateData(false);
	
/*	//////////
	CString st;
	st.Format(_T("index=%d"),index);
	AfxMessageBox(st);
	//////////
	*/
	if(m_nCurFilePart == 0) 
	{
		pbi.lStartPos = 0;
	}
	else
	{
		pbi.lStartPos = m_BlockNode.GetAt(m_nCurFilePart-1).lStartPos
			+m_BlockNode.GetAt(m_nCurFilePart-1).lSize + 1;
	}

	if(bLastBlock) 
	{
		pbi.lSize = len;
	}
	else
	{
		pbi.lSize = CharSize;
	}
	return pbi;

//	CString ss;
//	ss.Format(_T("StartPos=%lu"),pbi.lStartPos);
//	AfxMessageBox(ss);
	
}

//获取下一个显示数据块
CString * CShowTxtFileDlg::GetNextBlock()
{
//	long StartPos = (m_BlockNode.GetAt(m_nCurFilePart)).lStartPos;
	CString *ptr;
	DWORD dwFileSize;
	DWORD dwReadSize;
	if(m_bPartCountFinished && m_nCurFilePart == m_nFilePartCount)
		return NULL;
	else
	{
		DWORD StartPos;
		if(m_nCurFilePart == -1)
			StartPos = 0;
		else
			StartPos = (m_BlockNode.GetAt(m_nCurFilePart)).lStartPos
					+(m_BlockNode.GetAt(m_nCurFilePart)).lSize+1;
		ptr = ReadTextFile(m_sFilePathName,StartPos,FILE_UNIT_SIZE,dwReadSize);
	//	DWORD dwLeftSize = m_dwFileSize - StartPos; //未读部分文件大小
		if(ptr != NULL && dwReadSize > 0 )
		{
			m_nCurFilePart++;
			m_strEdit = *ptr;
			UpdateData(false);
			if(!m_bPartCountFinished && m_nFilePartCount+1 == m_nCurFilePart) //本块读取的为一个新块,要增加一个新的数据块信息结点
			{
				m_nFilePartCount++;
				BLOCK_INFO b_i;
				if( dwReadSize+StartPos >= m_dwFileSize )
				{
					m_bPartCountFinished = true;
					b_i = CurBlockInfo(true);
				}
				else
					b_i = CurBlockInfo(false);
				m_BlockNode.Add(b_i);
			}
		}
	}
}

CString * CShowTxtFileDlg::GetPreBlock()
{
	if(m_nCurFilePart-1 < 0)
		return NULL;
	CString *pstr;
	long lPos = m_BlockNode.GetAt(m_nCurFilePart-1).lStartPos;
	long lSize = m_BlockNode.GetAt(m_nCurFilePart-1).lSize;
	DWORD dwReadSize;
	pstr = ReadTextFile(m_sFilePathName,lPos,lSize,dwReadSize);
	if(pstr != NULL)
	{
		m_strEdit = *pstr;
		m_nCurFilePart--;
		return pstr;
	}
	else
		return NULL;
}

void CShowTxtFileDlg::SetFilePath(CString sFilePathName)
{
	this->m_sFilePathName = sFilePathName;
    DWORD   dwBytesWritten = 0, dwFileSize;

    LPOPENFILENAME lpof = NULL;
	m_hAsciiFile = CreateFile( sFilePathName,
							 GENERIC_READ ,
							 FILE_SHARE_READ,
							 NULL, 
							 OPEN_EXISTING, 
							 FILE_ATTRIBUTE_NORMAL,
							 NULL);
	dwFileSize = GetFileSize( m_hAsciiFile, NULL );
	m_dwFileSize =dwFileSize;
}


void CShowTxtFileDlg::DrawBmpButton(int BtnIndex)
{
	CRect rc = m_WidgetNode.GetAt(BtnIndex).rect;
	int State = m_WidgetNode.GetAt(BtnIndex).nCurState;
	int SrcBmpID;
	if(State == 0)
		SrcBmpID = m_WidgetNode.GetAt(BtnIndex).nDownBitmapID;
	else
		SrcBmpID = m_WidgetNode.GetAt(BtnIndex).nUpBitmapId;
	CDC *pDC = GetDC();
	CDC ImageDc;
	CBitmap image,*pOldImg;
	image.LoadBitmap(SrcBmpID);
	ImageDc.CreateCompatibleDC(pDC);
	pOldImg=ImageDc.SelectObject(&image); 
	pDC->BitBlt(rc.left,rc.top,rc.Width(),rc.Height(),&ImageDc,0, 0,SRCCOPY);
	ImageDc.SelectObject(pOldImg); 	
	ImageDc.DeleteDC();
	ReleaseDC(pDC);

}

int CShowTxtFileDlg::GetCurPressBtnID(CPoint pt)
{
	int IDindex=-1;
	for(int i=0;i<m_nBtnCount;i++)
	{
		if(m_WidgetNode.GetAt(i).rect.PtInRect(pt))
		{
		//	btnID = m_WidgetNode.GetAt(i).nBtnID;
			IDindex = i;
			break;
		}
	}
	return IDindex;
}


void CShowTxtFileDlg::AddBmpButton(int BtnID, CRect rc, int UpBmpID, int DownBmpID)
{
	WIDGET_NODE wn;
	wn.rect = rc;
	wn.nBtnID = BtnID;
	wn.nCurState = 1;
	wn.nDownBitmapID = DownBmpID;
	wn.nUpBitmapId = UpBmpID;
	m_WidgetNode.Add(wn);
	m_nBtnCount++;
}


BOOL CShowTxtFileDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();

//	CRect rc;
//	GetClientRect(&rc);

	
	this->m_EditCtrl.MoveWindow(1,6,319,210,true);
	MoveWindow(CRect(1,0,319,240),true);
	
	m_EditCtrl.SetLimitText(FILE_UNIT_SIZE);//每次读取的数据为预设的文件块大小
 //	m_EditCtrl.SetMargins(8,6);
 	m_nCurPage = 0;
 	m_nPageCount = 0;
	m_nFilePartCount = -1;
 	m_nCurFilePart = -1;
 	m_bPartCountFinished = false;
 	m_dwFileSize = 0;
 	m_nBtnCount = 0;
 	m_bFirstDraw = false;
 	m_nPreBtnIndex = -2;

 	//往窗口上添加图片按钮
 	this->AddBmpButton(EXIT_READ,CRect(0,217,109,240),IDB_RETURN_UP, IDB_RETURN_DOWN);//退出
 	this->AddBmpButton(PRE_PAGE,CRect(110,217,220,240), IDB_PRE_PAGE_UP  ,IDB_PRE_PAGE_DOWN);//上一页
 	this->AddBmpButton(NEXT_PAGE,CRect(221,217,320,240),IDB_NEXT_PAGE_UP, IDB_NEXT_PAGE_DOWN);//下一页
 



 	this->GetNextBlock();//获取第一块数据
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CShowTxtFileDlg::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	if(nChar==195)
	{
			AfxGetMainWnd()->PostMessage(WM_CLOSE, 0, 0);
	}		
	CDialog::OnKeyUp(nChar, nRepCnt, nFlags);
}

void CShowTxtFileDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	
	CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -