OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 15540|回复: 23

EMWIN按钮透明化分享

[复制链接]

2

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2015-12-14
在线时间
15 小时
发表于 2016-2-15 11:47:16 | 显示全部楼层 |阅读模式
以前看了原子哥的emwin按钮上显示位图那一节视频,按钮是矩形的,位图放上去会出现覆盖不全,导致显示非常不好看。我就想了一个办法,把按钮透明化。
先来说说怎么把按钮透明化把:首先创建一个按钮,把button皮肤屏蔽掉,在设置按钮的背景色,这个时候要开启Alpha(GUI_EnableAlpha(1);),然后        BUTTON_SetBkColor(hButton_2,BUTTON_CI_UNPRESSED, (0XFFuL<<24)|GUI_BLUE);
BUTTON_SetBkColor(hButton_2,BUTTON_CI_PRESSED, (0XFFuL<<24)|GUI_BLUE);
GUI_BLUE随便写,我尝试过用GUI_INVALID_COLOR,但是不行。然后再把BUTTON_SetFocussable(hButton_2,0);去掉就ok 了
然后就设置        BUTTON_SetBitmapEx(hButton_2,BUTTON_BI_UNPRESSED,&buttonbmp_tab[0],0,0);
这里要注意位图要用png格式的那种透明化得图片转化。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-2-15 12:47:01 | 显示全部楼层
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

3

主题

548

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1383
金钱
1383
注册时间
2015-2-3
在线时间
197 小时
发表于 2016-2-15 12:51:30 | 显示全部楼层
求源码和效果图
回复 支持 反对

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2016-2-15 13:41:16 | 显示全部楼层
有空移植玩玩,谢谢分享
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2015-12-14
在线时间
15 小时
 楼主| 发表于 2016-2-15 14:09:18 | 显示全部楼层

#include "button_bitmap.h"
#include "DIALOG.h"

WM_HWIN hwindow1,hwindow2;
WM_HWIN hButton_1,hButton_2,PROGBAR1;
WM_HWIN hText1,hText2;

GUI_BITMAP buttonbmp_tab[2];

static void BKWin_Getdata(WM_MESSAGE * pMsg)
{
  switch (pMsg->MsgId) {

  case WM_PAINT:                                                                                                                                                        //&#214;&#216;&#187;&#230;±3&#190;°
          GUI_SetColor(GUI_GREEN);
                GUI_FillRect(0,0,LCD_GetXSize(),LCD_GetYSize());
                GUI_Clear();
    break;
       
         default:               
      WM_DefaultProc(pMsg);
  }
}

static void h1_Getdata(WM_MESSAGE * pMsg)
{
        WM_HWIN hItem;
        int        NCode;
  int        Id;
        static u8 led0flag=0,led1flag=0;
       
        switch(pMsg->MsgId)
        {
                case WM_NOTIFY_PARENT:   //í¨&#214;a&#184;&#184;′°&#191;ú£&#172;&#212;-′°&#191;ú·¢éúá&#203;±&#228;&#187;ˉ
                        Id    = WM_GetId(pMsg->hWinSrc);      // &#191;&#216;&#188;tμ&#196;ID£&#172;&#196;&#196;&#184;&#246;&#191;&#216;&#188;t·¢éúá&#203;±&#228;&#187;ˉ
                        NCode = pMsg->Data.v;                 // í¨&#214;a′ú&#194;&#235;£&#172;&#188;′·¢éúá&#203;&#212;&#245;&#209;ùμ&#196;±&#228;&#187;ˉ
                        switch(Id)
                        {
                                case GUI_ID_BUTTON0:
                                        hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_BUTTON0);
                                        switch(NCode)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;
                                                case WM_NOTIFICATION_RELEASED:
                                                        LED0=~LED0;                //LED0·′×a
                                                        led0flag = ~led0flag;
                                                        BUTTON_SetBitmapEx(hItem,0,led0flag?&buttonbmp_tab[1]:&buttonbmp_tab[0],0,0);       
                                                        break;                               
                                        }
                                        break;
                               
                                case GUI_ID_BUTTON1:
                                                hItem = WM_GetDialogItem(pMsg->hWin, GUI_ID_BUTTON1);
                                        switch(NCode)
                                        {
                                                case WM_NOTIFICATION_CLICKED:
                                                        break;
                                                case WM_NOTIFICATION_RELEASED:
                                                       
                                                        LED1=~LED1;                //LED0·′×a
                                                        led1flag = ~led1flag;
                                                        BUTTON_SetBitmapEx(hItem,0,(led1flag>0)?&buttonbmp_tab[1]:&buttonbmp_tab[0],0,0);       
                                                        break;       
                                        }
                                        break;
                        }       
                        break;
                case WM_PAINT:                                                                                                        //&#214;&#216;&#187;&#230;±3&#190;°
                        GUI_SetBkColor(GUI_RED);
                        GUI_FillRect(0,0,240,320);
                        GUI_Clear();
                        break;
                default:
                        WM_DefaultProc(pMsg);
                        break;
        }               
}

