硬汉嵌入式论坛

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

[GUI] 求助,第一次用emwin,窗口坐标很奇怪!

[复制链接]

3

主题

22

回帖

31

积分

新手上路

积分
31
发表于 2023-11-30 18:18:54 来自手机 | 显示全部楼层 |阅读模式
用h743驱动圆屏幕,在看论坛上时钟的实现用了存储器和窗口,但我写GUI_DrawBitmap(&图片指针,0,0)显示是正常的,但是移植论坛上炫酷时钟表盘设计,明明写的也是GUI_DrawBitmap(&图片指针,0,0),窗口的vm创建函数也是x0,y0从0开始,但就是图片产生偏移。
IMG_3984.jpeg
回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-11-30 18:19:12 来自手机 | 显示全部楼层
大家看看我的函数,基本差不多。
回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-11-30 18:19:39 来自手机 | 显示全部楼层
        WM_MULTIBUF_Enable(1);            //         //    GUI_SetBkColor(GUI_RED); //    GUI_Clear();      /* 获取*/     xSize = 480;     ySize = 480;          /* 时钟表盘所需存储设备 */     hMemBK = GUI_MEMDEV_CreateFixed(0,0, bmshengsu.XSize, bmshengsu.YSize, GUI_MEMDEV_HASTRANS, GUI_MEMDEV_APILIST_32, GUI_COLOR_CONV_8888);          /* 时钟秒针所需存储设备 */     hMemSec = GUI_MEMDEV_CreateFixed(0,0,bmshengsu.XSize, bmshengsu.YSize, GUI_MEMDEV_HASTRANS, GUI_MEMDEV_APILIST_32, GUI_COLOR_CONV_8888);      /* 时钟目的存储所需存储设备 */     hMemDST =GUI_MEMDEV_CreateFixed(0, 0,bmshengsu.XSize, bmshengsu.YSize, GUI_MEMDEV_NOTRANS, GUI_MEMDEV_APILIST_32, GUI_COLOR_CONV_8888);        /* 将时钟表盘绘制到存储设备 */     GUI_MEMDEV_Select(hMemBK);     GUI_SetBkColor(GUI_TRANSPARENT);     GUI_Clear();     GUI_DrawBitmap(&bmshengsu, 0, 0);      GUI_MEMDEV_Select(0); //  //    /* 将秒针绘制到存储设备 */     GUI_MEMDEV_Select(hMemSec);     GUI_SetBkColor(GUI_TRANSPARENT);     GUI_Clear();     GUI_DrawBitmap(&bmzhizhen2, 0, 0);      GUI_MEMDEV_Select(0);        /* 创建一个窗口,用于绘制时钟 */ //    WM_CreateWindowAsChild(0,  //                           0,  //                           xSize, //                           ySize,  //                           NULL,  //                           WM_CF_SHOW,  //                           _cbClock,  //                           0);                                                                                                                                                                                                                    WM_CreateWindow(0,0,480,480,WM_CF_SHOW,_cbClock,0);
回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-11-30 18:20:40 来自手机 | 显示全部楼层
单独调用画图函数是能填充整个屏幕的,我怀疑坐标是有问题,但我不清楚都是从0开始为什么会产生偏移
回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-12-1 08:03:23 来自手机 | 显示全部楼层
自己顶一下,求大佬帮忙
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106739
QQ
发表于 2023-12-1 08:30:29 | 显示全部楼层
这两个例子吗
V7-579_emWin6.x炫酷时钟表盘设计,结合硬件RTC(裸机)
V7-580_emWin6.x炫酷时钟表盘设计,结合硬件RTC(RTOS)

这个是坐标位置问题,使用了存储设备后,要正确的设置坐标位置。
回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-12-1 09:15:09 来自手机 | 显示全部楼层
eric2013 发表于 2023-12-1 08:30
这两个例子吗
V7-579_emWin6.x炫酷时钟表盘设计,结合硬件RTC(裸机)
V7-580_emWin6.x炫酷时钟表盘设计 ...

