OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6557|回复: 13

关于stemwin程序问题

[复制链接]

65

主题

486

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2109
金钱
2109
注册时间
2015-11-14
在线时间
515 小时
发表于 2016-4-5 14:34:26 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 单模先声 于 2016-4-5 14:49 编辑

#define countof(Obj) (sizeof(Obj) / sizeof(Obj[0]))
#define DEG2RAD      (3.1415926f / 180)
#define MAG          4

static const GUI_COLOR ColorsScaleR140[] = {
        0x000000, 0x00AA00, 0xFFFFFF, 0x0000AA,
        0x00FF00, 0xAEAEAE, 0x737373, 0xD3D3D3,
        0xDFDFDF, 0xBBDFBB, 0x6161DF, 0x61DF61,
        0xBBBBDF, 0xC7C7C7, 0x616193
};

//μ÷é«°å
static const GUI_LOGPALETTE PalScaleR140 = {
        15,   //ìõÄ¿μÄêyá¿
        0,    //ÎTí¸Ã÷¶è
        &ColorsScaleR140[0]
};

static const GUI_BITMAP bmScaleR140 = {
        200,          // XSize
        73,           // YSize
        100,          // BytesPerLine
        4,            // BitsPerPixel
        acScaleR140,  // Pointer to picture data (indices)
        &PalScaleR140 // Pointer to palette
};


static const GUI_POINT _aNeedle[] = {
        { MAG * ( 0), MAG * (  0 + 125) },
        { MAG * (-3), MAG * (-15 + 125) },
        { MAG * (-3), MAG * (-65 + 125) },
        { MAG * ( 3), MAG * (-65 + 125) },
        { MAG * ( 3), MAG * (-15 + 125) },
};



typedef struct
{
        GUI_AUTODEV_INFO AutoDevInfo;  // Information about what has to be displayed
        GUI_POINT        aPoints[7];   // Polygon data
        float            Angle;
} PARAM;



static float _GetAngle(int tDiff) {
        if (tDiff < 15000) {
                return  225 - 0.006 * tDiff ;
        }
        tDiff -= 15000;
        if (tDiff < 7500) {
                return  225 - 90 + 0.012 * tDiff ;
        }
        return 225;
}


//&#187;&#230;í&#188;
static void _Draw(void * p)
{
        PARAM * pParam;
        pParam = (PARAM *)p;
        
  
        if (pParam->AutoDevInfo.DrawFixed) {
                GUI_ClearRect (60, 80 + bmScaleR140.YSize, 60 + bmScaleR140.XSize - 1, 180);
                GUI_DrawBitmap(&bmScaleR140, 60, 80);
        }

  
        GUI_SetColor(GUI_WHITE);
        GUI_AA_FillPolygon(pParam->aPoints, countof(_aNeedle), MAG * 160, MAG * 220);


        if (pParam->AutoDevInfo.DrawFixed) {
                GUI_SetTextMode(GUI_TM_TRANS);
                GUI_SetColor(GUI_RED);
                GUI_SetFont(&GUI_Font24B_ASCII);
                GUI_DispStringHCenterAt("RPM / 1000", 160, 140);
        }
        

}

