硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2538|回复: 7
收起左侧

[emWin] F429+RGB88屏幕+STemwin,想实现透明的弹窗,弹窗上面有触摸按钮

[复制链接]

19

主题

63

回帖

120

积分

初级会员

积分
120
发表于 2018-11-30 13:30:22 | 显示全部楼层 |阅读模式
前言:
实现弹窗,方法至少有两种,是我个人学习安富莱emwin 2000页教程后总结,
1.窗体形式:WM_CreateWindow(50,
                        50,
                        100,
                        100,
                        WM_CF_SHOW | WM_CF_HASTRANS,
                        _cbDialogLogWindows,
                        0);
2.对话框形式: GUI_CreateDialogBox(_aDialogCreateSetMode,
                                                        GUI_COUNTOF(_aDialogCreateSetMode),
                                                        _cbDialogSetModeWindows,
                                                        WM_HBKWIN,
                                                        0,
                                                        0);

如何实现透明:
1..窗体形式在WM_PAINT:中加入
                        //开启透明
                        GUI_SetUserAlpha(&AlphaState, 0xC0);
                        GUI_SetColor(GUI_TITLE_BK);
                        WM_GetClientRect(&pRect);
                        GUI_FillRoundedRect(pRect.x0, pRect.y0, pRect.x1, pRect.y1, 4);
                        //回复透明设置
                        GUI_RestoreUserAlpha(&AlphaState);
2.对话框形式:同上方法,不行,因为对话框本身有一个底,不知道怎么办了,

弹窗上的触摸按钮
1.窗体形式:不会再窗体上面放置按钮
//这样做不显示,只有一个透明弹窗
hItem = WM_GetDialogItem(pMsg->hWin, 100);
BUTTON_SetBitmap(hItem,BUTTON_BI_UNPRESSED,&bmmode_zhileng);
BUTTON_SetBitmap(hItem,BUTTON_BI_PRESSED,&bmmode_zhileng);
BUTTON_SetText(hItem, "LED2");

2..对话框形式:
//可以用这种方式添加按钮,但是没法透明
static const GUI_WIDGET_CREATE_INFO _aDialogCreateSetMode[] =
{
        { WINDOW_CreateIndirect,  "",   0,                                           70,          80, 150,        100,        0},/
        { BUTTON_CreateIndirect, "", GUI_ID_BUTTON0, GUI_MODE_ZHILENG_INDEX_X, GUI_MODE_ZHILENG_INDEX_Y, 40, 40, 0, 0x0, 0 },
        { BUTTON_CreateIndirect, "", GUI_ID_BUTTON1, GUI_MODE_ZHIRE_INDEX_X, GUI_MODE_ZHIRE_INDEX_Y, 40, 40, 0, 0x0, 0 },
        { BUTTON_CreateIndirect, "", GUI_ID_BUTTON2, GUI_MODE_TONGFENG_INDEX_X, GUI_MODE_TONGFENG_INDEX_Y, 40, 40, 0, 0x0, 0 },
        { BUTTON_CreateIndirect, "", GUI_ID_BUTTON3, GUI_MODE_CHUSHI_INDEX_X, GUI_MODE_CHUSHI_INDEX_Y, 40, 40, 0, 0x0, 0 },
        { BUTTON_CreateIndirect, "", GUI_ID_BUTTON4, GUI_MODE_SHUIMIAN_INDEX_X, GUI_MODE_SHUIMIAN_INDEX_Y, 40, 40, 0, 0x0, 0 },
};


问题:
1.窗体形式可以透明,但是不会在窗体上添加按钮
2.对话框上面会添加按钮,但是不会透明

如果想要实现透明弹窗,请问如何抉择和操作

感谢硬汉哥百忙之中给予无私的回复

79J)BDA0~]%B@ZHXNR4RLYK.png
回复

使用道具 举报

12

主题

104

回帖

140

积分

初级会员

积分
140
发表于 2018-11-30 14:01:49 | 显示全部楼层
敢问一句是要全透明的弹窗还是模糊透明弹窗呢?
第一种可以放按钮,用BUTTON_CreateEx()
第二种也可以透明,WM_SetHasTrans(),然后要+WM_SetCallback() 这个回调也是跟对话框的那条一样,或者对话框的回调用NULL,然后把回调填在这WM_SetCallback(回调函数)
第三种全透明的,就是看不见的,可以用WM_CreateWindowAsChild()  用wm_cf_hastrans
回复

