硬汉嵌入式论坛

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

[emWin] emWin5.32版本能否在控件上层描绘2D图形?

  [复制链接]

3

主题

56

回帖

65

积分

初级会员

积分
65
发表于 2019-1-10 13:56:05 | 显示全部楼层 |阅读模式
想问一下,能否在控件上方用2D图形覆盖控件的一部分呢?我目前尝试了一下,建了一个窗口window,和若干个button,在WM_PAINT消息下,设置按键颜色,和绘制2D图形,但是图形始终在按键下面,有没有什么办法可以让2D覆盖button呢?
微信截图_20190110135408.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2019-1-10 14:20:14 | 显示全部楼层
做不到,你可以再创建一个按钮,使用按钮自定义回调函数绘制你的2D,然后此按钮叠加到你另外一个按钮上面即可。
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-1-10 15:09:38 | 显示全部楼层
eric2013 发表于 2019-1-10 14:20
做不到,你可以再创建一个按钮,使用按钮自定义回调函数绘制你的2D,然后此按钮叠加到你另外一个按钮上面即 ...

我刚刚试了一下按钮的自定义回调函数,画出来的2D,还是在其他按键下面的呀
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2019-1-10 15:25:42 | 显示全部楼层
溪云初_VS28s 发表于 2019-1-10 15:09
我刚刚试了一下按钮的自定义回调函数,画出来的2D,还是在其他按键下面的呀

使用对话框,主题框架采用window,然后对应的资源列表里面注意熟悉,你要放在上面的,最后写即可实现。
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-1-10 16:29:30 | 显示全部楼层
eric2013 发表于 2019-1-10 15:25
使用对话框,主题框架采用window,然后对应的资源列表里面注意熟悉,你要放在上面的,最后写即可实现。

我又改了一下,现在是给左边红色button设置了自定义回调函数,然后在它的回调里面画这个椭圆,我使用了WM_SelectWindow选择这个红色button的窗口,然后画椭圆。跑起来会提示图里的内容。
但如果我注释掉WM_SelectWindow的话,又没有画出2D图形来
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-1-10 16:30:19 | 显示全部楼层
本帖最后由 溪云初_VS28s 于 2019-1-10 16:31 编辑

C:\Users\Administrator\Desktop\微信截图_20190110162817.png
33333.png
22222.png
微信截图_20190110162055.png
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-1-10 16:40:10 | 显示全部楼层
溪云初_VS28s 发表于 2019-1-10 16:29
我又改了一下,现在是给左边红色button设置了自定义回调函数,然后在它的回调里面画这个椭圆,我使用了WM ...

我找到了,被我给Clear掉了,我这个粗心鬼
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-1-10 17:26:48 | 显示全部楼层
eric2013 发表于 2019-1-10 14:20
做不到,你可以再创建一个按钮,使用按钮自定义回调函数绘制你的2D,然后此按钮叠加到你另外一个按钮上面即 ...

你好,我想再问一下,在按键的自定义回调里面,能画出的2D图形大小,是不是会被这个按键的大小限制的?我现在画出来的椭圆,只有在红色button内部才有效。
微信截图_20190110172558.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2019-1-11 00:03:02 | 显示全部楼层
溪云初_VS28s 发表于 2019-1-10 17:26
你好,我想再问一下,在按键的自定义回调里面,能画出的2D图形大小,是不是会被这个按键的大小限制的?我 ...

是的,由你按钮创建时的大小决定的。
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-1-14 18:08:35 | 显示全部楼层
eric2013 发表于 2019-1-11 00:03
是的,由你按钮创建时的大小决定的。

恩恩,经过这几天实验,我上次的问题已经搞懂了。我想要的画面,需要我创建一个新按键,区域大小要覆盖掉下面的7个按键,并且在INIT_DIALOG消息里给这个新按键设置自定义回调函数,再把它通过WM_SetHasTrans设置为透明,然后在自定义回调的重绘消息里面绘制我的2D图形,这样就可以了。
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-1-14 18:10:23 | 显示全部楼层
本帖最后由 溪云初_VS28s 于 2019-1-14 18:12 编辑
eric2013 发表于 2019-1-11 00:03
是的,由你按钮创建时的大小决定的。

