MFC 插入符输入文字_字符串长度

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);
}