硬汉嵌入式论坛

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

[emWin] GUI_MEMDEV_WriteAt 显示在非WM_HBKWIN的问题

[复制链接]

29

主题

77

回帖

164

积分

初级会员

积分
164
发表于 2018-6-11 16:11:42 | 显示全部楼层 |阅读模式
本帖最后由 hecudashi 于 2018-6-11 16:14 编辑

WM_HBKWIN上新建子窗口,在子窗口中用GUI_MEMDEV_WriteAt  函数绘制已经存储在存储设备的图片,滑动子窗口发现这部分图片不动,不是子窗口的一部分。
有其它代替的办法吗?





回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115765
QQ
发表于 2018-6-12 01:15:36 | 显示全部楼层
方便的话,发下程序,估计是你程序的问题。
回复

使用道具 举报

29

主题

77

回帖

164

积分

初级会员

积分
164
 楼主| 发表于 2018-6-13 14:39:43 | 显示全部楼层
/*
* GUI主任务
*/
void MainTask(void)
{
        GUI_Init();

        WM_SetCreateFlags(WM_CF_MEMDEV);
        //WM_MULTIBUF_Enable(1);

        /* 滑动使能 */
        WM_MOTION_Enable(1);

        /* 设置桌面窗口的回调函数,桌面窗口自动创建 */
        WM_SetCallback(WM_HBKWIN, _cbBkWin);
        WM_InvalidateWindow(WM_HBKWIN);
        /*触摸校准*/
        TOUCH_Calibration();

        /* 绘制波形显示背景到存储设备 ***************************************************/
        hGraphXYBk = GUI_MEMDEV_CreateFixed(0,
                                           0,
                                         210,
                                         210,
                                                                         GUI_MEMDEV_HASTRANS,
                                                                         GUI_MEMDEV_APILIST_16,
                                                                         GUICC_M565);
        GUI_MEMDEV_Select(hGraphXYBk);
        GRAPH_DrawBakFrame(0,0,209,209);
        GUI_MEMDEV_Select(0);
//        GUI_CURSOR_Show();

        CreateStatusBar();
        CreateNeutronMainI();
        while(1)
        {
                GUI_Delay(5);
        }
}


