Windows-文本编程基本技术
这里介绍一些MFC文本编程的简单技术点。
一.插入符
(1).创建文本插入符
#if 1
//创建插入符, 参数:宽,高
CreateSolidCaret(20, 100);
//必须显示出来,默认是隐藏的
ShowCaret();
#endif
(2).创建图形插入符
#if 1
//创建图形插入符,根据图片的ID加载
m_Bitmap.LoadBitmap(IDR_MAINFRAME);
CreateCaret(&m_Bitmap);
ShowCaret();
#endif
(3).显示插入符
//插入符默认是隐藏的,我们需要显式的显示它
ShowCaret();
(4).设置插入符的位置
//设置插入符的位置为左键按下的位置
SetCaretPos(point);
(5).得到设备描述表中的字体信息,显示合适的插入符大小
TEXTMETRIC tm;//文本信息的结构体变量
dc.GetTextMetrics(&tm);//获得设备描述表中文本的信息
//宽度根据经验值一般要 / 8
CreateSolidCaret(tm.tmAveCharWidth / 8, tm.tmHeight);//根据字体的大小,创建合适的插入符
ShowCaret();//显示插入符
tm结构体的相关信息
二.窗口重绘
在MFC中窗口重新绘制的时候,对应的视图对象会接收到WM_PAINT消息,在类的OnDraw函数中可以进行相应的逻辑处理。
下面是一个在屏幕上显示字符串的例子:
void CTextView::OnDraw(CDC* pDC)
{
CTextDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
#if 1
//构造字符串
CString str("Hello Wolrd");
//显示在50 50位置处
pDC->TextOut(50, 50, str);
#endif
}
三.CString类的简单使用
CString类是MFC中的字符串类,可以用于在MFC框架中方便的操作字符串,而不用像C中哪样需要对指针进行麻烦的操作,但是我们也必须有这些函数的实现思想,试想下怎么用C的思想来实现CString中某些函数。
下面是常用的两个实例:
(1).加载字符串
#if 1
//在OnDraw函数中测试,这个函数会提供pDc这个设备描述表指针的参数
//构造字符串
CString str("Hello Wolrd");
//显示在50 50位置处
pDC->TextOut(50, 50, str);//直接显示在屏幕上
str.LoadString(IDS_HELLO_WORLD);//通过MFC中的资源ID来加载字符串
pDC->TextOut(0, 200, str);
#endif
(2).删除字符串中的一个字符
CString Left(int nCount)//返回左边的nCount个字符构成的字符串
m_strLine = m_strLine.Left(m_strLine.GetLength() - 1);//等价于去掉最后一个字符
四.MFC中路径层的使用
(1).路径层其实就是规定了一段文本显示的边界,在边界内的可以显示,在路径层之外的不能显示。
实例:
//开启路径层
pDC->BeginPath();
//在路径层中画出一个矩形
pDC->Rectangle(50, 50, 50 + sz.cx, 50 + sz.cy);
//关闭路径层
pDC->EndPath();
(2).得到字符串的高度和宽度 GetTextExtent
CSize GetTextExtent(LPCTSTR lpszString, int nCount ) const;
我们需要区分这个函数和得到字体的信息的函数
BOOL GetTextMetrics(LPTEXTMETRIC lpMetrics) const;
的区别。
这个只能得到字符串的高度和宽度信息,而上面的函数是得到设备描述表中当前字体的详细信息,例如具体一个字体的高度,宽度,平均高度等等这些详细信息。需要清楚这两个函数的使用情况,不能乱用。
(3).剪切区域
剪切区域实质就是绘图区域,一般是在屏幕的客户区,也就是我们操作的区域。
设置剪切区域和路径层的互操作
//设置路径层和剪切区域进行互操作
pDC->SelectClipPath(RGN_DIFF);
五.字符输入
我们在视图类中输入字符的时候,会接收到WM_CHAR消息,在相应的回调函数OnChar()中可以对键盘消息进行处理,其中我们需要对回车和删除这两个字符进行特别的处理。
下面是一个实例:
void CTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和或调用默认值
CClientDC dc(this);
//得到字体的详细信息
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
//回车键
if (0x0D == nChar)
{
m_strLine.Empty();
m_ptOrigin.y += tm.tmHeight;
}
//删除键
else if (0x08 == nChar)
{
COLORREF clr = dc.SetTextColor(dc.GetBkColor());//设置当前文本背景颜色为默认窗口背景颜色
dc.TextOut(m_ptOrigin.x, m_ptOrigin.y, m_strLine);//输出一次文本
m_strLine = m_strLine.Left(m_strLine.GetLength() - 1);//等价于去掉最后一个字符
dc.SetTextColor(clr);
}
//其他键直接增加字符
else
{
m_strLine += static_cast<char>(nChar);
}
//输出在屏幕上
dc.TextOut(m_ptOrigin.x, m_ptOrigin.y, m_strLine);
CView::OnChar(nChar, nRepCnt, nFlags);
}
六.设置字体
在MFC中我们可以使用CFont这个类来对字体进行相应的选择。
下面是一个实例:
CFont font;
//创建具体的字体类型
font.CreatePointFont(300, L"华文行楷", nullptr);
//选入设备描述表中
CFont* pOldFont = dc.SelectObject(&font);
//记得要恢复设备描述表中之前的字体信息
dc.SelectObject(&font);
七.定时器
在MFC中我们也可以像硬件一样设置定时器来形成界面上的一种特效
我们需要使用SetTimer来设置定时器,这个定时器结束的时候会发送WM_TIMER消息,我们需要在应用程序中捕获这个消息,在OnTimer回调函数中处理。
//定时器ID,定时时间ms,回调函数置为空,会把WM_TIMER消息防盗消息队列中
SetTimer(1, 100, nullptr);
定时器的处理函数
void CTextView::OnTimer(UINT_PTR nIDEvent)
{ // TODO: 在此添加消息处理程序代码和/或调用默认值 CView::OnTimer(nIDEvent); }
九.总结
这里只是介绍了一些文本编程的基本技术,更多的技术还需要我们在实际项目中去发现。
这是自己总结的导图,方便大家总结
下面把资源共享给大家:https://yunpan.cn/cPYM8uu5XuZJH 访问密码 8eb9