14. MFC高级控件使用教程与开发技巧

1.前言

通过前面两章的学习,现在你已经有能力开发一些简单的GUI软件了。

而想要实现更复杂的软件,就需要学习使用更多复杂的控件,但由于MFC的资料并不是那么的好查找,所以为了节约大家时间,本章将对MFC的更多控件进行使用介绍。

如果急着赶学习进度的话,本章不需要细看,在实际开发软件时,需要这些控件的时候回来看看怎么用就行了。

甚至在你学了Qt之后,可能都不想使用MFC开发软件,那自然也就没必要学本章的内容了。

2.项目建立

过程与前面章节相同,建立基于对话框的MFC项目,项目名为day14--Control,至于其它的选项则任意。

然后将自动生成的控件删除掉,将紫线拖到最大(这一步不是必要的):

image-20231210160816501

3.Combox box

首先来看Combox box控件,这个控件也很常用,比如在填写个人信息,选择自己所在省时,一般就会用到它:

image-20231210161026207

现在它里面还啥都没有,所以我们要为它添加一些选项,比如各个省名。

添加方法主要有两种,第一种是直接在属性界面里面添加,各个数据之间用;分隔,不过这些数据是要你运行程序后才能看到的:

image-20231210161256797

上面是第一种方法,很明显有点不方便,如果太多的话,一个一个的手动添加太麻烦了。

所以就有了第二种方法,即在代码中添加,首先还是老方法,先为控件绑定一个控件变量:

image-20231210161613422

然后调用AddString函数添加数据项即可:

image-20231210161807841

现在再运行一下试一试:

image-20231210161907941

是不是也能添加项!

但还有问题要解决,一般这种选择的应该要有一个默认的,我们这里最开始竟然是空白的,所以还得调用一下函数SetCurSel

image-20231210161958763

这个函数的意思是设置当前选项(set current select),即所有选项添加时,会默认从0开始递增,每一个选项都与其位置对应。

这里我们选择0,即默认显示第一个。

然后还有一个问题要解决,那就是既然我们这个控件是用来接受用户输入的,那么我们还需要得到用户选择的选项:

image-20231210162140775

方法很简单,就是调用以前常用的一个函数GetWIndowsText,因为这个控件也是从CWnd类继承下来的,所以可以使用,然后运行看一看:

image-20231210162221350

因为我是直接写在窗口的初始化函数中的,所以在窗口显现出来前,弹窗就先行创建出来了。

由于前面代码我们选择了显示默认0位置,即北京,所以这里就显示出了北京。

4.List Box

下面要进行介绍的控件是List Box,它相比于其它控件要复杂的多:

image-20231210162411258

一看,简直平平无奇,和编辑框放大后几乎一摸一样,但先不管这么多,我们先为它绑定一个控件变量:

image-20231210162458128

然后在代码中给它添加数据,运行一下试一试:

image-20231210162638811

是不是感觉和上面的Combo Box很像?不同之处可能就是这个列表控件是直接将所有选项都拿出来给用户看的。

但其实还有一点不一样,那就是这个控件允许多选:

image-20231210162741874

在该属性中,将这个选择设置为多项即可,然后我们再运行程序,就可以选择多个了:

image-20231210162812365

那么问题来了,我们应该如何选择默认选项,以及如何得到用户选项呢?

image-20231210163014082

因为这里我们是多选项,所以调用SelItemRange函数,即0到2位置,都将被选择上。

如果是单选,应该就需要调用上面被我注释掉的那一行代码,这需要参考官方文档,如果按F1搜索不到的话,并不是没有,直接去浏览器中搜就行。

比如这里我们想要了解List Box控件的使用,我们就需要知道它的类名,然后直接搜索类名就可以了,这个前面章节已经介绍过了,这里不再赘述。

解决了如何默认选择,下面就是我们如何获得用户的选择:

	int nCount = m_listbox.GetSelCount();
	int* num = new int[nCount];
	m_listbox.GetSelItems(nCount, num);

	CString data;
	for (int i = 0; i < nCount; i++) {
		CString tmp;
		m_listbox.GetText(num[i], tmp);
		data += tmp + _T("\r\n");
	}
	AfxMessageBox(data);

	delete[] num;

