文本编程之插入符
来源:互联网 发布:python 灰度图转rgb 编辑:程序博客网 时间:2024/06/14 20:30
常用的文本处理程序有word,记事本、IDE集成开发环境等,它们都可以文本的编辑,鼠标点击之处都有一条闪烁的竖线,这个竖线就是插入符(Caret)。该插入符用于提示用户输入文字,下面就演示插入符的应用实例。
接口函数
在Cwindow成员中有一个Caret Methods,在这个Caret Methods中介绍了插入符的创建和使用,其接口函数如下:
//方法1:Creates a solid rectangle for the system caret.BOOL CreateSolidCaret(int nWidth,int nHeight) throw();//方法2:Creates a gray rectangle for the system caret.BOOL CreateGrayCaret(int nWidth,int nHeight) throw();//方法3:Creates a new shape for the system caret.BOOL CreateCaret(HBITMAP pBitmap) throw();//Hides the system caret. BOOL HideCaret( ) throw();//Displays the system caret.BOOL ShowCaret( ) throw();
int CMFC_TestView::OnCreate(LPCREATESTRUCT lpCreateStruct){ if (CView::OnCreate(lpCreateStruct) == -1) return -1; CreateGrayCaret(3,20);//创建 ShowCaret();//显示 return 0;}
图1 插入符运行效果
为了插入符能够跟随文本字体大小而发生变化,我们需要获得设备描述表中字体结构。在CDC类中有个GetTextMertics成员函数可以得到设备描述表中字体信息,其函数声明如下:
BOOL GetTextMetrics(LPTEXTMETRIC lpMetrics) const;
其中,入参是TEXTMETRIC结构的指针,该结构包含了字体基本信息,但是常见有用信息就只有几个,具体结构体如下:
typedef struct tagTEXTMETRIC { LONG tmHeight; LONG tmAscent; LONG tmDescent; LONG tmInternalLeading; LONG tmExternalLeading; LONG tmAveCharWidth; LONG tmMaxCharWidth; LONG tmWeight; LONG tmOverhang; LONG tmDigitizedAspectX; LONG tmDigitizedAspectY; TCHAR tmFirstChar; TCHAR tmLastChar; TCHAR tmDefaultChar; TCHAR tmBreakChar; BYTE tmItalic; BYTE tmUnderlined; BYTE tmStruckOut; BYTE tmPitchAndFamily; BYTE tmCharSet; } TEXTMETRIC;其中tmHeight是字符高度,tmHeight = tmAscent + tmDescent, tmAveCharWidth是平均宽度,因为每个字符宽度都不同,只有一个平均宽度,如图2是字体信息的部分示意图。
图2 字体信息示意图
有了字体信息,我们可以利用字体信息来,完善我们的插入符大小,具体代码如下:
int CMFC_TestView::OnCreate(LPCREATESTRUCT lpCreateStruct){ if (CView::OnCreate(lpCreateStruct) == -1) return -1; //方法2: //创建设备描述表 CClientDC dc(this); //定义文本信息结构体 TEXTMETRIC tmInfo; //获得设备描述表中文本信息 dc.GetTextMetrics(&tmInfo); //根据当前字体大小,设置合适的插入符 CreateSolidCaret(tmInfo.tmAveCharWidth / 4,tmInfo.tmHeight); //显示插入符 ShowCaret(); return 0;}运行效果:
图3 根据字体大小创建的插入符
字符输入功能
下面要实现字符输入功能,也就是用户在键盘上输入字符时,插入符随着字符往后移动,按下回车键实现换行,按下回退键实现字符删除,按下鼠标左键时,就在当前文字显示插入符。为了捕获字符输入信息,我们需要添加Onchar消息响应函数。
1.插入符的移动实现
我们捕获鼠标左键按下信息(WM_LBUTTONDOWN),利用SetCaretPos()函数实现鼠标点击时位置的移动,代码实现如下:
void CMFC_TestView::OnLButtonDown(UINT nFlags, CPoint point){ // TODO: 在此添加消息处理程序代码和/或调用默认值 m_ptCaretOrigin = point;// 字符输入起始位置 SetCaretPos(point); // 插入符移动 m_strLine.Empty(); //变化起始位置,清空已有字符内容 CView::OnLButtonDown(nFlags, point);}
当我们不断输入字符时,插入符也要不断发生变化,我们可以利用CDC类中GetTextExtent函数,来获得一个字符串在显示屏上显示的宽度和高度,函数声明如下:
CSize GetTextExtent(LPCTSTR lpszString,int nCount) const;CSize GetTextExtent(const CString& str) const;CSze有个两个成员变量,cx表示宽度,cy表示高度。
2.字符输入处理
利用人眼的视觉残留效应,每来一个字符消息时,我们就重新输入所有的字符,用户感觉不到其中的变化,表现的效果就是用户输入字符,显示器就多出现一个该字符。
3.回车字符处理
当按下回车键时,需要清空已有字符内容,同时计算新的字符输出位置,新的位置和原始位置相比,横坐标不变,纵坐标增加一个字符高度,高度消息可由GetTextMetrics函数来获得。
4.退格键处理
按退格键实现字符的删除,我们可先设置字符和背景颜色相同的形式,实现字符的“删除”功能,然后在m_strLine中删除最后一个字符,同时将字体颜色设置回默认颜色,最后再输出字符串。
以上的功能实现代码如下:
void CMFC_TestView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags){ // TODO: 在此添加消息处理程序代码和/或调用默认值 CClientDC dc(this); TEXTMETRIC tm; dc.GetTextMetrics(&tm); if (0x0d == nChar) { //换行清空字符串信息 m_strLine.Empty(); //换新行 m_ptCaretOrigin.y += tm.tmHeight; } else if (0x08 == nChar) { //回车删除功能 COLORREF cl = dc.SetTextColor(dc.GetBkColor()); dc.TextOut(m_ptCaretOrigin.x, m_ptCaretOrigin.y, m_strLine); //新字符串输出 m_strLine = m_strLine.Left(m_strLine.GetLength() - 1); dc.SetTextColor(cl); } else { m_strLine += (unsigned char)nChar; } //插入符位置变化 CSize sz = dc.GetTextExtent(m_strLine);//获得一行字体的高度和宽度 CPoint pt; pt.x = m_ptCaretOrigin.x + sz.cx; pt.y = m_ptCaretOrigin.y; SetCaretPos(pt); //放在最后,可以避免插入符显示痕迹 dc.TextOut(m_ptCaretOrigin.x, m_ptCaretOrigin.y, m_strLine); CView::OnChar(nChar, nRepCnt, nFlags);}运行效果:
图4 字符输入演示
- 文本编程之插入符
- MFC文本编程(插入符的使用)
- 【Windows编程】系列第十篇:文本插入符
- 《openssl 编程》之文本数据库
- Python编程之文本编辑器
- GDI编程之六、文本编程实例
- 静态文本的插入符(光标)
- MFC 设置文本插入符 Caret
- MFC实现文本插入描述符
- awk处理之案例六:awk根据条件插入文本
- opencv学习(十三)之文本文字插入
- 木马编程DIY之文本语音
- Shell编程之文本过滤笔记
- UNIX编程艺术之“文本化”
- MFC学习笔记之文本编程
- MFC学习笔记之文本编程
- shell编程之文本与日志过滤
- 编程小技巧之文本操作
- 《工具》----本地连接远程服务器的神器MobaXterm ,比securecrt好用
- 笔试:最少再出几道题?补充题目
- AngularJs之学习笔记
- JavaScript 现状:方言篇
- Linux mint 下安装有道词典
- 文本编程之插入符
- CH372或CH375的USB通讯问题解答
- 那些年,在github混经验的日子(持续更新)
- activity的四种启动模式
- CountDownLatch/CyclicBarrier/Semahore/sychronize/locy区别
- 关于关系代数中除法的理解以及如何用基本运算表示除法
- HDU 5894 hannnnah_j’s Biological Test (组合数学 + 快速幂 + 乘法逆元)
- GD数据流项目
- GDOI2016模拟9.21总结