#include "stdafx.h"
#include "chapter5.h"
#include "chapter5Doc.h"
#include "chapter5View.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/
// CChapter5View
IMPLEMENT_DYNCREATE(CChapter5View, CView)
BEGIN_MESSAGE_MAP(CChapter5View, CView)
//{{AFX_MSG_MAP(CChapter5View)
ON_WM_CREATE()
ON_WM_CHAR()
ON_WM_LBUTTONDOWN()
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()
/
// CChapter5View construction/destruction
CChapter5View::CChapter5View()
{
// TODO: add construction code here
m_strLine = "";
m_ptOrigin = 0;
m_nWidth = 0;
}
CChapter5View::~CChapter5View()
{
}
BOOL CChapter5View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/
// CChapter5View drawing
// 实现字符串的输出
void CChapter5View::OnDraw(CDC* pDC)
{
CChapter5Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//当这个函数被调用时,应用框架会构造一个CDC类对象指针并传递给这个函数,这给我们
//提供了方便,在这个函数内部就不需要再去调用CDC类的对象,可以直接使用传递过来的
//CDC对象指针去调用CDC类的成员函数,完成绘制的功能
// 1 创建一个字符串
CString str("MFC");
// 2 显示一个字符串
pDC->TextOut(50,100,str);
// 3 得到一个字符串的信息
// GetTextMetrics函数得到的是社别描述表中当前字体的度量信息
// GetTextExtent函数得到的是某个特定字符串在窗口中显示时所占据的宽度和高度
CSize sz = pDC->GetTextExtent(str);
// 从string table中加载字符串
str.LoadString(IDS_STRING61446);
pDC->TextOut(50,150,str);
// 创建路径层是利用CDC类提供的BeginPath和EndPath这两个函数实现的
//首先利用前者在设备描述表中打开一个路径层,然后完成设备接口提供的绘图函数进行绘图操作
// 最后在绘图操作完成之后,应用程序通过调用EndPath函数关闭这个路径层
pDC->BeginPath();
pDC->Rectangle(50,100,50+sz.cx,100+sz.cy);
pDC->EndPath();
//该函数的作用是把当前设置的路径层和设备描述表已有的裁剪区域按照
//一种指定的模式进行一个操作
pDC->SelectClipPath(RGN_DIFF);
for (int i = 0;i <= 300; i+=10)
{
pDC->MoveTo(0,i);
pDC->LineTo(300,i);
//画横线
pDC->MoveTo(i,0);
pDC->LineTo(i,300);
// 画竖线
}
}
/
// CChapter5View printing
BOOL CChapter5View::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CChapter5View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CChapter5View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/
// CChapter5View diagnostics
#ifdef _DEBUG
void CChapter5View::AssertValid() const
{
CView::AssertValid();
}
void CChapter5View::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CChapter5Doc* CChapter5View::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CChapter5Doc)));
return (CChapter5Doc*)m_pDocument;
}
#endif //_DEBUG
/
// CChapter5View message handlers
int CChapter5View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
/*
// 创建一个插入符
// 1 创建一个设备描述表
CClientDC dc(this);
// 2 定义一个文本信息结构体变量
TEXTMETRIC tm;
// 3 获得设备描述表中的文本信息
dc.GetTextMetrics(&tm);
// 4 根据字体的大小,创建合适的插入符
CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
// 5 显示插入符
ShowCaret();
*/
// 创建一个位图插入符
// 1 创建一个位图资源,注意其中可以用全局变量和静态成员变量
//了解静态成员变量的含义以及在此处用到的含义
static CBitmap m_bitmap;
// 2 下载位图资源
m_bitmap.LoadBitmap(IDB_BITMAP1);
//创建位图插入符
CreateCaret(&m_bitmap);
//显示插入符
ShowCaret();
SetTimer(1,100,NULL);
return 0;
}
void CChapter5View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
CFont font;
//设置相关的字体信息
font.CreatePointFont(300,"华文行楷",NULL);
CFont* pOldFont = dc.SelectObject(&font);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
if(0x0d == nChar)
{
m_strLine.Empty();
m_ptOrigin.y += tm.tmHeight;
}
else if (0x08 == nChar)
{
COLORREF clr = dc.SetTextColor(dc.GetBkColor());
//获得背景颜色,并且设置文本的颜色
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
//GetLength函数可以得到字符串中字符的个数
//Left(int nCount)函数实现返回字符串左边指定数目的字符
m_strLine = m_strLine.Left(m_strLine.GetLength()-1);
dc.SetTextColor(clr);
}
else
{
m_strLine += nChar;
}
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strLine);
CSize sz = dc.GetTextExtent(m_strLine);
CPoint pt;
pt.x = m_ptOrigin.x + sz.cx + tm.tmAveCharWidth;
pt.y = m_ptOrigin.y;
SetCaretPos(pt);
dc.SelectObject(pOldFont);
CView::OnChar(nChar, nRepCnt, nFlags);
}
void CChapter5View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
SetCaretPos(point);
//清空字符串
m_strLine.Empty();
m_ptOrigin = point;
CView::OnLButtonDown(nFlags, point);
}
//滑动显示
void CChapter5View::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
m_nWidth +=5;
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
CRect rect;
rect.left = 0;
rect.top = 200;
rect.right = m_nWidth;
rect.bottom = rect.top + tm.tmHeight;
dc.SetTextColor(RGB(255,0,0));
CString str;
str.LoadString(IDS_STRING61447);
dc.DrawText(str,rect,DT_LEFT);
CSize sz = dc.GetTextExtent(str);
if(m_nWidth>sz.cx)
{
m_nWidth = 0;
dc.SetTextColor(RGB(0,255,0));
dc.TextOut(0,200,str);
}
CView::OnTimer(nIDEvent);
}