对的大佬,就是这两个例子。但我不清楚如何正确设置坐标,我屏幕是480乘480,我创建窗口函数VM_Create WindowsAsChild(0,0,480,480….这样设置的,就发现这种情况。这个是子窗口创建,我直接用Vmcreatewindos也是这种情况。不太理解这个坐标难道是相对的?我应该如何设置?
回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-12-1 09:21:35 来自手机 | 显示全部楼层
eric2013 发表于 2023-12-1 08:30
这两个例子吗
V7-579_emWin6.x炫酷时钟表盘设计,结合硬件RTC(裸机)
V7-580_emWin6.x炫酷时钟表盘设计 ...

啊呀,谢谢大佬提醒我再看了遍函数和学习了正点原子emwin窗口的视频,原来主循环里的delay会一直触发信息WM_PAINT这个消息,回调函数里这个触发消息后执行的函数我没改动,怪不得。而且通过延迟才出发这个消息,还是第一次见这种操作。还有我老是把WM看成VM
回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-12-1 10:51:48 来自手机 | 显示全部楼层
eric2013 发表于 2023-12-1 08:30
这两个例子吗
V7-579_emWin6.x炫酷时钟表盘设计,结合硬件RTC(裸机)
V7-580_emWin6.x炫酷时钟表盘设计 ...

大佬,我移植这个程序还有个问题,回調函数里的WM_TIMER我发现只触发了一次,后面再也不触发了,我没用rtc,而是自己赋了个值i,每次回調函数触发+1角度,我想调用我的指针旋转,只转动了一次,为什么呢?
回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-12-1 11:46:05 | 显示全部楼层
static void _cbClock(WM_MESSAGE * pMsg) {
    GUI_MEMDEV_Handle ret;

    int      t0;   /* 用于三个指针的计数 */
//    int      t1;
//    int      t2;
                int                 i=0;
   
    switch (pMsg->MsgId) {
        case WM_CREATE:
            /* 创建定时器 */
            WM_CreateTimer(pMsg->hWin, /* 接受信息的窗口的句柄 */
                            0,                /* 用户定义的Id。如果不对同一窗口使用多个定时器,此值可以设置为零。 */
                            10,        /* 周期,此周期过后指定窗口应收到消息*/
                            0);                   /* 留待将来使用,应为0 */

            break;

        /* 定时1秒更新一次时间 */
        case WM_TIMER:
            WM_RestartTimer(pMsg->Data.v, 1000);

            i+=1;
                                               
                               
            /* 第一个指针计数,用于旋转秒针 */
            t0 = 360 -  i;


            /* 将相关内容绘制到存储设备hMemDST里面 */
            ret = GUI_MEMDEV_Select(hMemDST);
//                                                if(i%2==0){
//           
//                                                        LED1(1);
//                                                }
//                                                else{
//                                                LED1(0);}
            GUI_Clear();

            /* 绘制时钟表盘 */
            GUI_MEMDEV_WriteAt(hMemBK,0, 0);

            /* 绘制秒针 */
            GUI_MEMDEV_RotateHQ(hMemSec, hMemDST, 0, 0, t0 * 1000, 1000);

            GUI_MEMDEV_Select(ret);
                                               
                                               
            
            /* 执行窗口无效化,会触发执行WM_PAINT消息 */
            WM_InvalidateWindow(pMsg->hWin);
            break;

        case WM_PAINT:
                                        GUI_MEMDEV_WriteAt(hMemDST, 0 , 0);//从左上角x:0 y:0开始绘制
                                                        LED0(0);
                                                delay_ms(500);
                                                LED0(1);
                                                delay_ms(500);
            break;

        default:
            WM_DefaultProc(pMsg);
            break;
    }
}


回调函数 我用点灯方式在WM_TIMER消息中发现第一次进入WM_TIMER i加了1,所以是奇数,灯亮了,图片也旋转了度数,但是之后就一直亮着图片也没变化,然后再WM_PAINT消息了加入闪烁另外的灯程序,是正常的,也就是说执行了一次WM_TIMER后一直在执行WM_PAINT,有点奇怪。
回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-12-1 15:04:01 | 显示全部楼层
eric2013 发表于 2023-12-1 08:30
这两个例子吗
V7-579_emWin6.x炫酷时钟表盘设计,结合硬件RTC(裸机)
V7-580_emWin6.x炫酷时钟表盘设计 ...

大佬,我发现我这个变量i需要放到外面才能旋转,但我想加快旋转速度让它看起来像是仪表盘,但是我将WM_RestartTimer(pMsg->Data.v, 1000);改为WM_RestartTimer(pMsg->Data.v, 1);好像都是一秒转一次,这是为什么
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106739
QQ
发表于 2023-12-2 09:54:34 | 显示全部楼层
老酒馆的猫 发表于 2023-12-1 15:04
大佬,我发现我这个变量i需要放到外面才能旋转,但我想加快旋转速度让它看起来像是仪表盘,但是我将WM_Re ...

你那边的极限速度是不是只能做到1秒1次,这个测试下
回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-12-2 18:49:08 来自手机 | 显示全部楼层
eric2013 发表于 2023-12-2 09:54
你那边的极限速度是不是只能做到1秒1次,这个测试下

是的,可以调到十秒一次,但一秒往下调就不行了,我注释了一些函数操作速度就变快了,是不是这个刷图旋转操作太慢了。一秒一次作为时间指针还好,但是作为仪表指针就不能这种一卡一卡的效果。
回复

使用道具 举报

3

主题

22

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-12-3 21:12:21 | 显示全部楼层
eric2013 发表于 2023-12-2 09:54
你那边的极限速度是不是只能做到1秒1次,这个测试下

感觉是这个选择图片的操作占时间了,作为秒钟一顿一顿的还可以接受,但作为仪表就很不可以丝滑旋转,现在也不知道有什么方法解决
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 14:00 , Processed in 0.331020 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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