硬汉嵌入式论坛

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

[emWin] MEMDEV,GUI_MEMDEV_WriteAt在WM_PAINT调用的坐标位置问题

[复制链接]

25

主题

68

回帖

143

积分

初级会员

积分
143
发表于 2024-11-21 16:32:27 | 显示全部楼层 |阅读模式
//bmp图片
GUI_HMEM LCD_show_pic(uint16_t x,uint16_t y,char * sFilename)
{
        char *_acBuffer;
        int XSize, YSize;
        GUI_HMEM hMem;
        GUI_MEMDEV_Handle hMemBMP;
        taskENTER_CRITICAL();
        
        //GUI_Clear();
        #if 1
        result = f_mount(&fs, DiskPathSD, 0);
        if (result != FR_OK)
        {
                // 处理文件系统初始化失败的情况
                taskEXIT_CRITICAL();
                return -1;
        }
        #endif
        /* 打开文件 */               
        result = f_open(&file, sFilename,  FA_READ);
        if (result != FR_OK)
        {
                taskEXIT_CRITICAL();
                return -1;
        }
        /* 申请一块内存空间 并且将其清零 */        
        hMem = GUI_ALLOC_AllocZero(file.obj.objsize);
        if (hMem == NULL) {
               
                        /* 关闭文件 */
                f_close(&file);
                taskEXIT_CRITICAL();
                return -1;
        }        
        /* 将申请到内存的句柄转换成指针类型 */
        _acBuffer = GUI_ALLOC_h2p(hMem);
        /* 读取文件到动态内存 */
        result = f_read(&file, _acBuffer, file.obj.objsize, &bw);
        if (result != FR_OK || bw !=  file.obj.objsize)
        {
                        /* 关闭文件 */
                f_close(&file);
                /* 释放动态内存hMem */
                GUI_ALLOC_Free(hMem);
               
                taskEXIT_CRITICAL();
                return -1;
        }        
               
        taskEXIT_CRITICAL();
        XSize = GUI_BMP_GetXSize(_acBuffer);
        YSize = GUI_BMP_GetYSize(_acBuffer);
        hMemBMP = GUI_MEMDEV_CreateEx(x, y, XSize, YSize, GUI_MEMDEV_HASTRANS);//GUI_MEMDEV_HASTRANS
        GUI_MEMDEV_Select(hMemBMP);
        GUI_BMP_Draw(_acBuffer, x, y);        
        GUI_MEMDEV_Select(0);

        GUI_ALLOC_Free(hMem);
        /* 关闭文件 */
        f_close(&file);
                return  hMemBMP;
}



GUI_MEMDEV_Handle hMemBMP;

hMemBMP=LCD_show_pic(X,Y,"picture_path");
GUI_MEMDEV_WriteAt(hMemBMP,X,Y);

红色这两行在任意处调用都能刷出SD卡上的图片吗?X,Y有什么说法
我调用GUI_MEMDEV_WriteAt(hMemBMP,X,Y),XY传非零值都刷不出来图片,但是给0又只能在页面左上角刷图片

回复

使用道具 举报

25

主题

68

回帖

143

积分

初级会员

积分
143
 楼主| 发表于 2024-11-21 17:58:24 | 显示全部楼层
GUI_MEMDEV_WriteAt(hMemBMP,X,Y)的XY给值好像没用啊,只在屏幕左顶角刷,而且只能刷很小的图片,大图片只能刷一部分出来
仿真进LCD_show_pic()读取图片文件信息什么的也都没问题
回复

使用道具 举报

25

主题

68

回帖

143

积分

初级会员

积分
143
 楼主| 发表于 2024-11-21 18:05:55 | 显示全部楼层
把其他都屏蔽掉,在GUI_Init(); 后面直接调用hMemBMP=LCD_show_pic(X,Y,"picture_path");GUI_MEMDEV_WriteAt(hMemBMP,X,Y);测试正常刷新出来

在窗口里就有问题
资源表创建的窗口,在WM_PAINT消息里调用刷图片,指定XY失效,只在屏幕左顶角能刷很小的图片,大图片只能刷一小部分出来
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2024-11-22 10:07:36 | 显示全部楼层
ZYG_GYZ 发表于 2024-11-21 18:05
把其他都屏蔽掉,在GUI_Init(); 后面直接调用hMemBMP=LCD_show_pic(X,Y,"picture_path");GUI_MEMDEV_WriteA ...

在WM_PAINT里面调用有个相对坐标的问题。
回复

使用道具 举报

25

主题

68

回帖

143

积分

初级会员

积分
143
 楼主| 发表于 2024-11-22 13:17:14 | 显示全部楼层
eric2013 发表于 2024-11-22 10:07
在WM_PAINT里面调用有个相对坐标的问题。

麻烦能具体说说吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2024-11-23 10:34:20 | 显示全部楼层
ZYG_GYZ 发表于 2024-11-22 13:17
麻烦能具体说说吗?

具体的关系我没有去研究过,我早期使用是测试出来的,在我二代示波器里面这个函数用的非常多

https://www.armbbs.cn/forum.php? ... &extra=page%3D1
回复

使用道具 举报

25

主题

68

回帖

143

积分

初级会员

积分
143
 楼主| 发表于 2024-11-23 15:08:08 | 显示全部楼层
hMemBMP=LCD_show_pic(X,Y,"picture_path");
GUI_MEMDEV_WriteAt(hMemBMP,X,Y);
X,Y直接都给刷图片的位置坐标,保持一样就行,已解决

LCD_show_pic(X,Y,"picture_path");的XY是在XY坐标处创建出存储设备
GUI_MEMDEV_WriteAt(hMemBMP,X,Y);的XY是在XY坐标处刷出图片      都是相对于HBKWin的坐标(错了请指导告知)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 21:37 , Processed in 0.247409 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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