static void h2_Getdata(WM_MESSAGE * pMsg)
{

  switch (pMsg->MsgId) {

                case WM_PAINT:                                                                                                                                                        //&#214;&#216;&#187;&#230;±3&#190;°
//                        GUI_SetBkColor((0x80uL << 24) | GUI_GREEN);
                        GUI_SetBkColor(GUI_INVALID_COLOR);
                        GUI_FillRect(20,150,150,100);  
//                        GUI_Clear();
                        break;
               
                 default:               
                                WM_DefaultProc(pMsg);
  }
}


void CreateWindow1(void)
{       
        buttonbmp_tab[0]=bmBUTTON1;
        buttonbmp_tab[1]=bmbfzn_001;

        hwindow1 = WM_CreateWindowAsChild(
                                                                                                                                                0,
                                                                                                                                                0,
                                                                                                                                                240,
                                                                                                                                                320,
                                                                                                                                                WM_HBKWIN,
                                                                                                                                                WM_CF_SHOW|WM_CF_MEMDEV,
                                                                                                                                                h1_Getdata,
                                                                                                                                                0);

        hText1 = TEXT_CreateEx(20,30,60,40,hwindow1,WM_CF_SHOW,TEXT_CF_HCENTER|TEXT_CF_VCENTER,GUI_ID_TEXT0,"LED0:");
        TEXT_SetTextColor(hText1,GUI_BLUE);
        TEXT_SetFont(hText1,GUI_FONT_24B_ASCII);
        TEXT_SetBkColor(hText1,GUI_INVALID_COLOR);

        hText2 = TEXT_CreateEx(20,75,60,40,hwindow1,WM_CF_SHOW,TEXT_CF_HCENTER|TEXT_CF_VCENTER,GUI_ID_TEXT1,"LED1:");
        TEXT_SetTextColor(hText2,GUI_BLUE);
        TEXT_SetFont(hText2,GUI_FONT_24B_ASCII);
       
        WIDGET_SetDefaultEffect_None();       
        hButton_1 = BUTTON_CreateEx(100,30,40,20,hwindow1,WM_CF_SHOW|WM_CF_HASTRANS,0,GUI_ID_BUTTON0);
//        BUTTON_SetDefaultBkColor(GUI_INVALID_COLOR,BUTTON_CI_PRESSED |BUTTON_CI_UNPRESSED|BUTTON_CI_DISABLED);
  BUTTON_SetFocussable(hButton_1, 0);       
        BUTTON_SetBitmapEx(hButton_1,BUTTON_BI_UNPRESSED,&buttonbmp_tab[0],0,0);

        hButton_2 = BUTTON_CreateEx(100,75,128,128,hwindow1,WM_CF_SHOW|WM_CF_HASTRANS,0,GUI_ID_BUTTON1);
        BUTTON_SetBkColor(hButton_2,BUTTON_CI_UNPRESSED, (0XFFuL<<24)|GUI_BLUE);
        BUTTON_SetBkColor(hButton_2,BUTTON_CI_PRESSED, (0XFFuL<<24)|GUI_ORANGE);
//        BUTTON_SetDefaultBkColor(GUI_INVALID_COLOR,BUTTON_CI_PRESSED |BUTTON_CI_UNPRESSED|BUTTON_CI_DISABLED);
        BUTTON_SetFocussable(hButton_2,0);
        BUTTON_SetBitmapEx(hButton_2,BUTTON_BI_UNPRESSED,&buttonbmp_tab[0],0,0);

//        WM_SetDesktopColor(GUI_GREEN);
}

