MFC画文字DrawText,GetTextExtent,GetTextMetrics

// TextView.cpp : implementation of the CTextView class
//

#include "stdafx.h"
#include "Text.h"

#include "TextDoc.h"
#include "TextView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CTextView

IMPLEMENT_DYNCREATE(CTextView, CView)

BEGIN_MESSAGE_MAP(CTextView, CView)
	//{{AFX_MSG_MAP(CTextView)
	ON_WM_CREATE()
	ON_WM_CHAR()
	ON_WM_LBUTTONDBLCLK()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTextView construction/destruction

CTextView::CTextView()
{
	// TODO: add construction code here
	m_strLine="";
	m_ptStart=CPoint(0,0);	
	m_iWidth=0;
}

CTextView::~CTextView()
{
}

BOOL CTextView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CTextView drawing

void CTextView::OnDraw(CDC* pDC)
{
	CTextDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);	

	CString str("吴xxabc Hello World");
	pDC->TextOut(0,200,str);
}

/////////////////////////////////////////////////////////////////////////////
// CTextView printing

BOOL CTextView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CTextView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CTextView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CTextView diagnostics

#ifdef _DEBUG
void CTextView::AssertValid() const
{
	CView::AssertValid();
}

void CTextView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CTextDoc* CTextView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTextDoc)));
	return (CTextDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CTextView message handlers

int CTextView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	CClientDC dc(this);
	TEXTMETRIC metric;
	dc.GetTextMetrics(&metric);
	//CreateSolidCaret(metric.tmAveCharWidth,metric.tmHeight);
	m_bmpCaret.LoadBitmap(IDB_WU);
	CreateCaret(&m_bmpCaret);
	ShowCaret();	

	SetTimer(1,100,NULL);

	return 0;
}

void CTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	CFont font;
	font.CreatePointFont(300,"华文行楷",NULL);

	CClientDC dc(this);
	CFont *pOldFont = dc.SelectObject(&font);
	if(0x0d==nChar){			//Enter
		TEXTMETRIC mt;
		dc.GetTextMetrics(&mt);
		m_ptStart.y += mt.tmHeight;
		m_strLine.Empty();
	}
	else if(0x08 == nChar){		//BackSpace		
		COLORREF colorOld = dc.SetTextColor( dc.GetBkColor() );
		dc.TextOut(m_ptStart.x,m_ptStart.y,m_strLine);
		m_strLine=m_strLine.Left( m_strLine.GetLength()-1 );
		dc.SetTextColor(colorOld);
	}
	else{
		m_strLine+=nChar;
	}

	dc.TextOut(m_ptStart.x,m_ptStart.y,m_strLine);

	CSize sz = dc.GetTextExtent(m_strLine);
	
	SetCaretPos(CPoint(m_ptStart.x+sz.cx,m_ptStart.y));
	dc.SelectObject( pOldFont );
	CView::OnChar(nChar, nRepCnt, nFlags);
}

void CTextView::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	SetCaretPos( m_ptStart=point );
	m_strLine.Empty();
	CView::OnLButtonDblClk(nFlags, point);
}

void CTextView::OnTimer(UINT nIDEvent) 
{
	if(nIDEvent==1){
		m_iWidth+=5;
		CClientDC dc(this);
		CString str("吴XXabc Hello World");
		CSize sz = dc.GetTextExtent(str);

		CRect rect(0,200,m_iWidth,200+sz.cy);
		dc.SetTextColor(RGB(0xff,0,0));
		dc.DrawText(str,&rect,DT_LEFT);
	}
	CView::OnTimer(nIDEvent);
}

原文地址:https://www.cnblogs.com/wucg/p/1949497.html