硬汉嵌入式论坛

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

[emWin] 求助:将流位图 绘制到 emwin的存储设备 发现图像带上了毛边

[复制链接]

6

主题

34

回帖

52

积分

初级会员

积分
52
发表于 2020-4-15 12:27:15 | 显示全部楼层 |阅读模式
图片是一张PNG文件,通过软件转化成 .dta文件。并存储在外部设备中   
因为太多这种小的ICON图片,带有alp透明值。
直接使用 GUI_DrawStreamedBitmapAuto(UI_Main_Addr[0],0X00,0X00); 是能够正常显示,刷新一张图片约23ms。。。
因为需要使用滑动功能,个人感觉这个时间有点长。于是考虑将图片绘制到emwin的内存中。
   GUI_BITMAPSTREAM_INFO pInfo;
   GUI_GetStreamedBitmapInfo(UI_Main_Addr[0],&pInfo);
   hMemBMP = GUI_MEMDEV_CreateEx(0, 0,pInfo.Xsize,pInfo.Ysize,GUI_MEMDEV_HASTRANS);
   GUI_MEMDEV_Select(hMemBMP);
   GUI_DrawStreamedBitmapAuto(UI_Main_Addr[0],0X00,0X00);
   GUI_MEMDEV_Select(0);
//----------------------
显示发现ICO不透明部分与透明部分之间有一个像素是黑色的。
而直接调用GUI_DrawStreamedBitmapAuto(UI_Main_Addr[0],0X00,0X00); 是完全正常的。
同样将BMP文件绘制到内存设别中,显示是正常的,个人怀疑是因为BMP文件没有ALP通道的原因。
C00.png

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2020-4-15 12:32:15 | 显示全部楼层
重要说明,使用存储设备绘制透明图片,透明部分都是黑色背景解决办法
http://www.armbbs.cn/forum.php?m ... 8879&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

6

主题

34

回帖

52

积分

初级会员

积分
52
 楼主| 发表于 2020-4-15 13:11:40 | 显示全部楼层
完美解决   
只是这样存储空间大了很多。
还好 外挂了一个32Mbyte的SDRAM。。
回复

使用道具 举报

6

主题

34

回帖

52

积分

初级会员

积分
52
 楼主| 发表于 2020-4-16 20:03:55 | 显示全部楼层
eric2013 发表于 2020-4-15 12:32
重要说明,使用存储设备绘制透明图片,透明部分都是黑色背景解决办法
http://www.armbbs.cn/forum.php?mod ...

上次的问题解决了,,但是发现将图片绘制到内存设备, 绘图到显示器的事件,比直接使用DTA文件还长一点。所以最终还是使用DTA文件绘制。原因是绘制到内存设备是32位的,比DTA文件的16位当然是慢了很多。



今天打算制作一个时钟。。
:在WM_HBKWIN的上半部 绘制时间等,,,因为考虑到数字的形状比较特殊,因此使用贴图的方式。也就是时间是一个一个的数字图片贴上去的。

使用GUI_CreateDialogBox 创建,
发现两个问题,
1. 窗体不能透明。。 尽管已经使用  WM_SetTransState(pMsg->hWin,WM_CF_HASTRANS);。
     什么都不做就是白色的。

             case WM_PAINT:
               GUI_SetBkColor(GUI_TRANSPARENT);
              GUI_SetColor(GUI_TRANSPARENT);
              GUI_Clear();
       加上面的函数-背景就变成黑色的。就是不能够透明。
       但是使用 WM_CreateWindow(500,500,200,200,WM_CF_MOTION_X|WM_CF_SHOW|WM_CF_HASTRANS,_cbMtime,0);
        这个窗口却是透明的。


2. 上面数字的WM_NOTIFY_PARENT事件没办法传达。。尽管 TOUCH和PID事件已经输出。
    我怀疑是窗体对象搞错了。。可参考了很多代码,,没找到破绽。



相关函数