void CreateWindow2(void)
{

        hwindow2 = WM_CreateWindowAsChild(
                                                                                                                                                20,
                                                                                                                                                150,
                                                                                                                                                150,
                                                                                                                                                100,
                                                                                                                                                hwindow1,
                                                                                                                                                WM_CF_SHOW | WM_CF_MEMDEV | WM_CF_HASTRANS,
                                                                                                                                                h2_Getdata,
                                                                                                                                                0);
//        PROGBAR1 = PROGBAR_CreateEx(20,40,120,40,hwindow2,WM_CF_SHOW,PROGBAR_CF_HORIZONTAL,GUI_ID_PROGBAR1);
}

void SetDefaultSkin(void)
{
                //&#184;ü&#187;&#187;&#198;¤·&#244;
        BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
        CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
        DROPDOWN_SetDefaultSkin(DROPDOWN_SKIN_FLEX);
        FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
        HEADER_SetDefaultSkin(HEADER_SKIN_FLEX);
        MENU_SetDefaultSkin(MENU_SKIN_FLEX);
        MULTIPAGE_SetDefaultSkin(MULTIPAGE_SKIN_FLEX);
        PROGBAR_SetDefaultSkin(PROGBAR_SKIN_FLEX);
        RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
        SCROLLBAR_SetDefaultSkin(SCROLLBAR_SKIN_FLEX);
        SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
        SPINBOX_SetDefaultSkin(SPINBOX_SKIN_FLEX);
}
       
void windows(void)
{
        INT32U i,num;
        OS_STK_DATA StackBytes;
        GUI_EnableAlpha(1);
        WM_EnableMemdev(WM_HBKWIN);//&#198;&#244;ó&#195;′&#230;′¢éè±&#184;ó&#195;óú&#214;&#216;&#187;&#230;//WM_HBKWIN×à&#195;&#230;′°&#191;ú&#190;&#228;±ú
//        SetDefaultSkin();
        WM_SetCallback(WM_HBKWIN, BKWin_Getdata);
        CreateWindow1();
        CreateWindow2();
        while(1)
        {
                OSTaskStkChk(LED1_TASK_PRIO, &StackBytes);
                if(i == 10)
                {
                        i = 0;
                        num = StackBytes.OSUsed*100/(StackBytes.OSFree+StackBytes.OSUsed);
                        PROGBAR_SetValue(PROGBAR1,num);       
                }
                i++;
                GUI_Exec();
                OSTimeDly(50);
        }
}


按钮.png
回复 支持 反对

使用道具 举报

13

主题

206

帖子

1

精华

高级会员

Rank: 4

积分
613
金钱
613
注册时间
2014-10-26
在线时间
32 小时
发表于 2016-2-15 14:14:41 | 显示全部楼层
效果挺好的,赞一个
学习!
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2015-12-14
在线时间
15 小时
 楼主| 发表于 2016-2-15 14:49:28 | 显示全部楼层
q27488 发表于 2016-2-15 14:14
效果挺好的,赞一个

谢谢!!!!!!!!!!!!!!1
回复 支持 反对

使用道具 举报

18

主题

422

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1139
金钱
1139
注册时间
2014-5-24
在线时间
116 小时
发表于 2016-2-16 09:45:39 | 显示全部楼层
还可以,只是感觉灰蒙蒙的
I See Fire.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.  只给方向,不妨碍思考
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2015-12-14
在线时间
15 小时
 楼主| 发表于 2016-2-16 10:13:34 | 显示全部楼层
emWin 发表于 2016-2-16 09:45
还可以,只是感觉灰蒙蒙的

手机拍出来的就这效果
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2014-7-25
在线时间
4 小时
发表于 2016-6-5 12:16:45 | 显示全部楼层
能不能提供一下工程文件,或者在原子的例程上怎么改。我是个初学者,为什么我加什么函数都不好使,png转换后显示的图片乱码,开启alpha通道没反应,按钮的背景颜色设置也没反应。
回复 支持 反对

使用道具 举报

0

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2013-1-14
在线时间
30 小时
发表于 2016-6-11 11:08:29 | 显示全部楼层
赞一个,感谢分享
回复 支持 反对

使用道具 举报

25

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2016-6-2
在线时间
49 小时
发表于 2016-8-7 10:03:20 | 显示全部楼层

感谢 分享!
回复 支持 反对

使用道具 举报

6

主题

119

帖子

0

精华

高级会员

Rank: 4