上面的代码主要解决下面这几个问题:

  1. 首先我们需要获得一下用户选择了多少个选项:GetSelCount
  2. 然后我们就需要分配同样大的数组,来存放用户选择的选项索引,即GetSelItems函数
  3. 然后我们就可以根据得到的索引号来得到对应的文字,通过GetText函数。

image-20231210163424141

5.Group Box

接下来是Group Box,这个控件就很简单了,基本没什么需要我们操作的:

image-20231210163536055

它最为广泛的作用就是,将其它控件包含其中,然后它用来说明其它控件是干嘛的。

比如这里我改了性别,那就可以再拖入两个单选框到里面,这就可以提醒用户这里是选择性别的:

image-20231210163634088

反正总的来说,它就是用来提示用户某些控件是干嘛的,这和静态文本框很像。

6.Picture control

接下来是图片控件,看它的名字就知道,它是用来展示图片的,不过一般不常用:

image-20231210163817211

它可以在属性中直接添加图片:

image-20231210163921888

首先需要选择图标或位图,然后在下一个属性中设置图像的id,但由于我们这里并没有加载其它图像资源,所以可以自己画一个。

方法是找到该项目的资源视图,右键它选择添加资源,就会弹出资源窗口,选择Bitmap新建即可:

image-20231210164039542

选择画笔,颜色,然后就可以在上面画图:

image-20231210164303138

画完后按Ctrl+S保存,在资源视图中我们就能看到这张图片的ID

image-20231210164419974

我们将这个ID填入图像控件的属性中,运行后就能看到我们刚才画的图片已经能正常显示了:

image-20231210164558584

但我们发现VS中画图并不方便,所以上面我们还可以添加Bitmap资源,即在PS等软件中画好图片,然后转化为Bmp格式就可以添加了,也是一样的效果:

image-20231210164721764

但每次这样在属性里面改可能会有点不方便,在代码中改的话会方便很多。

所以就有了下面的方法,注意,由于Picture Control控件是静态控件,所以是不让绑定变量的,如果想要为它绑定变量,我们就必须给它更改ID:

image-20231210164837733

然后我们就能够顺利为它绑定变量了,过程不再赘述,名称为控件变量名为:m_picture

image-20231210165122781

加载图片资源、并将其设置到控件的代码如上。

首先创建了一个位图类CBitmap,它有一个函数LoadBitmap函数可以通过资源ID加载位图:

	CBitmap bit;
	BOOL ret = bit.LoadBitmap(IDB_BITMAP1);
	m_picture.SetBitmap((HBITMAP)bit.GetSafeHandle());

然后我们就可以通过调用它的GetSafeHandle函数,获得位图句柄,但由于其默认是一个对象句柄,所以我将它的返回值进行了强制转换。

最后调用图像控件的SetBitmap函数设置图像即可。

注意:它在初始化函数中调用可能没效果,可能是MFC的bug,可以自己新建一个按钮,在按钮的点击响应函数中调用上面这段代码。

7.Scroll Bar

接下来介绍的是滚动条,但事实上这个滚动条我们很少使用到,因为最常见到的滚动条就是编辑框中的滚动条,但它本身已经自带了,在其属性里面添加即可。

但这里也依旧介绍一下,万一以后用得到呢?可以看到,这里有两个滚动条:

image-20231210185538110

一个是水平滚动条,一个是垂直滚动条,两个滚动条就是方向不一样罢了,其它都是一样的,所以这里就用水平滚动条进行介绍。

老规矩,还是先给它绑定一个控件变量,变量名为m_scroll,过程不再赘述。

对于滚动条,首先要设置的肯定是它能滑动的范围与初始值了:

image-20231210185748918

上图中调用了其两个函数,分别设置范围为0到100,以及初始值为0:

	m_scroll.SetScrollRange(0,100);
	m_scroll.SetScrollPos(0);
作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux