Windows-文本编程基本技术
2016-04-28 17:51
381 查看
Windows-文本编程基本技术
这里介绍一些MFC文本编程的简单技术点。
一.插入符
(1).创建文本插入符
(2).创建图形插入符
(3).显示插入符
(4).设置插入符的位置
(5).得到设备描述表中的字体信息,显示合适的插入符大小
(6).字体的相关信息
tm结构体的相关信息
二.窗口重绘
在MFC中窗口重新绘制的时候,对应的视图对象会接收到WM_PAINT消息,在类的OnDraw函数中可以进行相应的逻辑处理。
下面是一个在屏幕上显示字符串的例子:
三.CString类的简单使用
CString类是MFC中的字符串类,可以用于在MFC框架中方便的操作字符串,而不用像C中哪样需要对指针进行麻烦的操作,但是我们也必须有这些函数的实现思想,试想下怎么用C的思想来实现CString中某些函数。
下面是常用的两个实例:
(1).加载字符串
(2).删除字符串中的一个字符
四.MFC中路径层的使用
(1).路径层其实就是规定了一段文本显示的边界,在边界内的可以显示,在路径层之外的不能显示。
实例:
(2).得到字符串的高度和宽度 GetTextExtent
我们需要区分这个函数和得到字体的信息的函数
的区别。
这个只能得到字符串的高度和宽度信息,而上面的函数是得到设备描述表中当前字体的详细信息,例如具体一个字体的高度,宽度,平均高度等等这些详细信息。需要清楚这两个函数的使用情况,不能乱用。
(3).剪切区域
剪切区域实质就是绘图区域,一般是在屏幕的客户区,也就是我们操作的区域。
设置剪切区域和路径层的互操作
五.字符输入
我们在视图类中输入字符的时候,会接收到WM_CHAR消息,在相应的回调函数OnChar()中可以对键盘消息进行处理,其中我们需要对回车和删除这两个字符进行特别的处理。
下面是一个实例:
六.设置字体
在MFC中我们可以使用CFont这个类来对字体进行相应的选择。
下面是一个实例:
七.定时器
在MFC中我们也可以像硬件一样设置定时器来形成界面上的一种特效
我们需要使用SetTimer来设置定时器,这个定时器结束的时候会发送WM_TIMER消息,我们需要在应用程序中捕获这个消息,在OnTimer回调函数中处理。
定时器的处理函数
八.附上一张ASCII表
九.总结
这里只是介绍了一些文本编程的基本技术,更多的技术还需要我们在实际项目中去发现。
这是自己总结的导图,方便大家总结
下面把资源共享给大家:https://yunpan.cn/cPYM8uu5XuZJH 访问密码 8eb9
这里介绍一些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
相关文章推荐
- 用C++将1,2...9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例
- 在ASP.NET 2.0中操作数据之二:创建一个业务逻辑层
- Java容器类默认初始容量研究
- php批量更新或插入数据
- 正则表达式知识详解之子表达式 (java版示例)
- php分批次批量插入数据
- 第八章 高质量编程规范
- vb
- Java中的@SuppressWarnings
- vb 十进制转二进制
- 《JAVA与模式》之合成模式
- [C++]关于接口的设计与声明--对封装性的理解
- java编程中'为了性能'一些尽量做到的地方
- (HBase) Error: JAVA_HOME is not set and Java could not be found
- 《JAVA与模式》之门面模式
- CAF(C++ Actor Framework)介绍
- 关于struts2标签嵌套问题
- 线性查找---JAVA实现
- 非常经典的JAVA编程题(素数)
- 3.表达式