概述
控件绘制需要书写show()、draw()事件;
控件的绘制有两个部分,一个是背景绘制(draw),一个是前景数据显示刷新(show);
其中draw方法绘制的是控件背景,所谓背景就是指无论show方法如何绘制,都不会覆盖的界面,在界面的创建时候进行调用,绘制背景;
而show方法则是绘制前景数据刷新,也就是说,每当获取新的数据时(即修改了控件属性),系统自刷新特性会调用show方法完成界面前景刷新;但需要注意的是,采用图层模式的绘制方法受单片机内存小的限制,无法构造全部显存完成图层处理,因此会采用拆分调用得到方法即多次调用show方法,每次合成图层的一部分,因此在show方法中,不建议做控件属性修改;
控件的四种显示模式
系统支持4种显示模式,各有特色,需要了解四种模式各自的特点,按实际情况选择;选择之后,需要在绘制屏幕前需要使用对应语句设置绘制模式。
四种显示模式:
模式 | 进入语句 | 描述 |
---|---|---|
直接绘制模式 | tranmode(0); | 直接按指定颜色绘制,特点是速度快、但无法处理背景 |
背景叠加模式 | tranmode(1); | 当绘制是63号颜色透明色时,自动叠加背景显示; |
图层模式 | makelayer(); | 在RAM中创建显存,通过多次调用完成多图层叠加显示 |
半透明图层模式 | maketranlayer(); | 可以以半透明模式叠加背景显示; |
模式一:直接绘制
直接绘制到屏幕,适合固定颜色的背景模式,这种方式特点是速度最快,但是实际应用场景不多
tranmode(0);
//......绘图语句
这个模式,就像UsartGPU的显示一样,进行直接覆盖式绘制显示界面
模式二:背景叠加模式
- 绘制界面的时候,遇见透明颜色,将直接叠加背景进行显示
- 透明颜色是指颜色号为63的颜色或者是0xffff的纯白色
- 在上位机处理图像时候,会自动将透明色转换为0xffff这种纯白色,而原图的纯白色(0xffff)会自动转换成次白色(0xf7de)
- 这种模式最常用,速度适中,比直接绘制速度慢,比图层模式速度快。
tranmode(1);
//......绘图语句
或者:
automode(bc);//根据bc颜色值来确定模式,当bc=63时进入tranmode(1);当不等于时,进入tranmode(0);
//......绘图语句
- 其中tranmode(1);是直接将模式置成叠加模式;而automode(bc)会自动根据bc的颜色号来判断是否是直接绘制还是叠加显示
模式三: 图层模式
- 图层缓存绘制模式,本模式只能工作在控件的show();所谓图层模式,就是说需要进行背景绘制,然后再绘制前景这种模式,这个过程中一定会出现清除背景-绘制这种操作,如果按照上面两种模式,必然会出现闪烁感,因此图层模式适合类似曲线这种控件
makelayer();
//......绘图语句
- 图层模式相比前面2种模式,速度最慢,但是对于一些需要清除背景且绘制,比如表盘,每次show()事件绘制的时候,必须先绘制表盘然后在绘制表针,如果按照前2种模式,表针必然会出现闪烁的现象,而使用图层模式,系统会先构建缓冲区,在缓冲区中绘制表盘,然后再绘制表针,最后再将缓冲区的内容绘制到显示屏上,比如表盘的show方法:
- makelayer()语句后面显示的方案是系统在绘制之前会自动刷新缓存器的背景图像,然后遇见63号颜色不绘制,非63号颜色才绘制的情况;这种情况会造成画线63号颜色无反应的情况,但同时对于显示汉字等来说,sbc(63)63号背景色不绘制使汉字可以更容易的融合在背景中比如: 利用这种机制,可以在两个boxf中叠加字符串的显示;但是正是因为这种机制会导致使用63号透明色无法填充背景的问题,因此一般makelayer()需要了解永远是在背景图上画非背景的信息;而不要使用背景色覆盖一些界面;
- 受单片机内存限制,因此为了复用内存,show函数在makelayer模式下可能被执行多次以完成显示,因此请在使用makelayer模式的时候show语句内不要使用变量累加等属性变更,以防止出现计算错误;也就是说,show函数只是完成显示的,一般不要在内部做参数属性的计算和变更;
void show()
{ int pw;
int xx;
int yy;
pw=(x2-x1)/2;
xx=x1+pw;
yy=y1+pw;
makelayer();
if (picn>0)pic(x1,y1,picn);
drawmeter(xx,yy,hr,90+h*30,hc,5);
drawmeter(xx,yy,mr,90+m*6,mc,3);
drawmeter(xx,yy,sr,90+s*6,sc,1);
}
模式四:半透明图层模式
如果把makelayer 换成maketranlayer就可以把控件变成半透明图层模式