您的位置:首页 > 编程语言

Windows-文本编程基本技术

2016-04-28 17:51 381 查看
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();//显示插入符


(6).字体的相关信息



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);
}


八.附上一张ASCII表



九.总结

这里只是介绍了一些文本编程的基本技术,更多的技术还需要我们在实际项目中去发现。

这是自己总结的导图,方便大家总结



下面把资源共享给大家:https://yunpan.cn/cPYM8uu5XuZJH 访问密码 8eb9
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: