|
步步高点读机,哪里不会点哪里 逗你一乐
工具: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函数。
代码如下:
- CClientDC dc(this);
- TEXTMETRIC tm;
- dc.GetTextMetrics(&tm);
- CreateSolidCaret(tm.tmAveCharWidth / 8,tm.tmHeight);
- ShowCaret();
复制代码
在被创建之后,插字符是隐藏的。要显示插字符,必须调用ShowCaret成员函数。
2:在事件WM_LButtonDown中让插入符移动
调用:CWnd::SetCaretPos
鼠标箭头移动哪里要先保存坐标位置,添加变量-m_mypoint 类型 CPoint 私有 private
- SetCaretPos(point);
- 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
代码如下:
- m_str += (TCHAR)nChar;
- CClientDC dc(this); //当前窗口
- //GetTextExtent是MFC中CDC类的一个成员函数,它的作用是返回当前字符串在屏幕中显示的长度和宽度。
- dc.GetTextExtent(m_str);
- dc.TextOutW(m_mypoint.x, m_mypoint.y, m_str); //写当前坐标的按下的字符
复制代码
经测试,光标不会移动
- m_str += (TCHAR)nChar;
- CClientDC dc(this); //当前窗口
- //GetTextExtent是MFC中CDC类的一个成员函数,它的作用是返回当前字符串在屏幕中显示的长度和宽度。
-
- CSize size=dc.GetTextExtent(m_str);
- int x = m_mypoint.x + size.cx;
- int y = m_mypoint.y;
- SetCaretPos(CPoint(x, y));
- dc.GetTextExtent(m_str);
- dc.TextOutW(m_mypoint.x, m_mypoint.y, m_str); //写当前坐标的按下的字符
复制代码
4:添加换行ENTER和BACK退格功能
换行代码:
- if (nChar==VK_RETURN)
- {
- m_str.Empty();
- TEXTMETRIC tm;
- dc.GetTextMetrics(&tm);
- m_mypoint.y = m_mypoint.y + tm.tmHeight;
- }
复制代码
退格代码:
CDC::GetBkColor 获取当前背景色
CDC::SetTextColor 设置文本颜色
CString::GetLength 返回CString对象中的字符数。对多字节字符,按8位字符计算;即在一个多字节字符中一个开始和结束字节算作两个字符
CString::Left 提取一个字符串的左边一部分
- else if (nChar==VK_BACK)
- {
- //获取当前背景色
- COLORREF color=dc.GetBkColor();
- //设置文本颜色
- COLORREF oldcolor=dc.SetTextColor(color);
- //重写一次
- dc.TextOutW(m_mypoint.x, m_mypoint.y, m_str);
- m_str = m_str.Left(m_str.GetLength() - 1);
- dc.SetTextColor(oldcolor);
- }
复制代码
完整代码:
- int Cmfc0030View::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CView::OnCreate(lpCreateStruct) == -1)
- return -1;
- // TODO: 在此添加您专用的创建代码
- CClientDC dc(this);
- TEXTMETRIC tm;
- dc.GetTextMetrics(&tm);
- CreateSolidCaret(tm.tmAveCharWidth / 8,tm.tmHeight);
- ShowCaret();
- return 0;
- }
- void Cmfc0030View::OnLButtonDown(UINT nFlags, CPoint point)
- {
- // TODO: 在此添加消息处理程序代码和/或调用默认值
- SetCaretPos(point);
- m_mypoint = point;
- m_str.Empty();
- CView::OnLButtonDown(nFlags, point);
- }
- void Cmfc0030View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
- {
- // TODO: 在此添加消息处理程序代码和/或调用默认值
-
- CClientDC dc(this); //当前窗口
- //GetTextExtent是MFC中CDC类的一个成员函数,它的作用是返回当前字符串在屏幕中显示的长度和宽度。
-
- CSize size=dc.GetTextExtent(m_str);
- if (nChar==VK_RETURN)
- {
- m_str.Empty();
- TEXTMETRIC tm;
- dc.GetTextMetrics(&tm);
- m_mypoint.y = m_mypoint.y + tm.tmHeight;
- }else if (nChar==VK_BACK)
- {
- //获取当前背景色
- COLORREF color=dc.GetBkColor();
- //设置文本颜色
- COLORREF oldcolor=dc.SetTextColor(color);
- //重写一次
- dc.TextOutW(m_mypoint.x, m_mypoint.y, m_str);
- m_str = m_str.Left(m_str.GetLength() - 1);
- dc.SetTextColor(oldcolor);
- }
- else
- {
- m_str += (TCHAR)nChar;
- }
- int x = m_mypoint.x + size.cx;
- int y = m_mypoint.y;
- SetCaretPos(CPoint(x, y));
- dc.GetTextExtent(m_str);
- dc.TextOutW(m_mypoint.x, m_mypoint.y, m_str); //写当前坐标的按下的字符
- CView::OnChar(nChar, nRepCnt, nFlags);
- }
复制代码 |
评分
-
查看全部评分
上一篇: 字符指针指向字符串问题下一篇: 创建mfc时提示:VS 2019 解决对COM组件的调用返回了错误HRESULT E_FAIL
|