硬汉嵌入式论坛

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

[emWin] GUI_MEMDEV_CopyRect目的坐标不能输入任意值

[复制链接]

11

主题

60

回帖

93

积分

初级会员

积分
93
发表于 2025-7-15 23:08:38 | 显示全部楼层 |阅读模式
本帖最后由 njsssmq 于 2025-7-15 23:09 编辑

    GUI_MEMDEV_Handle hMemSrc,hMemDst;
   
    // 在源设备上绘制内容 (红色矩形)
    hMemSrc=GUI_MEMDEV_CreateFixed32(0,0,800,600);
    GUI_MEMDEV_Select(hMemSrc);
    GUI_SetBkColor(GUI_WHITE);
    GUI_Clear();
    GUI_SetColor(GUI_RED);
    GUI_FillRect(0, 0, 799, 599);
   
    // 在目标设备上绘制内容 (蓝色矩形)
    hMemDst=GUI_MEMDEV_CreateFixed32(0,0,800,600);
    GUI_MEMDEV_Select(hMemDst);
    GUI_SetBkColor(GUI_WHITE);
    GUI_Clear();
    GUI_SetColor(GUI_BLUE);
    GUI_FillRect(0, 0, 799, 599);
  
    GUI_MEMDEV_Select(0);
   
    GUI_RECT srcRect = {600, 0, 799, 599}; // 源区域
    int rsl = GUI_MEMDEV_CopyRect (hMemSrc, hMemDst, &srcRect, 0, 0);
    printf("rsl=%d\r\n",rsl);
  
    GUI_MEMDEV_CopyToLCD(hMemDst);
    while (1)
    {
      GUI_Exec();
    }
上面代码可以正常实现目的。当修改GUI_MEMDEV_CopyRect行,修改为GUI_MEMDEV_CopyRect (hMemSrc, hMemDst, &srcRect, 50, 0)执行就会出错。
GUI_MEMDEV_CopyRect目的坐标为0,0。srcRect可以设置设备边界边界内任意矩形。当不是0,0,srcRect就不能任意设置,
请问srcRect设置与GUI_MEMDEV_CopyRect目的坐标要如何设置呢。请大神指点。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-16 10:16:38 | 显示全部楼层
emWin的这个坐标问题确实头疼,经常不知道这个坐标是针对那个坐标系说的。

我自己后来放弃研究了,测试几次能用后就没研究了。
回复

使用道具 举报

11

主题

60

回帖

93

积分

初级会员

积分
93
 楼主| 发表于 2025-7-16 22:40:11 | 显示全部楼层
本帖最后由 njsssmq 于 2025-7-16 22:41 编辑

通过摸索发现:1、指定区域GUI_RECT起始位置为(0,0),GUI_MEMDEV_CopyRect目标坐标可以为设备边界内任意值;
                      2、GUI_MEMDEV_CopyRect目标坐标为(0,0),指定区域GUI_RECT可以为设备边界内任意区域。
       添加中间内存设备,实现二个内存设备区域复制粘贴。

  GUI_MEMDEV_Handle hMemSrc,hMemDst;
  int rsl;
  
  // 在源设备上绘制内容
  hMemSrc = GUI_MEMDEV_CreateFixed32(0, 0, 800, 600);
  .......

  // 在目标设备上绘制内容 (蓝色矩形)
  hMemDst = GUI_MEMDEV_CreateFixed32(0 ,0, 800, 600);
......
   
  // 源区域,可任意选择
  GUI_RECT srcRect = {600, 0, 799, 599};      
  hMemMid = GUI_MEMDEV_CreateFixed32(0 , 0, 800, 600);
  // 复制到中间设备(0,0)位置
  rsl = GUI_MEMDEV_CopyRect (hMemSrc, hMemMid, &srcRect, 0, 0);
  printf("1:rsl = %d\r\n",rsl);
  // 设置中间设备区域
  srcRect.x0 = 0;
  srcRect.y0 = 0;
  srcRect.x1 = 799 - 600;
  srcRect.y1 = 599;
  // 从中间位置复制到目标设备,目标坐标可任意指定
  rsl = GUI_MEMDEV_CopyRect (hMemMid, hMemDst, &srcRect, 50, 0);
  printf("2:rsl = %d\r\n",rsl);
      
  GUI_MEMDEV_Select(0);
  GUI_MEMDEV_CopyToLCD(hMemDst);
  while (1)
  {
    GUI_Exec();
  }
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-12 06:01 , Processed in 0.038019 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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