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

📄 readerview.cpp

📁 在GB码和Big5码间转换,在GB码和Big5码间转换
💻 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 + -