📄 readerview.cpp
字号:
// ReaderView.cpp : implementation of the CReaderView class
//
#include "stdafx.h"
#include "Reader.h"
#include "ReaderDoc.h"
#include "ReaderView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CReaderView
IMPLEMENT_DYNCREATE(CReaderView, CScrollView)
BEGIN_MESSAGE_MAP(CReaderView, CScrollView)
//{{AFX_MSG_MAP(CReaderView)
ON_WM_SETCURSOR()
ON_WM_VSCROLL()
ON_WM_SIZE()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CReaderView construction/destruction
CReaderView::CReaderView()
{
MARGIN=5;
bSized=FALSE;
nSizedPos=0;
}
CReaderView::~CReaderView()
{
}
BOOL CReaderView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CReaderView drawing
void CReaderView::OnDraw(CDC* pDC)
{
CReaderDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
DrawText(0,0);
}
/////////////////////////////////////////////////////////////////////////////
// CReaderView printing
BOOL CReaderView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CReaderView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CReaderView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CReaderView diagnostics
#ifdef _DEBUG
void CReaderView::AssertValid() const
{
CScrollView::AssertValid();
}
void CReaderView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CReaderDoc* CReaderView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CReaderDoc)));
return (CReaderDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CReaderView message handlers
BOOL CReaderView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if (nHitTest == HTCLIENT && pWnd == this) {
::SetCursor(::LoadCursor(NULL, IDC_IBEAM));
return TRUE;
}
return CScrollView::OnSetCursor(pWnd, nHitTest, message);
}
void CReaderView::DrawText(int x,int y)
{
//return if font has not yet been created;
CReaderDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CClientDC dc(this);
OnPrepareDC(&dc);
if(!pDoc->GetTextLength())
return;
int LineHeight;
TEXTMETRIC TM;
int Y=0;
//obtain text metrics;
dc.GetTextMetrics(&TM);
LineHeight=TM.tmHeight+TM.tmExternalLeading;
//set test attributes;
dc.SetBkMode(TRANSPARENT);
//dispay text lines;
for(int Line=0;Line<pDoc->GetLineNumber();Line++)
{
Y+=LineHeight;
CString strTemp=pDoc->strLine[Line];
dc.TextOut(x+MARGIN,Y-LineHeight,strTemp,strTemp.GetLength());
}
}
void CReaderView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
CScrollView::OnUpdate(pSender,lHint,pHint);
CReaderDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CClientDC dc(this);
int LineWidth=0;
CSize Size;
TEXTMETRIC TM;
dc.GetTextMetrics(&TM);
for(int Line=0;Line<pDoc->GetLineNumber();Line++)
{
Size=dc.GetTextExtent(pDoc->strLine[Line],pDoc->strLine[Line].GetLength());
if(Size.cx>LineWidth)
LineWidth=Size.cx;
}
Size.cx=LineWidth+MARGIN;
Size.cy=(TM.tmHeight+TM.tmExternalLeading)*(pDoc->GetLineNumber()+1)+MARGIN;
CSize step;
step=sizeDefault;
step.cy=(TM.tmHeight+TM.tmExternalLeading);
SetScrollSizes(MM_TEXT,Size,sizeDefault,step);
}
void CReaderView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
}
void CReaderView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
CReaderDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(pDoc->GetLineNumber()<10)
{
CScrollView::OnVScroll(nSBCode, (int)nPos, pScrollBar);
return;
}
CClientDC dc(this);
OnPrepareDC(&dc);
TEXTMETRIC TM;
dc.GetTextMetrics(&TM);
SCROLLINFO ScrollInfo;
BOOL bGetInfo=GetScrollInfo(SB_VERT,&ScrollInfo,SIF_ALL);
//如果仅仅在OnUpdate()函数中加入如下语句是不够的:
//SetScrollSizes(MM_TEXT,Size,sizeDefault,step);
//当显示小文本(本例中当行数<2048时)尚可;
//当显示大文本时,则仅仅显示其中一部分。
//最多可显示2048行,原因何在?
//仔细一查,发现原来是CWnd::OnVScroll的缺省
//实现是16 bit 的。必须手工将其转换到32 bit.
//以下两句代码可解决:
ScrollInfo.nMax=(TM.tmHeight+TM.tmExternalLeading)*(pDoc->GetLineNumber()+1)+MARGIN;
if(bSized)
{
//对于大文本文档,当前滚动位置>0x7fff时,
//此时如果改变文档尺寸(响应OnSize消息),
//比如最大最小化窗口时,会发现当前滚动位置在文
//档尺寸变化前后不一致。即文档尺寸变化后的当前
//滚动位置总是小于0x7fff位。以下代码用于解决此问题。
ScrollInfo.nTrackPos=nSizedPos;
ScrollInfo.nPos=nSizedPos;
bSized=FALSE;
}
SetScrollInfo(SB_VERT,&ScrollInfo,SIF_ALL);
//下面一行代码也很重要,因为nTrackPos
//返回SB_THUMBTRACK消息带来的临时位置
//你可以不加,然后试一试拖动滚动条,
//当向下拖过的位置大于0x7fff(32767)时
//(显然是大文件),此时发现UINT 的变量
//nPos在作怪了!
nPos=ScrollInfo.nTrackPos;
//别忘了再强制转换一下!
CScrollView::OnVScroll(nSBCode, (int)nPos, pScrollBar);
}
void CReaderView::OnSize(UINT nType, int cx, int cy)
{
nSizedPos=GetScrollPos(SB_VERT);
bSized=TRUE;
PostMessage(WM_VSCROLL);
CScrollView::OnSize(nType, cx, cy);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -