硬汉嵌入式论坛

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

[emWin] 按照教程操作并没有一次显示图片啊,什么情况?

[复制链接]

1

主题

5

回帖

15

积分

新手上路

积分
15
发表于 2018-7-3 08:22:21 | 显示全部楼层 |阅读模式
在论坛看了几个几个教程,都不能完成一次显示图片;
教程一:
/* 创建内存设备,并将ARGB8888格式的位图绘制到内存设备上 */
hMem3 = GUI_MEMDEV_CreateFixed(0, 0, 800, 480, GUI_MEMDEV_HASTRANS,
                GUI_MEMDEV_APILIST_32,
                GUI_COLOR_CONV_8888);
GUI_MEMDEV_Select(hMem3);
GUI_DrawBitmap(&bmbackgroud, 0, 0);   //实际执行这条语句就开始绘图了
GUI_MEMDEV_CopyToLCDAA(hMem3);   //并不是执行这条语句一次显示的

教程二:
/* 创建内存设备,并将ARGB8888格式的位图绘制到内存设备上 */
hMem3 = GUI_MEMDEV_CreateFixed(0, 0, 800, 480, GUI_MEMDEV_HASTRANS,
               GUI_MEMDEV_APILIST_32,
                GUI_COLOR_CONV_8888);
GUI_MEMDEV_Select(hMem3);
GUI_DrawBitmap(&bmbackgroud, 0, 0);  //实际执行这条语句就开始绘图了
GUI_MEMDEV_Select(0);                       //并不是执行这条语句一次显示的


教程三:

GUI_HMEM ShowJPEG2(void)
{
char *_acBuffer;
GUI_HMEM hMem;
GUI_MEMDEV_Handle hMemJPEG;
  
/* 申请一块内存空间 并且将其清零 */
hMem = GUI_ALLOC_AllocZero(sizeof(bmwww.pData));

/* 将申请到内存的句柄转换成指针类型 */
_acBuffer = GUI_ALLOC_h2p(hMem);
/* 读取文件到动态内存 */
CopyPicToSRAM(_acBuffer);

GUI_JPEG_GetInfo(_acBuffer, PIC_LEN, &JpegInfo); //把图片数据复制到动态内存_acBuffer

/* 创建内存设备,并将JPEG图片绘制到此内存设备里面,此内存设备要在主程序中用到
    所以退出此函数前,不要释放。
*/
hMemJPEG = GUI_MEMDEV_CreateEx(0, 0, JpegInfo.XSize, JpegInfo.YSize, GUI_MEMDEV_HASTRANS);
GUI_MEMDEV_Select(hMemJPEG);
GUI_JPEG_Draw(_acBuffer, PIC_LEN, 0, 0);  
//实际执行这条语句就开始绘图了

GUI_MEMDEV_Select(0);
/* 释放动态内存hMem */
GUI_ALLOC_Free(hMem);

return hMemJPEG;
}

以上几种方式都不能实现教程里说的,先把图片复制到LCD显存(存储设备)然后一次显示图片,请问我哪里错了吗?

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-7-3 09:45:58 | 显示全部楼层
QQ截图20180703094520.png
回复

使用道具 举报

1

主题

5

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2018-7-3 10:00:58 | 显示全部楼层

不是啊,在执行GUI_DrawBitmap就显示了,应该试便执行边显示的,所以觉得慢。执行到GUI_MEMDEV_WriteAt时图片都显示完了
回复

使用道具 举报

1

主题

5

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2018-7-3 10:03:32 | 显示全部楼层

        /* 创建内存设备,并将ARGB8888格式的位图绘制到内存设备上 */
//        hMem3 = GUI_MEMDEV_CreateFixed(0, 0, 800, 480, GUI_MEMDEV_HASTRANS,
//                                                                                             GUI_MEMDEV_APILIST_32,
//                                                                                             GUI_COLOR_CONV_8888);
//        GUI_MEMDEV_Select(hMem3);
//        GUI_DrawBitmap(&bmbackgroud, 0, 0);  
//        GUI_MEMDEV_Select(0);

//        /* 显示ARGB8888格式的位图 */
//        GUI_DispStringAt("This is ARGB8888 bitmap & GUI_MEMDEV_CreateFixed", 100, 350);
//        GUI_MEMDEV_WriteAt(hMem3, 20, 320);
这是完全参考教程内容的,执行完GUI_DrawBitmap(&bmbackgroud, 0, 0) 图片就已经显示完了,但过程时比较慢的, 在后面我也执行了这个GUI_MEMDEV_WriteAt(hMem3, 20, 320);,但图片已经显示出来了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-7-3 10:07:51 | 显示全部楼层
不忘初_t85E2 发表于 2018-7-3 10:00
不是啊,在执行GUI_DrawBitmap就显示了,应该试便执行边显示的,所以觉得慢。执行到GUI_MEMDEV_WriteAt时 ...


这里是将图片绘制到存储设备里面,并不是绘制到显示屏上。如果你那里调用GUI_DrawBitmap就开始显示,说明你的程序模板有问题。

