VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 643|回复: 0

[分享] mfc单文档插入符的创建学习流程(步步高点读机,哪里不会点哪里)

[复制链接]
13_avatar_middle
最佳答案
1 
在线会员 发表于 2022-1-29 20:14:14 | 显示全部楼层 |阅读模式
步步高点读机,哪里不会点哪里  mfc单文档插入符的创建学习流程(步步高点读机,哪里不会点哪里) 逗你一乐
工具:vs2019    win10 64位    mfc单文档视图

在view事件 WM_CREATE是windows中一个窗口消息
插入符调用:CWnd::CreateSolidCaret  
类型:void CreateSolidCaret( int nWidth, int nHeight );

插入符的高度是根据字体的高度来确定
呼叫:CDC::GetTextMetrics  获取当前字体的信息
参数
lpMetric 接收计量单位信息的TEXTMETRIC结构的指针。

CClientDC类也是CDC类的派生类。它只能在窗口的客户区(即窗口中除了边框、标题栏、菜单栏以及状态栏外的中间部分)中进行绘图,坐标点(0,0)通常指的是客户区的左上角。它的构造函数调用GegDC函数,而析构函数调用ReleaseDC函数。

代码如下:
  1. CClientDC dc(this);
  2.         TEXTMETRIC tm;
  3.         dc.GetTextMetrics(&tm);
  4.         CreateSolidCaret(tm.tmAveCharWidth / 8,tm.tmHeight);
  5.         ShowCaret();
复制代码

      
在被创建之后,插字符是隐藏的。要显示插字符,必须调用ShowCaret成员函数。

2:在事件WM_LButtonDown中让插入符移动
调用:CWnd::SetCaretPos
  1. SetCaretPos(point);
复制代码

鼠标箭头移动哪里要先保存坐标位置,添加变量-m_mypoint 类型 CPoint 私有 private
  1. SetCaretPos(point);
  2.         m_mypoint = point;
复制代码

m_mypoint = point保存左键点击的位置

3:在事件--WM_CHAR消息事件处理函数

一些按键如ESC、Tab键,当按下后并不能够触发WM_CHAR消息并进入OnChar消息函数,这时需要在PreTranslateMessage函数中用::TranslateMessage函数对pMsg消息翻译处理,其实也就是在这个函数中将虚拟键码(Virtua- Key) 即pMsg->wParam重新翻译为ASCII字符码,当翻译的ASCII字符码在0-127之间时,将向消息队列中递交字符消息WM_CHAR

添加变量: m_str 类型CString  私有:private
代码如下:
  1. m_str += (TCHAR)nChar;
  2.         CClientDC dc(this); //当前窗口
  3.         //GetTextExtent是MFC中CDC类的一个成员函数,它的作用是返回当前字符串在屏幕中显示的长度和宽度。
  4.         dc.GetTextExtent(m_str);
  5.         dc.TextOutW(m_mypoint.x, m_mypoint.y, m_str); //写当前坐标的按下的字符
复制代码


经测试,光标不会移动
  1. m_str += (TCHAR)nChar;
  2.         CClientDC dc(this); //当前窗口
  3.         //GetTextExtent是MFC中CDC类的一个成员函数,它的作用是返回当前字符串在屏幕中显示的长度和宽度。
  4.        
  5.         CSize size=dc.GetTextExtent(m_str);
  6.         int x = m_mypoint.x + size.cx;
  7.         int y = m_mypoint.y;
  8.         SetCaretPos(CPoint(x, y));
  9.         dc.GetTextExtent(m_str);
  10.         dc.TextOutW(m_mypoint.x, m_mypoint.y, m_str); //写当前坐标的按下的字符
复制代码


4:添加换行ENTER和BACK退格功能
换行代码:
  1. if (nChar==VK_RETURN)
  2.         {
  3.                 m_str.Empty();
  4.                 TEXTMETRIC tm;
  5.                 dc.GetTextMetrics(&tm);
  6.                 m_mypoint.y = m_mypoint.y + tm.tmHeight;
  7.         }