/*
*********************************************************************************************************
*        函数名: CreateNeutronMainI
*        功     能: 创建状态栏
*        形     参: 无
*        返回值: 无
*********************************************************************************************************
*/
void CreateNeutronMainI(void)
{
        PARA Para;
        PARA *pPara;

        pPara = &Para;
        pPara->Pos = 0;

        /*设置滑动周期*/
        WM_MOTION_SetDefaultPeriod(100);

        GUI_AA_SetFactor(MAG);
        GUI_AA_EnableHiRes();
        /* 主界面1*/
        hWinNeutronMain = WM_CreateWindowAsChild(0,
                                                                                      20,
                                                                                         480,
                                                                                         319,
                                                    WM_HBKWIN,
                                          WM_CF_SHOW | WM_CF_MOTION_X ,
                                           _cbMainWin,
                                                                           sizeof(pPara));
        WM_SetUserData(hWinNeutronMain, &pPara, sizeof(pPara));
}
/*
*********************************************************************************************************
*        函数名: _cbStatusWin
*        功     能: 状态栏回调函数
*        形     参: pMsg 窗口信息指针
*        返回值: 无
*********************************************************************************************************
*/
static void _cbMainWin(WM_MESSAGE * pMsg)
{
        int i;
        static double angle;
        PARA  * pPara;
        PARA    Para;
        WM_MOTION_INFO Info;
        WM_MOTION_INFO * pInfo;

        pInfo = &Info;
        pPara = &Para;
        switch (pMsg->MsgId)
        {
                case WM_CREATE:
                        _InitMainI(pMsg);
                        break;

                 /* 定时器 */
                case WM_TIMER:
                        WM_RestartTimer(pMsg->Data.v, 1000);

                        total_run_time ++;  //实时测量运行时间加
                        if(graph_data.pIndex <41)
                                graph_data.pIndex++;
                        else
                        {
                                graph_data.maxData = 0;
                                for(i=1;i<graph_data.pIndex;i++)
                                {
                                        graph_data.data[i-1] = graph_data.data;
                                        if(graph_data.maxData <graph_data.data)//取40个数的最大数
                                                graph_data.maxData = graph_data.data;
                                }
                        }
                        graph_data.data[graph_data.pIndex-1] = sin(angle)+1;
                        angle = angle+3.1415/80.0;
                        if(angle>2*3.1415)
                                angle = 3.1415/80.0;
                        if(graph_data.maxData <graph_data.data[graph_data.pIndex-1])
                                graph_data.maxData = graph_data.data[graph_data.pIndex-1];  //取最大数

                        /*最大值超过图形的%80或者小于40%刻度要进行变换*/
                        if((graph_data.maxData>(160*graph_data.pixelValue))||(graph_data.maxData<(80*graph_data.pixelValue)))
                        {
                                if(graph_data.maxData <10)//最小像素刻度0.0001,Y轴坐标值只能显示到小数点后3位
                                {
                                        graph_data.pixelValue = graph_data.maxData/160.0;
                                        if(fmod(graph_data.pixelValue,0.0001) != 0) //不是最小像素刻度的整数倍
                                                graph_data.pixelValue = (graph_data.pixelValue/0.0001)*0.0001+0.0001; //确保是最小像素刻度0.0001的整数倍,保证刻度值的正确
                                }
                                else if(graph_data.maxData<100)//最小刻度0.0025,Y轴坐标值只能显示到小数点后2位
                                {
                                        graph_data.pixelValue = graph_data.maxData/160.0;
                                        if(fmod(graph_data.pixelValue,0.001) != 0) //不是最小像素刻度的整数倍
                                                graph_data.pixelValue = (graph_data.pixelValue/0.001)*0.001+0.001; //确保是最小精度0.001的整数倍,保证刻度值的正确
                                }
                                else if(graph_data.maxData<1000)//最小刻度0.025,Y轴坐标值只能显示到小数点后1位
                                {
                                        graph_data.pixelValue = graph_data.maxData/160.0;
                                        if(fmod(graph_data.pixelValue,0.01) != 0) //不是最小刻度的整数倍
                                                graph_data.pixelValue = (graph_data.pixelValue/0.01)*0.01+0.01; //确保是最小精度0.01的整数倍,保证刻度值的正确
                                }
                                else//最小刻度0.25,Y轴坐标值整数
                                {
                                        graph_data.pixelValue = graph_data.maxData/160.0;
                                        if(fmodl(graph_data.pixelValue,0.1) != 0) //不是最小刻度的整数倍
                                        graph_data.pixelValue = (graph_data.pixelValue/0.01)*0.1+0.1; //确保是最小精度0.1的整数倍,保证刻度值的正确
                                }
                        }
                        for(i=0;i<graph_data.pIndex;i++)
                        {
                                graph_point_data.x = 30+i*5;
                                graph_point_data.y = 205-graph_data.data/graph_data.pixelValue;
                        }
                        WM_InvalidateWindow(pMsg->hWin);
                        break;

                case WM_NOTIFY_PARENT:
                        break;

                case WM_PAINT:
                        _PaintMainI(pMsg); //在此处把存储设备用函数GUI_MEMDEV_WriteAt 写进去
                        break;
                case WM_MOTION:
                        WM_GetUserData(pMsg->hWin, &pPara, sizeof(pPara));
                        pInfo = (WM_MOTION_INFO *)pMsg->Data.p;
                        switch(pInfo->Cmd)
                        {
                                case WM_MOTION_INIT:
                                        pInfo->Flags =  WM_CF_MOTION_X | WM_MOTION_MANAGE_BY_WINDOW;
                                        pInfo->SnapX = LCD_GetXSize();  //设置栅格大小
                                        break;

                                case WM_MOTION_MOVE:
                                        pPara->FinalMove = pInfo->FinalMove;
                                        pPara->Pos += pInfo->dx;

                                        /* 设置滑动到最左侧时的处理办法,超过一半就不可以再滑动了 */
                                        if(pPara->Pos >= LCD_GetXSize()/2)
                                                pPara->Pos = LCD_GetXSize()/2 - 1;

                                        /* 设置滑动到最右侧时的处理办法,超过一半就不可以再滑动了 */
                                        if(pPara->Pos <= -(LCD_GetXSize() + LCD_GetXSize()/2))
                                                pPara->Pos = -(LCD_GetXSize() + LCD_GetXSize()/2 - 1);
                                        /*滑动松手后,会按照WM_MOTION_SetDefaultPeriod设置的时间减速并停止到最近的栅格*/
                                        if(pPara->FinalMove)
                                        {
                                                /*if(pPara->Pos <= -(LCD_GetXSize() + LCD_GetXSize()/2))
                                                {
                                                        s_ucIconSwitch = 2;
                                                }
                                                else if((pPara->Pos > -(LCD_GetXSize() + LCD_GetXSize()/2))&&(pPara->Pos <= -LCD_GetXSize()/2))
                                                {
                                                        s_ucIconSwitch = 1;
                                                }
                                                else if(pPara->Pos > -LCD_GetXSize()/2)
                                                {
                                                        s_ucIconSwitch = 0;
                                                }*/
                                        }
                                        WM_MoveTo(pMsg->hWin, pPara->Pos, 20);
                                        break;

                                case WM_MOTION_GETPOS:
                                        pInfo->xPos = pPara->Pos;
                                        break;
                        }
                default:
                        WM_DefaultProc(pMsg);
        }
}
回复

使用道具 举报

29

主题

77

回帖

164

积分

初级会员

积分
164
 楼主| 发表于 2018-6-13 14:41:06 | 显示全部楼层
eric2013 发表于 2018-6-12 01:15
方便的话,发下程序,估计是你程序的问题。

就是在WM_HBKWIM上建立的子窗口上进行GUI_MEMDEV_WriteAt
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-17 06:49 , Processed in 0.590873 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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