看下你的动态内存是不是够大。也就是GUIConf.C文件里面定义的大小。
回复

使用道具 举报

1

主题

5

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2018-7-3 10:23:04 | 显示全部楼层
eric2013 发表于 2018-7-3 10:07
这里是将图片绘制到存储设备里面,并不是绘制到显示屏上。如果你那里调用GUI_DrawBitmap就开始显示,说 ...

我用的时其他其他牌子的F429核心板,提供的例程估计不完善;贵公司有核心板吗,能配5寸屏的,如果有,我司可以从贵公司采购,有量的哦。去你们淘宝店没找到核心板,核心板要求尺寸小,能配5寸屏直接显示,端口全部引出,出LCD屏占用的引脚,可用引脚不少于30,至少3个USART;
回复

使用道具 举报

3

主题

105

回帖

114

积分

初级会员

积分
114
发表于 2018-7-3 11:40:36 | 显示全部楼层
我猜是你GUI_MEMDEV_CreateFixed()函数返回0了,也就是memdev内存申请失败导致的。
回复

使用道具 举报

3

主题

105

回帖

114

积分

初级会员

积分
114
发表于 2018-7-3 11:42:54 | 显示全部楼层
另外建议,如果用memdev一次性输出到显存,建议使能窗口的WM_CF_LATE_CLIP,这样WM_PAINT就不会对调用很多次,也就不会需要申请和绘制很多次jpeg这些耗时工作。

点评

谢谢  发表于 2018-7-3 12:11
回复

使用道具 举报

1

主题

5

回帖

15

积分

新手上路

积分
15
 楼主| 发表于 2018-7-3 12:30:35 | 显示全部楼层
公仆 发表于 2018-7-3 11:42
另外建议,如果用memdev一次性输出到显存,建议使能窗口的WM_CF_LATE_CLIP,这样WM_PAINT就不会对调用很多 ...

你好,我用GUIBuilder中window控件做一个背景和文字显示,在需要时如何修改文字内容呢?:
/*********************************************************************
*
*       _cbDialog
*/
static void _cbDialog(WM_MESSAGE * pMsg) {
  const void * pData;
  WM_HWIN      hItem;
  U32          FileSize;
  // USER START (Optionally insert additional variables)
  // USER END

  switch (pMsg->MsgId) {
  case WM_INIT_DIALOG:
   //背景
    hItem = WM_GetDialogItem(pMsg->hWin, ID_IMAGE_0);
    pData = _GetImageById(ID_IMAGE_0_IMAGE_0, &FileSize);
    IMAGE_SetBMP(hItem, pData, FileSize);
    //文本
    GUI_UC_SetEncodeUTF8();
    hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);
    TEXT_SetFont(hItem, &GUI_FontFont_120);
    TEXT_SetTextAlign(hItem, GUI_TA_HCENTER | GUI_TA_VCENTER);
    TEXT_SetTextColor(hItem, GUI_WHITE);
    TEXT_SetText(hItem, "\xe6\xac\xa2\xe8\xbf\x8e\xe4\xbd\xbf\xe7\x94\xa8");
   ……
窗口生成后,我在其他地方需要修改文本内容,怎么改?
改的过程应该是先隐藏或删除之前文本,然后显示改后的文本,如何做到呢?
回复

使用道具 举报

3

主题

105

回帖

114

积分

初级会员

积分
114
发表于 2018-7-3 12:58:02 | 显示全部楼层
不忘初_t85E2 发表于 2018-7-3 12:30
你好,我用GUIBuilder中window控件做一个背景和文字显示,在需要时如何修改文字内容呢?:
/*********** ...

你可以在GUI_Init()之前调用WM_SetCreateFlags(xxx|WM_CF_LATE_CLIP),这样就能全局使能这个特性(注意,是在GUI_Init()之前哦,这个函数是可以在初始化之前调用的)。也可以在GUIBuilder生成的c文件里,找到如下位置修改,这样就仅限于该对话框了。
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  { WINDOW_CreateIndirect, "", ID_WINDOW_0,         0,   0, LCM_XSIZE_PHYS, LCM_YSIZE_PHYS, WM_CF_LATE_CLIP, 0x0, 0 },
};
回复

使用道具 举报

3

主题

105

回帖

114

积分

初级会员

积分
114
发表于 2018-7-3 13:03:44 | 显示全部楼层
TEXT控件修改文本,直接调用
char strbuffer[16];
hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);
sprintf(strbuffer, "%d", your_var);
TEXT_SetText(hItem,strbuffer);
即可。一般在WM_TIMER事件中,或者在你交互的按钮release事件中都行。不要在WM_PAINT事件里调用就行了!

点评

管用,非常管用,谢谢!  发表于 2018-7-3 13:17
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-7-3 13:12:20 | 显示全部楼层
不忘初_t85E2 发表于 2018-7-3 10:23
我用的时其他其他牌子的F429核心板,提供的例程估计不完善;贵公司有核心板吗,能配5寸屏的,如果有,我 ...

按照我们的教程重新移植下即可,这些就都能用了。

点评

嗯,好的,非常感谢  发表于 2018-7-3 13:15
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-7-3 13:15:06 | 显示全部楼层
不忘初_t85E2 发表于 2018-7-3 12:30
你好,我用GUIBuilder中window控件做一个背景和文字显示,在需要时如何修改文字内容呢?:
/*********** ...

获取句柄后,想那里修改都可以,定时更新的就创建个emWin的定时器功能,在WM_TIMER消息更新即可。如果是消息通知方式的,搞个emWin自定义消息即可,这些在教程都有讲解。
回复

使用道具 举报

1

主题

9

回帖

27

积分

新手上路

积分
27
发表于 2018-7-3 14:34:50 | 显示全部楼层
eric2013 发表于 2018-7-3 13:15
获取句柄后,想那里修改都可以,定时更新的就创建个emWin的定时器功能,在WM_TIMER消息更新即可。如果是 ...

OK,文本搞定了,如TEXT_SetText(WM_GetDialogItem(hWin, ID_TEXT_0), "hello");
图片怎么改??
/*********************************************************************
*
*       _cbDialog
*/
static void _cbDialog(WM_MESSAGE * pMsg) {
  const void * pData;
  WM_HWIN      hItem;
  U32          FileSize;
  // USER START (Optionally insert additional variables)
  // USER END

  switch (pMsg->MsgId) {
  case WM_INIT_DIALOG:
    //
    // 背景图片
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_IMAGE_0);
    pData = _GetImageById(ID_IMAGE_0_IMAGE_0, &FileSize);
    IMAGE_SetBMP(hItem, pData, FileSize);
    //
    // ICON1
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_IMAGE_1);
    pData = _GetImageById(ID_IMAGE_1_IMAGE_0, &FileSize);
    IMAGE_SetBMP(hItem, pData, FileSize);
    //
    // ICON2
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_IMAGE_2);
    pData = _GetImageById(ID_IMAGE_2_IMAGE_0, &FileSize);
    IMAGE_SetBMP(hItem, pData, FileSize);
  ……