积分
712
金钱
712
注册时间
2015-11-26
在线时间
139 小时
发表于 2016-9-22 15:32:58 | 显示全部楼层
按照楼主的方法为什么我的按钮无法设置透明呢?  位图无法将按钮全部覆盖,怎么解决的啊   谢谢
3.png
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2015-12-14
在线时间
15 小时
 楼主| 发表于 2016-10-14 14:48:46 | 显示全部楼层
hanzixi_angel 发表于 2016-9-22 15:32
按照楼主的方法为什么我的按钮无法设置透明呢?  位图无法将按钮全部覆盖,怎么解决的啊   谢谢

你用的图片应该不是透明化的图片吧,要用透明化的.png格式的图片。最简单是方法是在windows下吧图片打开,看是否是透明的。
回复 支持 反对

使用道具 举报

6

主题

119

帖子

0

精华

高级会员

Rank: 4

积分
712
金钱
712
注册时间
2015-11-26
在线时间
139 小时
发表于 2016-10-14 15:43:26 | 显示全部楼层
xyh2425 发表于 2016-10-14 14:48
你用的图片应该不是透明化的图片吧,要用透明化的.png格式的图片。最简单是方法是在windows下吧图片打开 ...

图片是透明的  下面的那个是按钮  上面的是透明的位图  按钮的四个角多出来的  不知道怎么去掉
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2015-12-14
在线时间
15 小时
 楼主| 发表于 2016-10-14 17:12:31 | 显示全部楼层
hanzixi_angel 发表于 2016-10-14 15:43
图片是透明的  下面的那个是按钮  上面的是透明的位图  按钮的四个角多出来的  不知道怎么去掉

把按钮的皮肤去掉
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2015-12-14
在线时间
15 小时
 楼主| 发表于 2016-10-14 17:16:14 | 显示全部楼层
hanzixi_angel 发表于 2016-10-14 15:43
图片是透明的  下面的那个是按钮  上面的是透明的位图  按钮的四个角多出来的  不知道怎么去掉

        hButton_2 = BUTTON_CreateEx(100,75,128,128,hwindow1,WM_CF_SHOW|WM_CF_HASTRANS,0,GUI_ID_BUTTON1);
        BUTTON_SetBkColor(hButton_2,BUTTON_CI_UNPRESSED, (0XFFuL<<24)|GUI_BLUE);
        BUTTON_SetBkColor(hButton_2,BUTTON_CI_PRESSED, (0XFFuL<<24)|GUI_ORANGE);
        BUTTON_SetFocussable(hButton_2,0);
不要设置皮肤,开启Alpha
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2015-2-11
在线时间
13 小时
发表于 2016-10-26 20:42:38 | 显示全部楼层
xyh2425 发表于 2016-10-14 17:16
hButton_2 = BUTTON_CreateEx(100,75,128,128,hwindow1,WM_CF_SHOW|WM_CF_HASTRANS,0,GUI_ID_BUT ...

你好,我也遇到了按钮不透明的问题,在我程序里,Alpha不能随便开,透明在paint里面是有其它效果的,不能一开始就把它打开。还有其它方法吗?
回复 支持 反对

使用道具 举报

7

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2016-10-25
在线时间
75 小时
发表于 2016-11-2 17:26:59 | 显示全部楼层
转化成565还是8888?
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2015-12-14
在线时间
15 小时
 楼主| 发表于 2016-11-8 14:15:00 | 显示全部楼层
ruoshui215113 发表于 2016-11-2 17:26
转化成565还是8888?

很久前搞的了,有印象记得是565,你可以都试试看!
回复 支持 反对

使用道具 举报

7

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2016-10-25
在线时间
75 小时
发表于 2016-11-10 15:47:10 | 显示全部楼层
xyh2425 发表于 2016-11-8 14:15
很久前搞的了,有印象记得是565,你可以都试试看!

好的 谢谢
回复 支持 反对

使用道具 举报

7

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2016-10-25
在线时间
75 小时
发表于 2016-11-10 15:47:28 | 显示全部楼层
xyh2425 发表于 2016-11-8 14:15
很久前搞的了,有印象记得是565,你可以都试试看!

好的 谢谢
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2018-2-19
在线时间
106 小时
发表于 2019-9-11 12:45:53 | 显示全部楼层
实测效果很好,谢谢楼主
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2019-8-19
在线时间
6 小时
发表于 2019-12-20 12:40:30 | 显示全部楼层
kk123456
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 08:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表