emwin的WM_SetCreateFlags(WM_CF_MEMDEV)

emwin的WM_SetCreateFlags(WM_CF_MEMDEV)

本来移植到正点原子的板子上(战舰V2, NTN35310),什么问题都没有,但是移植到自己的板子上之后,各种问题接踵而至,搞的焦头烂额,

就这个WM_SetCreateFlags(WM_CF_MEMDEV)搞了我一个星期,开始的时候,使用这个的时候直接黑屏,不使用的时候,正常显示,

开始在各种论坛网站寻找答案,有的说是内存不足,有的说是移植的模板不对等等。我全都尝试着修改,然并卵!

 

最后,没有办法了,只能自己搞一个就只显示背景色和显示按钮的工程,一步一步调试,调着调着发现,使用WM_SetCreateFlags和不使用走的不一样,

调用GUI_Delay(1);底层会调用GUI_Exec();然后会调用

 //
  // Only required for 16bpp color depth of target. Should be removed otherwise.
  //
  case 16:
    for (i = 0; i < ySize; i++) {
      _DrawBitLine16BPP(pDevice, x0, i + y0, (const U16 *)pData, xSize);
      pData += BytesPerLine;
    }
    break;

使用WM_SetCreateFlags会走_DrawBitLine16BPP,不使用是不会走这个函数的,这样就找到问题点在这了,然后慢慢的修改,

发现有时候背景能够显示一些线条,很高兴有没有,也很庆幸,为了好看设置了一个背景色,不然搞死都不知道正确的路径在那,最后的最后,终于搞定了

/*********************************************************************
*
*       Draw Bitmap 16 BPP, not optimized
*
* Purpose:
*   Drawing of 16bpp high color bitmaps.
*   Only required for 16bpp color depth of target. Should be removed otherwise.
*/
static void _DrawBitLine16BPP(GUI_DEVICE * pDevice, int x, int y, U16 const GUI_UNI_PTR * p, int xsize) {
//     for (;xsize > 0; xsize--, x++, p++) {
//        _SetPixelIndex(pDevice, x, y, *p);
//     }
     
    LCD_PIXELINDEX pixel;
    LCD_SetCursor(x,y);
    
    LCD_RS_CLR;
     LCD_CS_CLR; 
    DATAOUT(lcddev.wramcmd);//写指令  
    LCD_WR_CLR; 
    LCD_WR_SET; 
     LCD_CS_SET; 
    for (;xsize > 0; xsize--, x++, p++) 
    {
//      LCD_Fast_DrawPoint(x,y,*p);

     _SetPixelIndex(pDevice, x, y, *p);
} }

看起来很简单,但是没找到就是难搞,以此为记!

 

增加一条

发现在创建窗口之前调用这个函数,会使的后面的所有窗口都是使用到,会使刷新变慢

WM_SetCreateFlags(WM_CF_MEMDEV);
GUI_Init();
MainTask();

将{ WINDOW_CreateIndirect, "Window", ID_WINDOW_0, 0, 0, 480, 320, WM_CF_MEMDEV, 0x0, 0 },

放在这里就只有这一个窗口使用了,对其他的窗口无影响,能加快刷新速度!

posted @ 2019-10-29 16:00  钓梦叟  阅读(2289)  评论(0编辑  收藏  举报