我想再请教一下,Window窗口可以设置为透明吗,我自己实验好像是不行。另外还有一个问题,就是GUI_DispString系列的API,可以显示希腊字母吗?我自己添加的Vernada字体,里面激活了希腊字母,但我通过GUI_DispStringAt显示出来的却不是我输入的希腊字图案。
微信图片_20190114181038.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2019-1-15 00:33:15 | 显示全部楼层
溪云初_VS28s 发表于 2019-1-14 18:10
我想再请教一下,Window窗口可以设置为透明吗,我自己实验好像是不行。另外还有一个问题,就是GUI_DispSt ...

1、透明可以:
http://www.armbbs.cn/forum.php?m ... hlight=%CD%B8%C3%F7

2、使用希腊字体的话,可以电脑端安装了这个字体,然后使用小软件FontCvt转换,之后再使用。
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-1-15 11:00:38 | 显示全部楼层
本帖最后由 溪云初_VS28s 于 2019-1-15 11:02 编辑

我就是用的这种办法呢,FontCvt转换了C文件,我把字体C文件加到了模拟器的工程里,显示ASCII字符没问题,就是这个lumda显示不出来
Lumda.png
Disp_lumda.png
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-1-15 11:03:40 | 显示全部楼层
eric2013 发表于 2019-1-15 00:33
1、透明可以:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=5606&highlight=%CD%B8%C3%F7

...

我用的搜狗输入法输入它  λλλλλ
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2019-1-16 00:27:36 | 显示全部楼层
溪云初_VS28s 发表于 2019-1-15 11:03
我用的搜狗输入法输入它  λλλλλ

调用emWin的函数使能UTF-8编码,并且你这个函数GUI_DispStringAt所在的源文件要用记事本另存为UTF-8编码
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-1-16 17:39:09 | 显示全部楼层
本帖最后由 溪云初_VS28s 于 2019-1-16 17:49 编辑
eric2013 发表于 2019-1-16 00:27
调用emWin的函数使能UTF-8编码,并且你这个函数GUI_DispStringAt所在的源文件要用记事本另存为UTF-8编码

谢谢,显示lumda的问题已经解决了。我想再请问,设置了自定义回调函数的按键,怎样可以设置它,在被按下后鼠标移到按键区以外的时候不改变背景色呢?简而言之就是,第1,3,5,7,9次按下并在按键区内松开按键时背景色始终为蓝色;第2,4,6,8,10次按下并在按键区内松开按键时背景色始终为绿色;而按下按键并在按键区以外松开时,并不改变按键的颜色。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2019-1-17 02:43:18 | 显示全部楼层
溪云初_VS28s 发表于 2019-1-16 17:39
谢谢,显示lumda的问题已经解决了。我想再请问,设置了自定义回调函数的按键,怎样可以设置它,在被按下 ...

次数的话,自己定义个计数变量解决。

而按下状态移出控件区域可以通过按钮的move out消息处理下。
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-1-17 13:38:47 | 显示全部楼层
eric2013 发表于 2019-1-17 02:43
次数的话,自己定义个计数变量解决。

而按下状态移出控件区域可以通过按钮的move out消息处理下。

好的,谢谢。
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-1-17 16:18:07 | 显示全部楼层
本帖最后由 溪云初_VS28s 于 2019-1-17 16:24 编辑
eric2013 发表于 2019-1-17 02:43
次数的话,自己定义个计数变量解决。

而按下状态移出控件区域可以通过按钮的move out消息处理下。

亲,咱们安富莱的emwin教程,有没有相关的技术讨论QQ群或者微信群呀,我刚开始接触这个,最近问题挺多的。有个群的话,会更方便些。我这边新的问题是:如何在没有父子关系的窗口间传递参数,以及如何在一个窗口内获取其他无父子关系的窗口的句柄呢(在不使用全局变量的情况下)。谢谢像EDIT控件章节教程的示例,通过发送自定义消息到桌面窗口,结合static变量进行重绘的方式,我觉得很方便。不过我现在是需要在一个三级界面里,通过EDIT输入数值,再把这个数值返回给二级界面。这两级界面我没有创建父子窗口关系。或者吧主方不方便加下QQ或者微信,我把界面示意图发给您,帮我指点一下应该如何设计逻辑关系。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2019-1-18 00:51:24 | 显示全部楼层
溪云初_VS28s 发表于 2019-1-17 16:18
亲,咱们安富莱的emwin教程,有没有相关的技术讨论QQ群或者微信群呀,我刚开始接触这个,最近问题挺多的 ...

