大体思路是通过更改按钮皮肤属性的方式实现来实现BATTON控件的透明化。
先了解一下官方手册中的相关信息:
我们只需将所有的颜色改为透明即可实现控件的全透明化,因此我们需要打开Alpha混合功能,所用函数为:
GUI_EnableAlpha(1);
此时我们使用的颜色格式为ARGB或ABGR(emWin5.30版本之前只有ABGR),默认应该是ABGR,想使用ARGB需要在 GUIConf.h 文件中设置宏定义:
#define GUI_USE_ARGB (1)
两种颜色格式的alpha 透明通道均为bit[31:24]8位,但是在ARGB中00代表完全透明、FF代表完全不透明,而ABGR与其相反。官方头文件中给出的透明宏定义,使用GUI_TRANSPARENT作为颜色的话emWin会根据设定自动调整alpha 透明通道的值。
#define GUI_TRANSPARENT GUI_MAKE_COLOR(0xFF000000)
开启Alpha混合功能后,使用void BUTTON_GetSkinFlexProps (BUTTON_SKINFLEX_PROPS * pProps, int Index)
函数得到当前控件指定状态的皮肤数据,其中Index有几种值,参考下表
将全部组件的颜色变为透明以后再使用void BUTTON_SetSkinFlexProps (const BUTTON_SKINFLEX_PROPS * pProps, int Index)
函数更换皮肤。代码如下:
void Set_batton_skin(void)
{
BUTTON_SKINFLEX_PROPS Props;
BUTTON_GetSkinFlexProps(&Props, BUTTON_SKINFLEX_PI_ENABLED);
Props.aColorUpper[0] = GUI_TRANSPARENT; //顶部渐变的顶部颜色。
Props.aColorLower[0] = GUI_TRANSPARENT; //顶部渐变的底部颜色。
Props.aColorUpper[1] = GUI_TRANSPARENT; //底部渐变的顶部颜色。
Props.aColorLower[1] = GUI_TRANSPARENT; //底部渐变的底部颜色。
Props.aColorFrame[0] = GUI_TRANSPARENT; //周围框架的外部颜色。
Props.aColorFrame[1] = GUI_TRANSPARENT; //周围框架的内部颜色。
Props.aColorFrame[2] = GUI_TRANSPARENT; //周围框架与内部矩形区域之间的区域颜色。
Props.Radius = 5;
BUTTON_SetSkinFlexProps(&Props, BUTTON_SKINFLEX_PI_ENABLED); //更换启用状态皮肤
BUTTON_GetSkinFlexProps(&Props, BUTTON_SKINFLEX_PI_PRESSED);
Props.aColorUpper[0] = 0x301E90FF; //顶部渐变的顶部颜色。
Props.aColorLower[0] = 0x301E90FF; //顶部渐变的底部颜色。
Props.aColorUpper[1] = 0x301E90FF; //底部渐变的顶部颜色。
Props.aColorLower[1] = 0x301E90FF; //底部渐变的底部颜色。
Props.aColorFrame[0] = 0x301E90FF; //周围框架的外部颜色。
Props.aColorFrame[1] = 0x301E90FF; //周围框架的内部颜色。
Props.aColorFrame[2] = 0x301E90FF; //周围框架与内部矩形区域之间的区域颜色。
Props.Radius = 5;
BUTTON_SetSkinFlexProps(&Props, BUTTON_SKINFLEX_PI_PRESSED); //更换按下状态皮肤
}
将按钮按下的颜色设置为0x301E90FF(为透明度为0x30的道奇蓝),可以实现按钮按下变色的功能,可增加按钮的操作感。
演示如下,按钮抬起:
按钮按下:
如有错误欢迎指正~