static const GUI_WIDGET_CREATE_INFO _aDialogCreateTime[] = {
  { WINDOW_CreateIndirect,"Tim",ID_WINDOW_Timer, 0,     0, 720, 256, WM_CF_HASTRANS|WM_CF_SHOW, 0x0, 0 },
  { IMAGE_CreateIndirect, "hH",ID_IMAGE_HH,Dt_TxS,Dt_Ty,Dt_TSizeX,Dt_TSizeY,IMAGE_CF_AUTOSIZE,0,0},
  { IMAGE_CreateIndirect, "hL",ID_IMAGE_HL,(Dt_TxS+1*Dt_TSizeX),Dt_Ty,Dt_TSizeX,Dt_TSizeY,IMAGE_CF_AUTOSIZE,0,0},
  { IMAGE_CreateIndirect, ":", ID_IMAGE_mao,(Dt_TxS+2*Dt_TSizeX),Dt_Ty,Dt_TSizeX,Dt_TSizeY,IMAGE_CF_AUTOSIZE,0,0},
  { IMAGE_CreateIndirect, "mH", ID_IMAGE_MH,(Dt_TxS+3*Dt_TSizeX),Dt_Ty,Dt_TSizeX,Dt_TSizeY,IMAGE_CF_AUTOSIZE,0,0},
  { IMAGE_CreateIndirect, "mL", ID_IMAGE_ML,(Dt_TxS+4*Dt_TSizeX),Dt_Ty,Dt_TSizeX,Dt_TSizeY,IMAGE_CF_AUTOSIZE,0,0},

  { IMAGE_CreateIndirect, "Y1", ID_IMAGE_Year1, Dt_DxS,Dt_Dy,Dt_DSizeX,Dt_DSizeY, IMAGE_CF_AUTOSIZE, 0, 0 },
  { IMAGE_CreateIndirect, "Y2", ID_IMAGE_Year2, (Dt_DxS+1*Dt_DSizeX),Dt_Dy,Dt_DSizeX,Dt_DSizeY, IMAGE_CF_AUTOSIZE, 0, 0 },
  { IMAGE_CreateIndirect, "Y3", ID_IMAGE_Year3, (Dt_DxS+2*Dt_DSizeX),Dt_Dy,Dt_DSizeX,Dt_DSizeY, IMAGE_CF_AUTOSIZE, 0, 0 },
  { IMAGE_CreateIndirect, "Y4", ID_IMAGE_Year4, (Dt_DxS+3*Dt_DSizeX),Dt_Dy,Dt_DSizeX,Dt_DSizeY, IMAGE_CF_AUTOSIZE, 0, 0 },
  { IMAGE_CreateIndirect, "-",  ID_IMAGE_YearP, (Dt_DxS+4*Dt_DSizeX),Dt_Dy,Dt_DSizeX,Dt_DSizeY, IMAGE_CF_AUTOSIZE, 0, 0 },
  { IMAGE_CreateIndirect, "M1", ID_IMAGE_Mouth1,(Dt_DxS+5*Dt_DSizeX),Dt_Dy,Dt_DSizeX,Dt_DSizeY, IMAGE_CF_AUTOSIZE, 0, 0 },
  { IMAGE_CreateIndirect, "M2", ID_IMAGE_Mouth2,(Dt_DxS+6*Dt_DSizeX),Dt_Dy,Dt_DSizeX,Dt_DSizeY, IMAGE_CF_AUTOSIZE, 0, 0 },
  { IMAGE_CreateIndirect, "-",  ID_IMAGE_MouthP,(Dt_DxS+7*Dt_DSizeX),Dt_Dy,Dt_DSizeX,Dt_DSizeY, IMAGE_CF_AUTOSIZE, 0, 0 },
  { IMAGE_CreateIndirect, "D1", ID_IMAGE_Date1, (Dt_DxS+8*Dt_DSizeX),Dt_Dy,Dt_DSizeX,Dt_DSizeY, IMAGE_CF_AUTOSIZE, 0, 0 },
  { IMAGE_CreateIndirect, "D2", ID_IMAGE_Date2, (Dt_DxS+9*Dt_DSizeX),Dt_Dy,Dt_DSizeX,Dt_DSizeY, IMAGE_CF_AUTOSIZE, 0, 0 },

  { IMAGE_CreateIndirect, "WK", ID_IMAGE_Week,  (Dt_DxS+11*Dt_DSizeX),Dt_Dy-6,140,33, IMAGE_CF_AUTOSIZE, 0, 0 },

}

/* 创建一个对话框,用于显示时间 */
hWinTime=GUI_CreateDialogBox(_aDialogCreateTime, GUI_COUNTOF(_aDialogCreateTime), &_cbShowTime, WM_HBKWIN,  0,0);


