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);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了