硬汉嵌入式论坛

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

[emWin] 使用WM_MoveTo等API移动图片,图片会闪烁

[复制链接]

1

主题

16

回帖

73

积分

初级会员

积分
73
发表于 2018-8-9 08:56:56 | 显示全部楼层 |阅读模式
请问是为什么?Delay时间变长会好,但是图片就不会顺畅的从a移动到b,而是会瞬移。是因为处理速度不够吗?我在pc上仿真就会出现问题= =.
下面是代码
void MovePic(WM_HWIN hItem, int period)
{

        int nowTime =  GUI_GetTime();
        float persent = ((float)(nowTime - StartTime) / (float)period );
        float thex = position_.startX+ persent*(position_.endX - position_.startX);
        float they = position_.startY+ persent*(position_.endY - position_.startY);
        if( persent > 1.0)
        {
                StartTime = GUI_GetTime();

                return;
        }
        //WM_MoveChildTo(hItem,thex,they);
//        GUI_SPRITE_SetBitmapAndPosition(,,thex,they);
        //WM_MoveTo(hItem,thex,they);
        WM_MoveTo(hItem,thex,they);
        //WM_SetWindowPos(hItem,thex,they,100,100);
}
WM_HWIN CreateWindow(void);
WM_HWIN CreateWindow(void) {
  WM_HWIN hWin;

  hWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbDialog, WM_HBKWIN, 0, 0);
  return hWin;
}

// USER START (Optionally insert additional public code)
// USER END

/*************************** End of file ****************************/
void MainTask()
{

        WM_HWIN  hWin0;
        WM_HWIN  hWin1;
        WM_SetCreateFlags(WM_CF_MEMDEV);
        GUI_Init();//初始化emWin/ucGUI
        //WM_MULTIBUF_Enable(1);
        //        CreateWindowLeft();
        WM_MOTION_Enable(1);

        movehItem = WM_GetDialogItem(CreateWindow(), ID_IMAGE_0);
        hWin0 = movehItem;
        GUI_Clear();
        StartTime = GUI_GetTime();
        position_.startX = 0;
        position_.startY = 0;
        position_.endX = 750;
        position_.endY = 300;

        //hWin1 = WM_CreateWindowAsChild(10, 30, 120, 60, hWin0, WM_CF_SHOW | WM_CF_MOTION_X | WM_CF_MOTION_Y, _cbWin1, 0);

        //        //GUI_JPEG_Draw(_acmytest_800x480,sizeof(_acmytest_800x480),0,0);
        while(1)
        {
                GUI_Delay(20);
                if(StartTime!=0)
                {
                        MovePic(movehItem,3000);
                        //GUI_Delay(50);
                }
                //                _cbDialog()
        } //调用GUI_Delay函数延时20MS(最终目的是调用GUI_Exec()函数)
}






回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117571
QQ
发表于 2018-8-9 09:08:00 | 显示全部楼层
看程序没发现什么问题,方便的话,发个完整点的程序,仅需应用部分即可,我可以直接复制到模拟器就能跑。
回复

使用道具 举报

1

主题

16

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2018-8-9 09:15:15 | 显示全部楼层
附件是代码~~

WindowDLG.c

20.12 KB, 下载次数: 60

回复

使用道具 举报

1

主题

16

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2018-8-9 09:15:55 | 显示全部楼层
本帖最后由 iZnoGouD 于 2018-8-9 09:20 编辑
eric2013 发表于 2018-8-9 09:08
看程序没发现什么问题,方便的话,发个完整点的程序,仅需应用部分即可,我可以直接复制到模拟器就能跑。

www大腿你好,把代码放在3L了
回复

使用道具 举报

1

主题

16

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2018-8-9 09:30:58 | 显示全部楼层
这是演示视频,优酷上传实在是太慢了= =.

lizi.wmv

40.4 KB, 下载次数: 57

回复

使用道具 举报

1

主题

16

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2018-8-9 09:34:26 | 显示全部楼层
本帖最后由 iZnoGouD 于 2018-8-9 09:35 编辑


