VS2015之博大精深的MFC项目开发(二)
第二章 MFC原理篇
1、MFC06-1:CString类的测试


1.1 operator+函数



那么两个TCHAR是否能相加呢?

错了,不能想加,我们学C语言的时候都知道,两个指针相减还是有道理的,两个指针相减是两个地址之间的距离,是一个整数;
但是两个指针相加那就没有道理了。
只有第一个是对象,或者第二个是对象,才可以无限的连加,后面再有多少个字符串就都没问题了。

1.2 Delete函数



我们在试试给参数nCount设为-1看看能不能删除到结尾:


我们看到参数2设为-1没有效果。



我故意把参数2的值也得很长,程序也不会崩溃。
1.3 Find函数


我们发现没查找到,这是因为我们查找的那串字符不是个字符串。



如果这个Find函数查不到的话就返回-1。

从第5个位置开始查找的话,字符a在整个字符串的第6个位置上。

大家在每要测试一个新的内容的时候,要新建一个按钮专门测试这个内容。

1.4 Insert函数


每测一个函数你要用心的把它用心的做一个按钮,好好的练一下。


在字符串中间某个位置插入的话:


1.5 切分函数(Mid、Left、Right)





Mid函数是一个功能全面的切分函数,用Mid可以代替Left和Right函数,当你要字符串左边3个或者字符串右边3个的话,用Left和Right比较方便。


如果要求从字符串第3个位置以后的部分,有几种方法可以实现呢?
- 用Right函数来实现



- 用Mid函数来实现



第2个参数如果为-1的话不行,返回值为空。

我们发现第2个参数设置为字符串长度也可以,该值超长的话也不出错。


其实按照函数说明,不提供第2个参数的话,会一直到结尾;
单参数版本的Mid函数就是指从第几个位置开始一直到结尾。

所以说,Mid是功能最全面的切分函数,凡是Right能做到的,Left能做到的,Mid都能做到。
要切字符串右边的3个:

或者用单参数版本也行:

Mid函数也可以实现Left的功能:

在我们模拟CString类的时候,Left和Right的功能我们可以用Mid这个函数做出来。
1.6 其它函数



这个nID参数是指资源中字符串表中的字符串,如果资源中没有字符串表,你可以加入一个;
字符串表中可以放一些测试的字符串:

IDS_TEST这个ID将生成到resource.h当中,因为它是一个资源的ID:

我们看到这是一个整数,那么这个整数我们在什么时候使用呢?
当你需要使用字符串列表中的文字的时候:

现在很少使用LoadString函数了,它主要是以前做多国语言版的时候用的,现在有Unicode的话就没必要做多国语言版了。







1.7 反向查找函数ReverseFind

这个反向查找不支持查找一个字符串,只支持查找一个字符。

比方说当我们获得一个目录的时候,我们要从中找到当前的执行文件名:



就得到了程序运行目录,这个是非常好用的,因为在我们程序运行目录下往往还会有一些图片,我们要加载与程序相同目录下的资源、一些文件的时候,这种方法还是非常好用的。



在windows下一般用\r\n更能准确的代表换行,在linux下一般直接就用\n代表换行。

2、MFC06-2:开发一个带列表控件的软件






2.1 Trim系列函数


不带参数的Trim只裁剪字符串两端的空格,中间的空格不裁剪。


中间如果有空格、括号等包含在要裁剪的字符集中的字符仍然不裁,Trim只裁剪左右两端的。


2.2 GetBuffer和ReleaseBuffer函数
这是两个CString类中非常有用的函数,也是最古怪的CString对象的成员函数。

我们经常有一些API的参数是C语言格式的字符串(LPSTR或者LPTSTR),我们想把它直接获取到CString对象里面去(API本来就不支持对象),这样的话以前我们比较笨的方法就是首先定义一个字符缓冲区:



现在可以直接通过CString对象来获取缓冲区:


它会在内部的堆空间上去分配1000个,沿着这1000个去获取,获取完了之后必须要执行ReleaseBuffer函数,它是一个修复函数,必须要用ReleaseBuffer对这个str进行修复,因为在调用GetBuffer之前我们这个str的长度是空的,GetBuffer之后这个str的长度可能还是0,但是你经过ReleaseBuffer对这个str字符串进行修复之后,str将成为真正有用的字符串了,GetLength将会是实际获取到的那个字符串的长度:



我们从上图可以看到,即使是str获取到了系统目录字符串,但是它的长度仍然为0,所以我们要用ReleaseBuffer这个函数对它进行修复一下,修复了之后这个字符串才成为真正可用的字符串:

2.3 开发一个带列表控件的软件(CListCtrl类)





把按回车键默认关闭的代码注释掉,但是按ESC的话可以关闭,所以删除确定按钮,保留取消按钮。
ListBox是一个简易的列表,只有单行效果,现在一般都不用了;
现在凡是多行列表的都是ListControl:


上图这个Edit Labels可以让你实现,点击一个文件名,再点击一下就可以编辑这个文件名:


每一种控件都有自己对应的类,因为不同的控件有不同的操作。








运行起来出错了,一定要记得点重试按钮,再点中断:



双击打开你自己的程序代码,错误应该就是在刚编写的InsertColumn这一行上,没插进去,而且崩溃了。

我们首先看一下CListCtrl这个类的基类是什么:


而CWnd类核心的成员变量就是一个窗口句柄:


我们看到这个句柄是空的;
你创建了一个CListCtrl对象,你要拿这个对象去操作什么,比如说有5个ListControl控件,谁知道你要操作哪一个ListControl控件,你必须将这个CListCtrl对象和某一个控件的ID关联到一起,它没有关联到任何控件上,是不可以操作任何控件的,所以上面这样写是错的。

我们要看CWnd类的该成员函数,因为CWnd类是我们MFC的窗口类。







接着我们点击添加按钮的时候插入行:


消息映射表中就是:一消息(WM_COMMAND)、一ID、一函数。

GetDlgItem函数的返回值说明中,上图所选这句话,是说该函数的返回值是一个临时性指针变量,不要把它储存到成员变量里长期使用;
就是说你每个消息处理函数中都通过GetDlgItem函数获取一下,因为它是一个临时性的,会随时被清理掉。



这个InsertItem函数是插入一行,它只能添加该行第一列的内容,后面列的内容就不支持添加了。

item就是指最左边的列这一项叫item,subitem就是右边剩余的项。

它不但可以设置最左边这一列的文字,也可以通过nSubItem设置其他列的文字。


我们看到最后的日期没有放进来。
3、MFC06-2:继续完善带列表控件的软件开发
通过上节课的学习,我们知道了CListCtrl类的InsertColumn是插入列,InsertItem是插入行,SetItemText可以设置每一行上每列的文字。

把SetItemText函数第2个参数设为0就

本文档详细介绍了使用MFC进行项目开发的核心技术,包括CString类的深入应用、列表控件CListCtrl的定制开发、员工信息管理系统的完善以及记事本软件的实现等。通过实践案例展示了MFC类库的高级特性。
最低0.47元/天 解锁文章
5080

被折叠的 条评论
为什么被折叠?