复制代码


退格代码:
CDC::GetBkColor  获取当前背景色
CDC::SetTextColor  设置文本颜色
CString::GetLength 返回CString对象中的字符数。对多字节字符,按8位字符计算;即在一个多字节字符中一个开始和结束字节算作两个字符
CString::Left    提取一个字符串的左边一部分
  1. else if (nChar==VK_BACK)
  2.         {
  3.                 //获取当前背景色
  4.                 COLORREF color=dc.GetBkColor();
  5.                 //设置文本颜色
  6.                 COLORREF oldcolor=dc.SetTextColor(color);
  7.                 //重写一次
  8.                 dc.TextOutW(m_mypoint.x, m_mypoint.y, m_str);
  9.                 m_str = m_str.Left(m_str.GetLength() - 1);
  10.                 dc.SetTextColor(oldcolor);
  11.         }
复制代码


完整代码:
  1. int Cmfc0030View::OnCreate(LPCREATESTRUCT lpCreateStruct)
  2. {
  3.         if (CView::OnCreate(lpCreateStruct) == -1)
  4.                 return -1;
  5.         // TODO:  在此添加您专用的创建代码
  6.         CClientDC dc(this);
  7.         TEXTMETRIC tm;
  8.         dc.GetTextMetrics(&tm);
  9.         CreateSolidCaret(tm.tmAveCharWidth / 8,tm.tmHeight);
  10.         ShowCaret();
  11.         return 0;
  12. }


  13. void Cmfc0030View::OnLButtonDown(UINT nFlags, CPoint point)
  14. {
  15.         // TODO: 在此添加消息处理程序代码和/或调用默认值
  16.         SetCaretPos(point);
  17.         m_mypoint = point;
  18.         m_str.Empty();
  19.         CView::OnLButtonDown(nFlags, point);
  20. }


  21. void Cmfc0030View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
  22. {
  23.         // TODO: 在此添加消息处理程序代码和/或调用默认值
  24.        
  25.         CClientDC dc(this); //当前窗口
  26.         //GetTextExtent是MFC中CDC类的一个成员函数,它的作用是返回当前字符串在屏幕中显示的长度和宽度。
  27.        
  28.         CSize size=dc.GetTextExtent(m_str);
  29.         if (nChar==VK_RETURN)
  30.         {
  31.                 m_str.Empty();
  32.                 TEXTMETRIC tm;
  33.                 dc.GetTextMetrics(&tm);
  34.                 m_mypoint.y = m_mypoint.y + tm.tmHeight;
  35.         }else if (nChar==VK_BACK)
  36.         {
  37.                 //获取当前背景色
  38.                 COLORREF color=dc.GetBkColor();
  39.                 //设置文本颜色
  40.                 COLORREF oldcolor=dc.SetTextColor(color);
  41.                 //重写一次
  42.                 dc.TextOutW(m_mypoint.x, m_mypoint.y, m_str);
  43.                 m_str = m_str.Left(m_str.GetLength() - 1);
  44.                 dc.SetTextColor(oldcolor);
  45.         }
  46.         else
  47.         {
  48.                 m_str += (TCHAR)nChar;
  49.         }
  50.         int x = m_mypoint.x + size.cx;
  51.         int y = m_mypoint.y;
  52.         SetCaretPos(CPoint(x, y));
  53.         dc.GetTextExtent(m_str);
  54.         dc.TextOutW(m_mypoint.x, m_mypoint.y, m_str); //写当前坐标的按下的字符


  55.         CView::OnChar(nChar, nRepCnt, nFlags);
  56. }
复制代码

评分

参与人数 1驿站币 +2 热心值 +2 收起 理由
58_avatar_small thzzl + 2 + 2 支持原创!

查看全部评分





上一篇:字符指针指向字符串问题
下一篇:创建mfc时提示:VS 2019 解决对COM组件的调用返回了错误HRESULT E_FAIL
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2022-8-15 11:47

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表