//-----回调
static void _cbShowTime(WM_MESSAGE * pMsg)
{WM_HWIN hWinT;
int NCode;
int Id;

switch (pMsg->MsgId)
    {case WM_INIT_DIALOG://init
          PrintTime_Work(pMsg);
          IMAGE_SetDTA(WM_GetDialogItem(pMsg->hWin,ID_IMAGE_mao),UI_Nor_Addr[UI_DigtalNum_Bigm],UI_Nor_Size[UI_DigtalNum_Bigm]);
          IMAGE_SetDTA(WM_GetDialogItem(pMsg->hWin,ID_IMAGE_Year1),UI_Nor_Addr[UI_DigtalNum_Lit0+2],UI_Nor_Size[UI_DigtalNum_Lit0+2]);
          IMAGE_SetDTA(WM_GetDialogItem(pMsg->hWin,ID_IMAGE_YearP),UI_Nor_Addr[UI_DigtalNum_LitP],UI_Nor_Size[UI_DigtalNum_LitP]);
          IMAGE_SetDTA(WM_GetDialogItem(pMsg->hWin,ID_IMAGE_MouthP),UI_Nor_Addr[UI_DigtalNum_LitP],UI_Nor_Size[UI_DigtalNum_LitP]);
          break;

         case WM_TIMER:
                    //GUI_SetBkColor(GUI_TRANSPARENT);
           PrintTime_Work(pMsg);
                   WM_RestartTimer(pMsg->Data.v, 1000);
          break;
         case WM_PAINT:
                   //WM_SetTransState(pMsg->hWin,WM_CF_HASTRANS);
                   //GUI_SetBkColor(GUI_TRANSPARENT);
              //GUI_SetColor(GUI_TRANSPARENT);
                  //GUI_Clear();
                  break;
     case WM_NOTIFY_PARENT://触摸上面的IMAGE 图片,不能产生事件,,从GUI的说明上是能产生3个事件的。
          Id = WM_GetId(pMsg->hWinSrc);//GUI_SetAlpha(0);
          NCode = pMsg->Data.v;
          switch(Id)
                  {case ID_IMAGE_HH:
                   case ID_IMAGE_HL:
                   case ID_IMAGE_mao:
                   case ID_IMAGE_ML:
                   case ID_IMAGE_MH:
                   
                                  break;

                default:break;
                   }
              break;
     default:
          WM_DefaultProc(pMsg);
    }
}







回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2020-4-16 22:20:06 | 显示全部楼层
lixin91985 发表于 2020-4-16 20:03
上次的问题解决了,,但是发现将图片绘制到内存设备, 绘图到显示器的事件,比直接使用DTA文件还长一点。 ...

1、绘制到存储设备也可以选择8bit,16bit,32bit。
2、这个模拟器里面有例子,找下。
3、创建个简单工程对话框看看是否正常。
回复

使用道具 举报

6

主题

34

回帖

52

积分

初级会员

积分
52
 楼主| 发表于 2020-4-20 20:39:52 | 显示全部楼层
今天 使用存储设备发现几个问题,看看是我的使用问题,还是普遍问题。
1. ICONVIEW 这个控件需要很快的刷新速度。。因为每次重绘,都是所有ICON 都重绘。。 要是10个按键,重绘的量还是不小的。
     感觉还不如用按钮控件,然后自定义皮肤。
2. GUI_MEMDEV_WriteAt 这个函数后面的坐标,一定是相对WM_HBKWIN,所以在回调函数使用 要特别注意。
     这个函数如果用到透明效果。抗锯齿能力大大减弱。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2020-4-20 20:44:42 | 显示全部楼层
lixin91985 发表于 2020-4-20 20:39
今天 使用存储设备发现几个问题,看看是我的使用问题,还是普遍问题。
1. ICONVIEW 这个控件需要很快的刷 ...

不是说进入多少次WM_PAINT,就整体更新多少次,他有个裁剪机制的,绘制有效区域
回复

使用道具 举报

6

主题

34

回帖

52

积分

初级会员

积分
52
 楼主| 发表于 2020-4-20 21:43:15 | 显示全部楼层
eric2013 发表于 2020-4-20 20:44
不是说进入多少次WM_PAINT,就整体更新多少次,他有个裁剪机制的,绘制有效区域

只要修改一个 item的参数,例如:ICONVIEW_SetItemText(hWinICON,ItemIndex,"push");

整个ICONVIEW更新一次。 几个ITEM 进入几次paint。每次paint全部重绘一次。。

除非你不调用任何set函数。使用内部默认的机制。
也没有找到,让某个ITEM重绘的函数。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115787
QQ
发表于 2020-4-20 22:36:41 | 显示全部楼层
lixin91985 发表于 2020-4-20 21:43
只要修改一个 item的参数,例如:ICONVIEW_SetItemText(hWinICON,ItemIndex,"push");

整个ICONVIEW更 ...

这么难用那就别用它了,无需纠结,自己自定义一个即可,简单省事。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-18 22:10 , Processed in 0.340270 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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