硬汉嵌入式论坛

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

[emWin] 设置剪裁区域后,内存设备无法显示

[复制链接]

24

主题

32

回帖

104

积分

初级会员

积分
104
发表于 2025-2-12 14:38:36 | 显示全部楼层 |阅读模式

    GUI_SetBkColor(get_bk_color());
    GUI_RECT _rect = rect_channel[ch];
    //GUI_SetClipRect(&_rect);
    (*channel_show[ch])(ch, rect_channel[ch]);
    //GUI_SetClipRect(NULL);
。。。。



void cb_TEXT_pressure_image(GUI_RECT *rect, uint8_t ch)
{
    extern GUI_CONST_STORAGE GUI_BITMAP bmpointer;
    extern GUI_CONST_STORAGE GUI_BITMAP bmpressure_bk;

    uint8_t mode = channel_param[ch]->pressure_mode;
    uint8_t unit = channel_param[ch]->pressure_unit;

    double range, pressure, angle;
   
    range = get_pressure_range(ch, 0, mode); // kpa
    pressure = get_pressure_value_kpa(ch);
    if (pressure < 0)
        pressure = 0;
    angle = pressure * 150.0 / range;
    if (angle > 180.0)
        angle = 180.0;

    static GUI_MEMDEV_Handle hMem2 = 0;
    static GUI_MEMDEV_Handle hMem = 0;

    if (hMem2 == 0)
    {
        hMem2 = GUI_MEMDEV_CreateFixed32(
            0, 0, bmpointer.XSize, bmpointer.YSize);
        GUI_MEMDEV_Select(hMem2);
        GUI_SetBkColor(0x0);
        // GUI_SetBkColor(get_box_color());
        GUI_Clear();

        GUI_DrawBitmap(&bmpointer, 0, 0);
        GUI_MEMDEV_Select(0);
    }

    if (hMem == 0)
    {
        hMem = GUI_MEMDEV_CreateFixed32(0, 0, bmpressure_bk.XSize, bmpressure_bk.YSize + 3);
    }
   
    GUI_MEMDEV_Select(hMem);
    GUI_SetBkColor(get_box_color());
    GUI_Clear();
    GUI_DrawBitmap(&bmpressure_bk, 0, 0);

    GUI_MEMDEV_RotateHQHR(hMem2, hMem, 0, 0, -angle * 1000, 1 * 1000);

    GUI_SetColor(get_font_color());
    GUI_SetFont(USER_FONT_14_ASCII);

    char buff[32] = {0};

    double val = get_pressure_value(ch, unit);
    if (val < 0)
        val = 0;
    if (unit == PRESSURE_UNIT_KPA || unit == PRESSURE_UNIT_MMHG)
    {
        sprintf(buff, "%d", (int)(val));
    }
    else
    {
        sprintf(buff, "%.1f", val);
    }

    GUI_RECT tmp;
    tmp.x0 = 23;
    tmp.x1 = tmp.x0 + 20;
    tmp.y0 = 29;
    tmp.y1 = tmp.y0 + 10;
    GUI_DispStringInRect(buff, &tmp, GUI_ALIGN_CENTER);

    GUI_MEMDEV_Select(0);
    GUI_MEMDEV_WriteAt(hMem, rect->x0 + 28, rect->y0 + 25);
    // GUI_MEMDEV_WriteAt(hMem, rect->x0, rect->y0);
    // GUI_MEMDEV_Delete(hMem);
}

测试屏蔽剪裁区域设置后,内存设备显示正常,这是不能这么用吗?




回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2025-2-13 10:37:30 | 显示全部楼层
看不到你的完整代码,这个函数cb_TEXT_pressure_image是仅调用一次,一直都有调用
回复

使用道具 举报

24

主题

32

回帖

104

积分

初级会员

积分
104
 楼主| 发表于 2025-2-13 14:07:42 | 显示全部楼层
eric2013 发表于 2025-2-13 10:37
看不到你的完整代码,这个函数cb_TEXT_pressure_image是仅调用一次,一直都有调用

完整的代码,涉及较多,所以省略了。cb_TEXT_pressure_image 只是channel_show指向的一个通道的页面显示的其中一个图块绘制函数。整页有三个通道,会调用3次,如果调用刷新的话,会周期调用的。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2025-2-14 09:16:57 | 显示全部楼层
ccc_clive 发表于 2025-2-13 14:07
完整的代码,涉及较多,所以省略了。cb_TEXT_pressure_image 只是channel_show指向的一个通道的页面显示 ...

那你这个调用姿势不太对,这个存储设备仅需创建一次后,后面使用不要频繁创建,这样存储设备就发挥不了优势了。图形内容变化不大的地方,仅绘制到存储设备一次,提前绘制后,后面不需要再往里面绘制了
回复

使用道具 举报

24

主题

32

回帖

104

积分

初级会员

积分
104
 楼主| 发表于 2025-2-15 11:22:34 | 显示全部楼层
eric2013 发表于 2025-2-14 09:16
那你这个调用姿势不太对,这个存储设备仅需创建一次后,后面使用不要频繁创建,这样存储设备就发挥不了优 ...

带有指针效果的图片,数据有变化就要刷新指针角度的,还涉及到图片旋转
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 21:48 , Processed in 0.223380 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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