stm32 TouchGFX基础教程(四)TouchGFX代码结构

通过上一节的操作,只用过C语言的同学可能觉得有些囫囵吞枣、消化不良,这一节将介绍C++语言的类、继承、虚函数三个概念,但是并不涉及技术细节。最后梳理一下TouchGFX Designer生成的代码的组织结构,方便系统把握Touchgfx的知识点。有C++基础的同学可以直接看第四项。
一、类
是面向对象编程的最重要的概念,提出类的一个重要原因就是方便组织代码,使程序可读性更好。类比一下C语言中的结构体,定义如下一个结构体类型Student

typedef struct {
	int age;
	int id;
	char* name;
} Student;
Student xiaoming={18,123456,"小明"};

结构体Student 一个很明显的作用就是把许多相关的数据组织到一起,通过变量xiaoming.age、xiaoming.id、xiaoming.name就可以访问age,id,name三个数据。
类和结构体差不多,但是它不仅能把数据打包到一起,还能把函数也一起打包进来,如

class Student
{
	int age;
	int id;
	string name;//c++推荐用string类型表示字符串
	void playGames();
	void study();
}
Student xiaoming;

在面向对象编程的语境中,类中的数据和函数有了新的名字:属性(property)方法(methods)。用类声明一个变量叫实例化,或者说小明是Student的一个实例。类还能通过关键字控制属性和方法的访问权限,所谓访问权限就是指能否用实例名加 “.”运算符 进行访问,比如

class Student
{private:
	int age;
 public:
	int id;
	string name;
	void playGames();
	void study();
}
Student xiaoming;

这时,我们可以通过xiaoming.id、Xiaoming.name 问他的id,name,并且用xiaoming.playGames()和xiaoming.study(),让他去学习和玩耍,因为id,name,playGames(),study()这些属性和方法都是公开(public) 的,但是却不能用 “.” 运算符 访问他的age,因为这个属性被设置成了隐私(private)
另外,我们希望在实例化的时候就给类的属性赋值,这就需要在类内部实现一个和类名相同的特殊方法:构造函数(constructor),构造函数没有任何返回值,连void都没有,添加构造函数后,上述代码变成

class Student
{private:
	int age;
 public:
 	Student(int a,int b,string c)
 	{//初始化的代码都可以放在这里
 		age=a;
 		id=b;
 		name=c;
	}
	int id;
	string name;
	void playGames();
	void study();
}

创建实例的时候,只需把参数一次性填入就行了

Student xiaoming(18,123456,"小明");

二、继承
继承就是在现有类的基础上增加一些属性或方法,对基础类进行扩展,从而形成新的类,新的类术语叫派生类子类,被继承的类叫基类父类
现在我们在学生这个类基础上构建一个国防生 类。国防生平时要进行训练,还会用枪,所以在可以这样定义

class NationalDefenseStudent:public Student
{
	public:
		 string gunName;
		 void train();	
		 //派生类的构造函数先调用基类的构造函数,然后再初始化新增的属性
		 NationalDefenseStudent(int a,int b,string c,string d)Student(a,b,c)//调用基类构造函数
		 {//初始化新增的属性
		 	gunName=d;
		 } 
}

这样,NationalDefenseStudent类就拥有了Student类所有的属性和方法,可以通过 “.”运算符 进行访问和调用,但是Student私有的属性和方法是没有被继承的,也就是说NationalDefenseStudent类里面没有age这个属性,但是这不合实际情况,所以可以用protected限定符替代private,这样age属性既能保证不会被外部访问,却能被派生类继承。
三、虚函数’
虚函数的作用是允许在派生类中定义与基类中具有相同名字的函数,并且可以通过基类指针来访问基类和派生类中的同名函数。 举个例子,

//定义一个基类A
class A{
	public:
	virtual void showMessage()
	{
		cout<<"this is from class A"<<endl;
	}
}
//定义一个派生类B
class B:public A{
	publicvirtual void showMessage()
	{
		cout<<"this is from class B"
	}
}

A a;//构造函数无参数时不需带上括()
B b;
A *c;
c=&a;
c->showMessage();//将输出this is from class A
c=&b;
c->showMessage();//将输出this is from class B

可以看出,通过一个基类的指针,既可以访问基类的showMessage方法,也能问派生类的同名方法。
四、Touchgfx Designer生成的代码结构

由第三节的体验可以知道,Touchgfx制作GUI界面包括两方面的工作:(1)在TouchGFX Designer中拖动、布局控件 (2)在VS中编写界面运行逻辑。
如图所示,TouchGFX Designer生成的代码结构分为三层:最底层是FRAMEWORK,这是Touchgfx提供的标准库,有的已经被编译成库文件,有的是源文件;中间是GENERATED层,完全由TouchGFX Designer根据我们的布局生成,最好不要手动改变这些文件里面的内容,因为下一次点击Generate Code 的时候,这些改动都会被覆盖掉;最上面是USER层,我们编写的所有代码在都放在这些文件里面,这些文件永远不会被Touchgfx Designer改变,这里的每一个类都继承自GENERATED中对应的类,比如Screen1View就继承自Generated中的Screen1ViewBase类。通过这样的分层组织方法,系统生成的代码和用户编写的代码实现了完全的解耦。stm32 TouchGFX基础教程(四)TouchGFX代码结构_第1张图片
编程的时候,可以在Generated层的头文件里找到所有我们在Touchgfx Designer中用到的资源,比如屏幕上的控件、文本资源管理器里的文本、图片资源管理器中拥有的图片等,然后引用需要的头文件。
这样看,Touchgfx Designer生成的代码逻辑还是很简单的,会一点面向对象编程就能轻松掌握,所以建议只用过C的同学还是要学一点C++,不要C++ Primer这种字典书,随便薄薄的一本就行,重点学习模板,Touchgfx中类无处不在,而模板会在注册回调函数的时候用到。

-------------------------------下面是我的小广告----------------------------------------------
stm32 TouchGFX基础教程(四)TouchGFX代码结构_第2张图片
淘宝小店:芯视界touchgfx

你可能感兴趣的:(stm32,touchgfx)