终于上传成功了,就是视频中这种现象
回复

使用道具 举报

1

主题

16

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2018-8-9 09:46:39 | 显示全部楼层
eric2013 发表于 2018-8-9 09:08
看程序没发现什么问题,方便的话,发个完整点的程序,仅需应用部分即可,我可以直接复制到模拟器就能跑。

不好意思那个代码文件好像被加密了,我重新上传一份= =.

WindowDLG.c

20.12 KB, 下载次数: 48

回复

使用道具 举报

1

主题

16

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2018-8-9 09:56:32 | 显示全部楼层
对了如果移动的是一个色块而不是图片的话,就不会出现闪烁的现象,下面是代码
  1. /*********************************************************************
  2. *                    SEGGER Microcontroller GmbH                     *
  3. *        Solutions for real time microcontroller applications        *
  4. **********************************************************************
  5. *                                                                    *
  6. *        (c) 1996 - 2018  SEGGER Microcontroller GmbH                *
  7. *                                                                    *
  8. *        Internet: www.segger.com    Support:  support@segger.com    *
  9. *                                                                    *
  10. **********************************************************************

  11. ** emWin V5.48 - Graphical user interface for embedded applications **
  12. emWin is protected by international copyright laws.   Knowledge of the
  13. source code may not be used to write a similar product.  This file may
  14. only  be used  in accordance  with  a license  and should  not be  re-
  15. distributed in any way. We appreciate your understanding and fairness.
  16. ----------------------------------------------------------------------
  17. File        : MOTION_MovingWindow.c
  18. Purpose     : Shows how to use simple motion support
  19. Requirements: WindowManager - (x)
  20.               MemoryDevices - (x)
  21.               AntiAliasing  - ( )
  22.               VNC-Server    - ( )
  23.               PNG-Library   - ( )
  24.               TrueTypeFonts - ( )
  25. ----------------------------------------------------------------------
  26. */

  27. //
  28. // Recommended memory to run the sample with adequate performance
  29. //
  30. #define RECOMMENDED_MEMORY (1024L * 20)

  31. /*********************************************************************
  32. *
  33. *       Includes
  34. *
  35. **********************************************************************
  36. */
  37. #include "WM.h"

  38. /*********************************************************************
  39. *
  40. *       Types
  41. *
  42. **********************************************************************
  43. */
  44. typedef struct {
  45.   int Axis;
  46.   int Speed;
  47. } PARA;

  48. /*********************************************************************
  49. *
  50. *       Static data
  51. *
  52. **********************************************************************
  53. */
  54. static const PARA _aPara[] = {
  55.   { GUI_COORD_X, +100 },
  56.   { GUI_COORD_Y, +100 },
  57.   { GUI_COORD_X, -100 },
  58.   { GUI_COORD_Y, -100 },
  59. };

  60. /*********************************************************************
  61. *
  62. *       Static code
  63. *
  64. **********************************************************************
  65. */
  66. /*********************************************************************
  67. *
  68. *       _cbWin0
  69. */
  70. static void _cbWin0(WM_MESSAGE * pMsg) {
  71.   int xSize, ySize;

  72.   switch (pMsg->MsgId) {
  73.   case WM_PAINT:
  74.     xSize = LCD_GetXSize();
  75.     ySize = LCD_GetYSize();
  76.     GUI_DrawGradientV(0, 0, xSize, ySize, GUI_BLUE, GUI_BLACK);
  77.     GUI_SetColor(GUI_WHITE);
  78.     GUI_SetFont(&GUI_Font24_ASCII);
  79.     GUI_SetTextMode(GUI_TM_TRANS);
  80.     GUI_DispStringHCenterAt("WM_Motion - Sample", 160, 5);
  81.     break;
  82.   default:
  83.     WM_DefaultProc(pMsg);
  84.     break;
  85.   }
  86. }

  87. /*********************************************************************
  88. *
  89. *       _cbWin1
  90. */
  91. static void _cbWin1(WM_MESSAGE * pMsg) {
  92.   int xSize, ySize;

  93.   switch (pMsg->MsgId) {
  94.   case WM_PAINT:
  95.     xSize = WM_GetWindowSizeX(pMsg->hWin);
  96.     ySize = WM_GetWindowSizeY(pMsg->hWin);
  97.     GUI_DrawGradientV(0, 0, xSize, ySize, GUI_DARKGREEN, GUI_DARKRED);
  98.     GUI_SetTextMode(GUI_TM_TRANS);
  99.     GUI_DispStringHCenterAt("I am a window", xSize >> 1, 5);
  100.     GUI_DispStringHCenterAt("Try to catch me", xSize >> 1, 15);
  101.     GUI_DispStringAt("xPos: ", 20, 30);
  102.     GUI_DispDec(WM_GetWindowOrgX(pMsg->hWin), 3);
  103.     GUI_DispStringAt("yPos: ", 20, 40);
  104.     GUI_DispDec(WM_GetWindowOrgY(pMsg->hWin), 3);
  105.     GUI_SetColor(GUI_GRAY);
  106.     GUI_DrawRect(0, 0, xSize - 1, ySize - 1);
  107.     break;
  108.   default:
  109.     WM_DefaultProc(pMsg);
  110.     break;
  111.   }
  112. }

  113. /*********************************************************************
  114. *
  115. *       Public code
  116. *
  117. **********************************************************************
  118. */
  119. /*********************************************************************
  120. *
  121. *       MainTask
  122. */
  123. int StartTime = 0;

  124. typedef struct
  125. {
  126.         int startX;
  127.         int startY;
  128.         int endX;
  129.         int endY;
  130. }PositionXY;

  131. PositionXY position_;
  132. WM_HWIN movehItem;

  133. void MovePic(WM_HWIN hItem, int period)
  134. {

  135.         //int nowTime =  GUI_GetTime();
  136.         //int persent = ((nowTime - StartTime)*100 / period );
  137.         //int diff = nowTime - StartTime;

  138.         //int thex = position_.startX + 1;//persent*(position_.endX - position_.startX);

  139.         //int they = position_.startY + 1;//persent*(position_.endY - position_.startY);
  140.         //position_.startX = thex;
  141.         //position_.startY = they;


  142.         //if( diff > period)
  143.         //{
  144.         //        StartTime = GUI_GetTime();
  145.         //        position_.startX = 0;
  146.         //        position_.startY = 0;
  147.         //        return;
  148.         //}
  149.         int nowTime =  GUI_GetTime();
  150.         float persent = ((float)(nowTime - StartTime) / (float)period );
  151.         float thex = position_.startX+ persent*(position_.endX - position_.startX);
  152.         float they = position_.startY+ persent*(position_.endY - position_.startY);
  153.         if( persent > 1.0)
  154.         {
  155.                 StartTime = GUI_GetTime();

  156.                 return;
  157.         }
  158.         //WM_MoveTo(hItem,thex,they);
  159.         WM_MoveChildTo(hItem,thex,they);
  160.         //WM_SetWindowPos(hItem,thex,they,100,100);
  161. }

  162. void MainTask(void) {
  163.   WM_HWIN  hWin0;
  164.   WM_HWIN  hWin1;
  165.   int      xSize, ySize;
  166.   unsigned i;

  167.   WM_SetCreateFlags(WM_CF_MEMDEV);
  168.   GUI_Init();
  169.   //
  170.   // Check if recommended memory for the sample is available
  171.   //
  172.   if (GUI_ALLOC_GetNumFreeBytes() < RECOMMENDED_MEMORY) {
  173.     GUI_ErrorOut("Not enough memory available.");
  174.     return;
  175.   }
  176.   position_.endX = 300;
  177.   position_.endY = 300;
  178.   WM_MOTION_Enable(1);
  179.   xSize = LCD_GetXSize();
  180.   ySize = LCD_GetYSize();
  181.   hWin0 = WM_CreateWindowAsChild(0, 0, xSize, ySize, WM_HBKWIN, WM_CF_SHOW, _cbWin0, 0);
  182.   hWin1 = WM_CreateWindowAsChild(10, 30, 120, 60, hWin0, WM_CF_SHOW | WM_CF_MOTION_X | WM_CF_MOTION_Y, _cbWin1, 0);
  183.   while (1) {
  184.     for (i = 0; i < GUI_COUNTOF(_aPara); i++) {
  185.       WM_MOTION_SetSpeed(hWin1, _aPara[i].Axis, _aPara[i].Speed);
  186.       GUI_Delay(10);
  187.       WM_MOTION_SetDeceleration(hWin1, _aPara[i].Axis, 100);
  188.       GUI_Delay(10);
  189.           MovePic(hWin1,3000);
  190.     }
  191.   }
  192. }

  193. /*************************** End of file ****************************/