ICON1和2是小尺寸图片,用什么命令可以隐藏指定ICONx ?
回复

使用道具 举报

1

主题

9

回帖

27

积分

新手上路

积分
27
发表于 2018-7-3 14:35:46 | 显示全部楼层
公仆 发表于 2018-7-3 13:03
TEXT控件修改文本,直接调用
char strbuffer[16];
hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);

朋友,图片怎么切换?有隐藏和显示方式吗?
回复

使用道具 举报

1

主题

9

回帖

27

积分

新手上路

积分
27
发表于 2018-7-3 14:52:18 | 显示全部楼层
我在case WM_INIT_DIALOG中显示了背景图,2个ICON小图,然后在需要改ICON的地方,采用初始化的方式覆盖图片,显示的缺还是原来的ICON,覆盖不了;

当前显示的是ICON2,我尝试用CON1(如下)覆盖ICON2,结果还是显示ICON2,   
hItem = WM_GetDialogItem(hWin, ID_IMAGE_1);
pData = _GetImageById(ID_IMAGE_1_IMAGE_0, &FileSize);
IMAGE_SetBMP(hItem, pData, FileSize);


是不是跟层有关系呢?
回复

使用道具 举报

1

主题

9

回帖

27

积分

新手上路

积分
27
发表于 2018-7-3 15:15:57 | 显示全部楼层
晕了,细节问题,改好了
回复

使用道具 举报

1

主题

9

回帖

27

积分

新手上路

积分
27
发表于 2018-7-3 15:30:51 | 显示全部楼层
本帖最后由 不忘初_THdRk 于 2018-7-3 15:35 编辑
公仆 发表于 2018-7-3 13:03
TEXT控件修改文本,直接调用
char strbuffer[16];
hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);

发现按这方法更改文本后背景图片会乱掉

背景重绘可以解决
回复

使用道具 举报

1

主题

9

回帖

27

积分

新手上路

积分
27
发表于 2018-7-3 15:57:21 | 显示全部楼层
eric2013 发表于 2018-7-3 10:07
这里是将图片绘制到存储设备里面,并不是绘制到显示屏上。如果你那里调用GUI_DrawBitmap就开始显示,说 ...

管理员你好,你说对了,就是动态内存配置问题,现在GUI_DrawBitmap不会绘制了。在执行完这个GUI_MEMDEV_WriteAt之后会显示,为什么还是慢呢,感觉比直接GUI_DrawBitmap还慢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-7-4 01:41:51 | 显示全部楼层
不忘初_THdRk 发表于 2018-7-3 15:57
管理员你好,你说对了,就是动态内存配置问题,现在GUI_DrawBitmap不会绘制了。在执行完这个GUI_MEMDEV_W ...

测量下时间
GUI_MEMDEV_WriteAt和GUI_DrawBitmap执行分别需要多少。估计你用的是16位带宽SDRAM。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-16 22:46 , Processed in 0.336826 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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