使用道具 举报

19

主题

63

回帖

120

积分

初级会员

积分
120
 楼主| 发表于 2018-11-30 14:14:37 | 显示全部楼层
cz123123 发表于 2018-11-30 14:01
敢问一句是要全透明的弹窗还是模糊透明弹窗呢?
第一种可以放按钮,用BUTTON_CreateEx()
第二种也可以 ...

先谢谢老哥,我去按照方法试试,再次感谢
回复

使用道具 举报

19

主题

63

回帖

120

积分

初级会员

积分
120
 楼主| 发表于 2018-11-30 17:53:43 | 显示全部楼层
cz123123 发表于 2018-11-30 14:01
敢问一句是要全透明的弹窗还是模糊透明弹窗呢?
第一种可以放按钮,用BUTTON_CreateEx()
第二种也可以 ...

第二种也可以透明,WM_SetHasTrans(),然后要+WM_SetCallback() 这个回调也是跟对话框的那条一样,或者对话框的回调用NULL,然后把回调填在这WM_SetCallback(回调函数)

正解,搞定,谢谢老哥
回复

使用道具 举报

13

主题

38

回帖

77

积分

初级会员

积分
77
发表于 2018-12-17 14:42:56 | 显示全部楼层
cz123123 发表于 2018-11-30 14:01
敢问一句是要全透明的弹窗还是模糊透明弹窗呢?
第一种可以放按钮,用BUTTON_CreateEx()
第二种也可以 ...

cz123123您好:
請教您,WM_SetTransState()和WM_SetHasTrans()都可以設定為透明,請問這2個有什麼不一樣呢?

使用GUI_CreateDialogBox()+WM_CF_HASTRANS創建一個WINDOW窗口,為什麼無法讓WINDOW透明呢?但使用WM_CreateWindowAsChild()+WM_CF_HASTRANS就正常了呢? 2者有何差別嗎?

使用WM_SetHasTrans()+WM_SetCallback(),也可以讓WINDOW透明,請問上下2種方法是否有使用上的區別呢? 何時用哪一種較佳呢 感謝~

回复

使用道具 举报

12

主题

104

回帖

140

积分

初级会员

积分
140
发表于 2018-12-20 09:05:18 | 显示全部楼层
本帖最后由 cz123123 于 2018-12-20 09:33 编辑
victor0726 发表于 2018-12-17 14:42
cz123123您好:
請教您,WM_SetTransState()和WM_SetHasTrans()都可以設定為透明,請問這2個有什麼不一 ...

看需求的大哥。。。window控件类的,透明度一上用起来明显卡顿,好像测试过直接用wm_sethastrans()就有一次透明,如果不加wm_setcallback()的话就不会重绘页面,也就说这个透明窗口是一次性的,如果有按键更新就只是更新这个按键的位置而已。。至于为什么我也不清楚。
第二个是WM_CreateWindowAsChild()这类的,我曾经看过以前的开源源码,所以控件都是用这个来做底层窗口出来。。所以这个东西其实是比较底层的窗口,他的透明效果和使用 明显比window好一点,且不太卡,用起来也不会太多函数,我经常用这个做圆角矩形窗口,有空开源出来吧。。
第三就是wm_settransstate()和wm_sethastrans(),,,没用过第一个不太清楚,,,这些情况都是我用模拟器测了很多遍才试出来的。。里面不开源也不好解释。。我还是半桶水哈
这个帖子看看http://www.armbbs.cn/forum.php?mod=viewthread&tid=90895
回复

使用道具 举报

13

主题

38

回帖

77

积分

初级会员

积分
77
发表于 2018-12-25 16:58:29 | 显示全部楼层
cz123123

感謝回覆。
回复

使用道具 举报

13

主题

38

回帖

77

积分

初级会员

积分
77
发表于 2018-12-25 17:00:28 | 显示全部楼层
cz123123 发表于 2018-12-20 09:05
看需求的大哥。。。window控件类的,透明度一上用起来明显卡顿,好像测试过直接用wm_sethastrans()就有 ...


cz123123

感謝回覆。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-17 17:01 , Processed in 0.235147 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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