void _DemoScale(void)
{
        GUI_AUTODEV AutoDev;    // Object for banding memory device
        PARAM       Param;      // Parameters for drawing routine
        int         Cnt;
        int         tDiff;
        int         t0;

        //&#207;&#212;ê&#190;D&#197;&#207;¢
        GUI_SetBkColor(GUI_BLACK);
        GUI_Clear();
        GUI_SetColor(GUI_WHITE);
        GUI_SetFont(&GUI_Font24_ASCII);
        GUI_DispStringHCenterAt("MEMDEV_AutoDev - Sample", 160, 5);
        GUI_SetFont(&GUI_Font8x16);
        GUI_DispStringHCenterAt("Scale using GUI_AUTODEV-object", 160, 50);

        //ê1&#196;ü&#184;&#223;·&#214;±&#230;&#194;ê&#191;1&#190;a3Y
        GUI_AA_EnableHiRes();
        GUI_AA_SetFactor(MAG);
        while (1)
        {
                t0 = GUI_GetTime();        
                GUI_MEMDEV_CreateAuto(&AutoDev);

                for (Cnt = 0; (tDiff = GUI_GetTime() - t0) < 24000; Cnt++)
                {
                        Param.Angle = _GetAngle(tDiff)* DEG2RAD;
                        GUI_RotatePolygon(Param.aPoints, _aNeedle, countof(_aNeedle), Param.Angle);
                        GUI_MEMDEV_DrawAuto(&AutoDev, &Param.AutoDevInfo, &_Draw, &Param);
                }

                //&#207;&#212;ê&#190;milliseconds / pictureí&#188;&#198;&#172;
                GUI_SetColor(GUI_WHITE);
                GUI_SetFont(&GUI_Font8x16);
                GUI_DispStringHCenterAt("Milliseconds / picture:", 160, 200);
                GUI_SetTextAlign(GUI_TA_CENTER);
                GUI_SetTextMode(GUI_TM_NORMAL);
                GUI_DispNextLine();
                GUI_GotoX(160);
                GUI_DispFloatMin((float)tDiff / (float)Cnt, 2);

                GUI_MEMDEV_DeleteAuto(&AutoDev);
                GUI_Delay(3000);
                GUI_ClearRect(0, 70, 319, 239);
        }
}
程序里有个PARAM结构体,找不到有给PARAM赋值的语句,没有赋值,那调用PARAM的函数不就是没用了?求大神解答



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

