在View中,三个消息事件:

BEGIN_MESSAGE_MAP(CMFCApplication1View, CView)

// 标准打印命令

ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)

ON_WM_CREATE() // 1

ON_WM_LBUTTONDOWN() // 2

ON_WM_CHAR() // 3

END_MESSAGE_MAP()

OnCreate:

int CMFCApplication1View::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (CView::OnCreate(lpCreateStruct) == -1)

return -1;

// 获取字体信息

CClientDC dc(this);

TEXTMETRIC tm; // 字体信息结构体

dc.GetTextMetrics(&tm);

// 继承于CWnd

CreateSolidCaret(tm.tmAveCharWidth / 8, tm.tmHeight); // 创建插入符

ShowCaret(); // 显示

return 0;

}

OnLButtonDown:

void CMFCApplication1View::OnLButtonDown(UINT nFlags, CPoint point)

{

SetCaretPos(point); // 移动插入符

// 保存点击坐标

m_point = point;

m_str = TEXT("");

m_str.Empty();

CView::OnLButtonDown(nFlags, point);

}

OnChar:

void CMFCApplication1View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

CClientDC dc(this);

if (nChar == VK_RETURN) // 换行

{

m_str.Empty(); // 换行清空

TEXTMETRIC tm; // 字体信息结构体

dc.GetTextMetrics(&tm);

m_point.y = m_point.y + tm.tmHeight;

}

else if (nChar == VK_BACK) // 退格

{

COLORREF color = dc.GetBkColor();// 获取背景颜色

// 设置字体颜色

COLORREF oldColor = dc.SetTextColor(color);

// 背景颜色重写一次

dc.TextOutW(m_point.x, m_point.y, m_str);

// 去掉最后一个字符

m_str = m_str.Left(m_str.GetLength() - 1);

// 在恢复原来的颜色

dc.SetTextColor(oldColor);

}

else {

m_str += (TCHAR)nChar;

}

CSize size = dc.GetTextExtent(m_str); // 获取字符串长度

int x = m_point.x + size.cx;

int y = m_point.y;

SetCaretPos(CPoint(x, y)); // 让插入符根据字符串长度移动

dc.TextOutW(m_point.x, m_point.y, m_str);

CView::OnChar(nChar, nRepCnt, nFlags);

}