复制代码


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117571
QQ
发表于 2018-8-9 10:41:30 | 显示全部楼层
帮你简单修改了一个版本。
1、图片绘制到窗口上,移动窗口即可
2、模拟器是不支持多缓冲的,也就是调用函数WM_MOTION_Enable是没用的,需要特别设置。调用函数 WM_SetCreateFlags(WM_CF_MEMDEV);即可。


例子:
WindowDLG.c (33.2 KB, 下载次数: 52)

效果,不闪烁,这个是GIF在闪,在我们V6开发板上面使用三缓冲,效果很好:
1.gif
回复

使用道具 举报

1

主题

16

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2018-8-9 10:51:56 | 显示全部楼层
eric2013 发表于 2018-8-9 10:41
帮你简单修改了一个版本。
1、图片绘制到窗口上,移动窗口即可
2、模拟器是不支持多缓冲的,也就是调用函 ...

感谢大大!!
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117571
QQ
发表于 2018-8-9 16:48:58 | 显示全部楼层

后面还有什么问题,随时发帖交流
回复

使用道具 举报

1

主题

16

回帖

73

积分

初级会员

积分
73
 楼主| 发表于 2018-8-10 16:51:40 | 显示全部楼层
eric2013 发表于 2018-8-9 16:48
后面还有什么问题,随时发帖交流

