硬汉嵌入式论坛

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

[emWin] 关于emWin下png图片显示运行出错的问题

[复制链接]

3

主题

7

回帖

16

积分

新手上路

积分
16
QQ
发表于 2019-4-17 11:40:09 | 显示全部楼层 |阅读模式
本帖最后由 凡吹羽_xXQqf 于 2019-4-17 11:44 编辑

我需要在屏幕创建了一个窗口,在窗口下创建TEXT控件显示一个动态的数字,为了避免刷新是闪烁,在主函数里添加代码:
WM_SetCreateFlags(WM_CF_MEMDEV);
但是添加了之后背景图片却显示不了(不添加上面函数图片显示正常),运行报错提示:
GUI_PNG.c:Error in _png_cexcept_errot().
详细代码如下:
#include "DIALOG.h"
#include "backgrond.h"


#define ID_WINDOW_0         (GUI_ID_USER + 0x00)
#define ID_IMAGE_0         (GUI_ID_USER + 0x01)
#define ID_TEXT_0         (GUI_ID_USER + 0x02)


#define ID_IMAGE_0_IMAGE_0       0x00


#define RECOMMENDED_MEMORY (1024L * 160)


static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
  { WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 0, 0, 800, 480, 0, 0x0, 0 },
  { IMAGE_CreateIndirect, "Image_png", ID_IMAGE_0, 0, 0, 800, 480, 0, 0, 0 },
   { TEXT_CreateIndirect, "Text1", ID_TEXT_0, 30, 198, 100, 41, 0, 0x64, 0 },
};


static const void * _GetImageById(U32 Id, U32 * pSize) {
  switch (Id) {
  case ID_IMAGE_0_IMAGE_0:
    *pSize = sizeof(_acBackgrond);
    return (const void *)_acBackgrond;
  }
  return NULL;
}


static void _cbDialog(WM_MESSAGE * pMsg) {
  const void * pData;
  WM_HWIN      hItem;
  U32          FileSize;


  switch (pMsg->MsgId) {
  case WM_INIT_DIALOG:


      WINDOW_SetBkColor(pMsg->hWin, GUI_GRAY);
    // Initialization of 'Image_png'
    hItem = WM_GetDialogItem(pMsg->hWin, ID_IMAGE_0);
    pData = _GetImageById(ID_IMAGE_0_IMAGE_0, &FileSize);
    IMAGE_SetPNG(hItem, pData, FileSize);
    // Initialization of 'Text1'
    hItem = WM_GetDialogItem(pMsg->hWin, ID_TEXT_0);
    TEXT_SetFont(hItem, GUI_FONT_D32);
    TEXT_SetTextColor(hItem, GUI_MAKE_COLOR(0x00FFFFFF));
    TEXT_SetText(hItem, "00");
    break;
  default:
    WM_DefaultProc(pMsg);
    break;
  }
}
// USER START (Optionally insert additional public code)
void MainTask(void) {
    WM_HWIN  hWin;
    WM_HWIN hText;
    char acText[3] = { 0 };
    int value=0;
    WM_SetCreateFlags(WM_CF_MEMDEV);


    GUI_Init();
    if (GUI_ALLOC_GetNumFreeBytes() < RECOMMENDED_MEMORY) {
        GUI_ErrorOut("Not enough memory available.");
        return;
    }
    hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
    while (1) {
        GUI_Delay(10);
        sprintf(acText, "%2d", value++);


        hText = WM_GetDialogItem(hWin, ID_TEXT_0);
        TEXT_SetText(hText, acText);
    }
}
// USER END

添加
WM_SetCreateFlags(WM_CF_MEMDEV);
错误提示:

不添加下行代码会出现闪烁,图片中看不出来

WM_SetCreateFlags(WM_CF_MEMDEV);

png_xx.zip

883.41 KB, 下载次数: 8

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-4-17 11:45:15 | 显示全部楼层
是不是在模拟器上面测试的,将完整的模拟器程序压缩上传下,我试试。
回复

使用道具 举报

3

主题

7

回帖

16

积分

新手上路

积分
16
QQ
 楼主| 发表于 2019-4-17 12:04:10 | 显示全部楼层
eric2013 发表于 2019-4-17 11:45
是不是在模拟器上面测试的,将完整的模拟器程序压缩上传下,我试试。

上面上传了附件
png_xx.zip你看看
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-4-17 12:05:27 | 显示全部楼层
凡吹羽_xXQqf 发表于 2019-4-17 12:04
上面上传了附件
png_xx.zip你看看

这个看不出问题来,直接上完整模拟器程序,否则无法帮助你
回复

使用道具 举报

3

主题

7

回帖

16

积分

新手上路

积分
16
QQ
 楼主| 发表于 2019-4-17 12:38:42 | 显示全部楼层
eric2013 发表于 2019-4-17 12:05
这个看不出问题来,直接上完整模拟器程序,否则无法帮助你

麻烦了,工程打包好附件已上传

SeggerEval_WIN32_MSVC_MinGW_GUI_V548.zip

8.29 MB, 下载次数: 9

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-4-17 14:03:33 | 显示全部楼层
凡吹羽_xXQqf 发表于 2019-4-17 12:38
麻烦了,工程打包好附件已上传

你没有移植PNG的库,从5.3x版本开始,由于版权问题,emWin已经没有自带PNG库了。
回复

使用道具 举报

3

主题

7

回帖

16

积分

新手上路

积分
16
QQ
 楼主| 发表于 2019-4-17 14:23:32 | 显示全部楼层
eric2013 发表于 2019-4-17 14:03
你没有移植PNG的库,从5.3x版本开始,由于版权问题,emWin已经没有自带PNG库了。

我把代码    WM_SetCreateFlags(WM_CF_MEMDEV);
注释掉就图片显示正常,应该不是png库的问题,把548的库加进去也还是一样

TIM截图20190417142245.png
TIM截图20190417141759.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-4-17 15:05:19 | 显示全部楼层
帮你直接在我们V6板子上面测试了,没问题

QQ截图20190417150442.jpg
回复

使用道具 举报

5

主题

582

回帖

597

积分

版主

Rank: 7Rank: 7Rank: 7

积分
597
发表于 2019-4-17 15:51:31 | 显示全部楼层
我用vc6帮你测试了下,你的例子是对的,WM_SetCreateFlags(WM_CF_MEMDEV);开不开都可以
回复

使用道具 举报

3

主题

7

回帖

16

积分

新手上路

积分
16
QQ
 楼主| 发表于 2019-4-17 16:25:51 | 显示全部楼层
myxiaonia 发表于 2019-4-17 15:51
我用vc6帮你测试了下,你的例子是对的,WM_SetCreateFlags(WM_CF_MEMDEV);开不开都可以

找到原因了,主要是因为在GUIConf.c文件中内存设置是默认的2M,打开WM_CF_MEMDEV 会消耗一些资源,把内存设置改大一点(比如改成5M #define GUI_NUMBYTES  0x500000)就行了
回复

使用道具 举报

3

主题

7

回帖

16

积分

新手上路

积分
16
QQ
 楼主| 发表于 2019-4-17 16:26:58 | 显示全部楼层
eric2013 发表于 2019-4-17 15:05
帮你直接在我们V6板子上面测试了,没问题

嗯问题找到了,非常感谢
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-18 05:46 , Processed in 0.302611 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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