1592

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2622
金钱
2622
注册时间
2014-7-17
在线时间
350 小时
发表于 2016-4-5 14:37:36 | 显示全部楼层
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-4-5 17:52:47 | 显示全部楼层
又一个看程序不认真的,下面两个图能告诉你一切,自行分析!
$B0OFTYJYZE1[3JZIA]NKVY.png {`$II)OOSSJB_U9{WXEF3SK.png
开往春天的手扶拖拉机
回复

使用道具 举报

65

主题

486

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2109
金钱
2109
注册时间
2015-11-14
在线时间
515 小时
 楼主| 发表于 2016-4-5 17:59:44 | 显示全部楼层
zuozhongkai 发表于 2016-4-5 17:52
又一个看程序不认真的,下面两个图能告诉你一切,自行分析!

这个我看到了,但是那个Param也没有赋值
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-4-5 18:41:01 | 显示全部楼层
单模先声 发表于 2016-4-5 17:59
这个我看到了,但是那个Param也没有赋值

额,就这两个图有你要的一切,仔细去分析代码!
开往春天的手扶拖拉机
回复

使用道具 举报

65

主题

486

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2109
金钱
2109
注册时间
2015-11-14
在线时间
515 小时
 楼主| 发表于 2016-4-5 18:52:56 | 显示全部楼层
zuozhongkai 发表于 2016-4-5 18:41
额,就这两个图有你要的一切,仔细去分析代码!

那个_Draw都没有传入参数,Param只有那个angle赋值了而已,真的看不到了
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-4-5 19:08:20 | 显示全部楼层
单模先声 发表于 2016-4-5 18:52
那个_Draw都没有传入参数,Param只有那个angle赋值了而已,真的看不到了

Param的参数aPoints是函数GUI_RotatePolygon()赋值的,参数AutoDevInfo是GUI_MEMDEV_DrawAuto()初始化的。
开往春天的手扶拖拉机
回复

使用道具 举报

65

主题

486

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2109
金钱
2109
注册时间
2015-11-14
在线时间
515 小时
 楼主| 发表于 2016-4-5 20:25:57 | 显示全部楼层
zuozhongkai 发表于 2016-4-5 19:08
Param的参数aPoints是函数GUI_RotatePolygon()赋值的,参数AutoDevInfo是GUI_MEMDEV_DrawAuto()初始化的 ...

参数AutoDevInfo是GUI_MEMDEV_DrawAuto()初始化的?AutoDevInfo的DrawFixed是决定绘制全部还是绘制移动的,初始化之后没有人为赋值,那怎么控制?程序默认是绘制移动的?
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-4-5 20:50:49 | 显示全部楼层
单模先声 发表于 2016-4-5 20:25
参数AutoDevInfo是GUI_MEMDEV_DrawAuto()初始化的?AutoDevInfo的DrawFixed是决定绘制全部还是绘制移动的 ...

看错了,AutoDevInfo是EMWIN在运行的过程中有MEWIN内部自行设置值的,用户只需要判断这个值执行相应的操作
开往春天的手扶拖拉机
回复

使用道具 举报

65

主题

486

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2109
金钱
2109
注册时间
2015-11-14
在线时间
515 小时
 楼主| 发表于 2016-4-5 22:36:06 | 显示全部楼层
zuozhongkai 发表于 2016-4-5 20:50
看错了,AutoDevInfo是EMWIN在运行的过程中有MEWIN内部自行设置值的,用户只需要判断这个值执行相应的操 ...

怎么可能是内部设置值,决定绘制全部还是绘制移动是我们决定的。比如我想绘制全部,但是判断出来的值不对,那就不可以绘制全部了?
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-4-6 10:26:54 | 显示全部楼层
单模先声 发表于 2016-4-5 22:36
怎么可能是内部设置值,决定绘制全部还是绘制移动是我们决定的。比如我想绘制全部,但是判断出来的值不对 ...

emwin手册上压根就没讲AutoDevInfo是怎么搞的,官方的例程也没有复制,但是你在_Draw()函数中打印AutoDevInfo中DrawFixed的值你就会发现它是变化的,说明EMWIN在运行的过程中内部机制会给他赋值。
开往春天的手扶拖拉机
回复

使用道具 举报

65

主题

486

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2109
金钱
2109
注册时间
2015-11-14
在线时间
515 小时
 楼主| 发表于 2016-4-6 11:35:09 | 显示全部楼层
zuozhongkai 发表于 2016-4-6 10:26
emwin手册上压根就没讲AutoDevInfo是怎么搞的,官方的例程也没有复制,但是你在_Draw()函数中打印AutoDev ...

如果是内部赋值的,那自动设备对象不就没用了吗?都不能自己控制全部绘制还是移动绘制
回复

使用道具 举报

70

主题

275

帖子

0

精华

高级会员

Rank: 4

积分
728
金钱
728
注册时间
2017-6-20
在线时间
188 小时
发表于 2018-1-3 14:30:08 | 显示全部楼层
我去 我也是看到这里不明白了。。。。
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2021-2-26
在线时间
6 小时
发表于 2022-4-29 21:07:55 | 显示全部楼层
按照前面的前辈所说,从下面三句可以看出端倪(打开串口):

printf("函数调用之前:%d\r\n",Param.AutoDevInfo.DrawFixed);
GUI_MEMDEV_DrawAuto(&AutoDev, &Param.AutoDevInfo, &_Draw, &Param);  //使用自动设备对象绘制图形
printf("函数调用之后:%d\r\n",Param.AutoDevInfo.DrawFixed);

单片机首次启动,并第一次运行到这里时,Param.AutoDevInfo.DrawFixed的值为4,在GUI_MEMDEV_DrawAuto()运行结束后Param.AutoDevInfo.DrawFixed的值便始终为0.
这个含义就是说:首次绘制会将所有需要动的以及不需要动的全部绘制完毕,后面只能绘制需要动的。不需要动的部分绘制函数放在static void _Draw(void * p)函数的if (pParam->AutoDevInfo.DrawFixed) {。。。}中,需要更改绘制的部分(会动的)则放在if之外的部分。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 10:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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