谢谢大大,我之前是写pc软件的,一定多多交流嘿嘿嘿
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117571
QQ
发表于 2018-8-11 01:16:08 | 显示全部楼层
iZnoGouD 发表于 2018-8-10 16:51
谢谢大大,我之前是写pc软件的,一定多多交流嘿嘿嘿

回复

使用道具 举报

9

主题

50

回帖

77

积分

初级会员

积分
77
发表于 2021-8-13 14:38:07 | 显示全部楼层
eric2013 发表于 2018-8-9 10:41
帮你简单修改了一个版本。
1、图片绘制到窗口上,移动窗口即可
2、模拟器是不支持多缓冲的,也就是调用函 ...

用这个程序移动图片,白色背景就没问题。用了其他背景色就出现残影的情况

movegui-canliu.jpg
Snipaste_2021-08-13_14-37-55.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117571
QQ
发表于 2021-8-14 08:55:35 | 显示全部楼层
EmbeddedXGJ 发表于 2021-8-13 14:38
用这个程序移动图片,白色背景就没问题。用了其他背景色就出现残影的情况

你的窗口是直接创建在桌面窗口上吗,你的桌面窗口是否做重绘了
回复

使用道具 举报

9

主题

50

回帖

77

积分

初级会员

积分
77
发表于 2021-8-14 14:43:58 | 显示全部楼层
eric2013 发表于 2021-8-14 08:55
你的窗口是直接创建在桌面窗口上吗,你的桌面窗口是否做重绘了

是啊,没有重绘   Snipaste_adfdfafae.png 用的就这个帖子里你发的程序,只是改背景颜色而已
回复

使用道具 举报

9

主题

50

回帖

77

积分

初级会员

积分
77
发表于 2021-8-14 14:59:02 | 显示全部楼层
eric2013 发表于 2021-8-14 08:55
你的窗口是直接创建在桌面窗口上吗,你的桌面窗口是否做重绘了

懂了,这个改变颜色要在桌面的回调函数的WM_PAINT消息里面重绘
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-15 22:20 , Processed in 0.048233 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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