调用函数WM_SendMessage或者WM_SendMessageNoPara均可
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-1-20 11:48:57 | 显示全部楼层
eric2013 发表于 2019-1-18 00:51
调用函数WM_SendMessage或者WM_SendMessageNoPara均可

我把1024*600分辨率的PNG图片放到NAND FLASH存储,显示的时候先用FATFS从FLASH里面读出,再刷新到屏幕。MCU是F429的,现在感觉速度很慢,使能存储设备的话,会不会有明显改善呢
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-1-20 12:46:36 | 显示全部楼层
eric2013 发表于 2019-1-18 00:51
调用函数WM_SendMessage或者WM_SendMessageNoPara均可

你好,还有一个问题是,如何在当前窗口的按键消息内,获取其他任意窗口控件的句柄呢。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2019-1-21 00:01:31 | 显示全部楼层
溪云初_VS28s 发表于 2019-1-20 11:48
我把1024*600分辨率的PNG图片放到NAND FLASH存储,显示的时候先用FATFS从FLASH里面读出,再刷新到屏幕。M ...

会的,另外最好是32位带宽的SDRAM
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2019-1-21 00:01:55 | 显示全部楼层
溪云初_VS28s 发表于 2019-1-20 12:46
你好,还有一个问题是,如何在当前窗口的按键消息内,获取其他任意窗口控件的句柄呢。

最好整成全局变量。
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-1-22 16:18:25 | 显示全部楼层
eric2013 发表于 2019-1-21 00:01
最好整成全局变量。

感谢汉哥,我现在用的STM32F429的芯片,外扩的16位宽的SDRAM,显示外部存储FLASH里面的PNG图片,耗时很长,明显能看到从上到下的滚屏现象。如果我把图片解码后,在程序里attribute到SDRAM,再显示,这样会解决滚屏吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2019-1-23 01:44:35 | 显示全部楼层
溪云初_VS28s 发表于 2019-1-22 16:18
感谢汉哥,我现在用的STM32F429的芯片,外扩的16位宽的SDRAM,显示外部存储FLASH里面的PNG图片,耗时很长 ...

学习下我们新版emWin教程的PNG章节,你要绘制到存储设备上才可以加速
http://www.armbbs.cn/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-1-23 18:08:10 | 显示全部楼层
本帖最后由 溪云初_VS28s 于 2019-1-23 18:13 编辑
eric2013 发表于 2019-1-23 01:44
学习下我们新版emWin教程的PNG章节,你要绘制到存储设备上才可以加速
http://www.armbbs.cn/forum.ph ...

