📄 showtxtfiledlg.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 + -