汉哥,我现在已经使用了存储设备,先创建存储设备,然后选择其返回句柄,绘制图片。然后选择LCD,再执行存储设备绘制到LCD的操作。也使能了多缓冲。刷1024*600的效果依然感觉很慢。
int displyjpeg(u8 *JPEGFileName,u8 mode,u32 x,u32 y,int member,int denom)
{
        u16 bread;
        char *jpegbuffer;
        char result;
        int XSize,YSize;
        GUI_JPEG_INFO JpegInfo;
       
        //存储设备的句柄
        uint32_t t0, t1, i, count = 0;
        GUI_HMEM hMem;
        GUI_MEMDEV_Handle hMemBMP;
       
        float Xflag,Yflag;
       
        #if SYSTEM_SUPPORT_OS
                CPU_SR_ALLOC();
        #endif

        result = f_open(&JPEGFile,(const TCHAR*)JPEGFileName,FA_READ);        //打开文件
        //文件打开错误或者文件大于JPEGMEMORYSIZE
        if((result != FR_OK) || (JPEGFile.obj.objsize>JPEGMEMORYSIZE))         return 1;
       
        jpegbuffer=mymalloc(SRAMEX,JPEGFile.obj.objsize);        //申请内存
        if(jpegbuffer == NULL) return 2;
       
        #if SYSTEM_SUPPORT_OS
                OS_CRITICAL_ENTER();                //临界区
        #endif
               
        result = f_read(&JPEGFile,jpegbuffer,JPEGFile.obj.objsize,(UINT *)&bread); //读取数据
        if(result != FR_OK) return 3;
       
        #if SYSTEM_SUPPORT_OS
                OS_CRITICAL_EXIT();        //退出临界区
        #endif
       
        GUI_JPEG_GetInfo(jpegbuffer,JPEGFile.obj.objsize,&JpegInfo); //获取JEGP图片信息
        XSize = JpegInfo.XSize;        //获取JPEG图片的X轴大小
        YSize = JpegInfo.YSize;        //获取JPEG图片的Y轴大小
        //Edit by zhao
        hMemBMP = GUI_MEMDEV_CreateEx(0, 0, XSize, YSize, GUI_MEMDEV_HASTRANS);
        GUI_MEMDEV_Select(hMemBMP);
       
        switch(mode)
        {
                case 0:        //在指定位置显示图片
                        if((member == 1) && (denom == 1)) //无需缩放,直接绘制
                        {
                                GUI_JPEG_Draw(jpegbuffer,JPEGFile.obj.objsize,x,y);        //在指定位置显示JPEG图片
                        }else //否则图片需要缩放
                        {
                                GUI_JPEG_DrawScaled(jpegbuffer,JPEGFile.obj.objsize,x,y,member,denom);
                        }
                        break;
                case 1:        //在LCD中间显示图片
                        if((member == 1) && (denom == 1)) //无需缩放,直接绘制
                        {
                                //在LCD中间显示图片
                                GUI_JPEG_Draw(jpegbuffer,JPEGFile.obj.objsize,(lcddev.width-XSize)/2-1,(lcddev.height-YSize)/2-1);
                        }else //否则图片需要缩放
                        {
                                Xflag = (float)XSize*((float)member/(float)denom);
                                Yflag = (float)YSize*((float)member/(float)denom);
                                XSize = (lcddev.width-(int)Xflag)/2-1;
                                YSize = (lcddev.height-(int)Yflag)/2-1;
                                GUI_JPEG_DrawScaled(jpegbuffer,JPEGFile.obj.objsize,XSize,YSize,member,denom);
                        }
                        break;
        }
        //Edit by zhao
        GUI_MEMDEV_Select(0);
        t0 = GUI_GetTime();
        GUI_MEMDEV_WriteAt(hMemBMP, 0, 0);
        t1 = GUI_GetTime() - t0;
        //GUI_DispStringAt("速度 =  ms\r\n", 50,50);
        GUI_DispDecAt(t1, 50 ,50, 4);
       
       
        f_close(&JPEGFile);                        //关闭JPEGFile文件
        myfree(SRAMEX,jpegbuffer);        //释放内存
        return 0;
}

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2019-1-24 00:30:00 | 显示全部楼层
溪云初_VS28s 发表于 2019-1-23 18:08
汉哥,我现在已经使用了存储设备,先创建存储设备,然后选择其返回句柄,绘制图片。然后选择LCD,再执行 ...

你的驱动是不是没做好,绘制到存储设备里面了,还慢??
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-1-24 10:35:31 | 显示全部楼层
eric2013 发表于 2019-1-24 00:30
你的驱动是不是没做好,绘制到存储设备里面了,还慢??

驱动都是正点原子开发板提供的
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
 楼主| 发表于 2019-2-27 15:33:25 | 显示全部楼层
eric2013 发表于 2019-1-24 00:30
你的驱动是不是没做好,绘制到存储设备里面了,还慢??

汉哥,春节前一直在忙其他事情,没有搞GUI。最近节后回归GUI工作了,我之前的1024*600屏幕,显示图片慢,我发现正点原子的这个工程,GUI_PNG_Draw调用的底层是LTDC_Draw_Point();一个点一个点的画,速度当然会慢,奇怪的是我用的同一个工程去驱动800*480的屏幕,发现最终却没有调用LCD_Draw_Pint();
具体说明一下,我的操作流程如下:
1.上电初始化,MCU、GUI、FLASH芯片、SDRAM等。
2.创建存储设备,从FLASH里打开800*480的PNG图片,并在SDRAM里申请内存,把图片数据保存到存储设备。
3.把图片画到存储设备hMemPNG里面。
4.此后的每次画图,均从hMemPNG这个存储设备直接绘制到屏幕。
接下来我的改动是这样的,把1024*600这块屏幕的驱动接口的画点函数,改成了赋值0,也即黑色;把800*480屏幕的画点接口,也同样改成了赋值黑色。我重新下载了程序,发现1024屏幕显示出来的图片都变成了黑色,可以证明ewWin的PNG图片显示调用了画点函数;而800屏幕,则只有鼠标指针所对应的背景区域是黑色,图片完全正常显示。这可以证明此时emWin的PNG图片显示又不调用画点函数了。这会是什么问题?我接下来应该查看哪个接口程序呢。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 21:28 , Processed in 0.345179 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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