UCGUI条形图控件支持实时更改数据-开水原创

[复制链接]
4623|12
 楼主| 610095871 发表于 2013-8-28 09:52 | 显示全部楼层 |阅读模式
在和群里成员聊天的时候,聊到了用ucgui实现条形图的功能,当时有点思路,就利用空闲时间做了下测试,基本功能可以实现,绘制条形图,画刻度,对条形图数据进行修改,很多功能还没完善,先分享给大家,感兴趣的朋友可以一起交流下。
更多更好的ucgui源码例程尽在101度开水开发板。详情咨询610095871
t1.png t2.png

它.png t3.png
通过调用CHART_SetItemValue(c1,1,300);          //对指定条形图进行修改
给指定项进行修改
t5.png
同时坐标系和刻度均由软件计算绘图,可以设置是否显示x方向的虚线,可以设置输入数据的范围。
共享的源文件是个c文件,下载一个ucgui的源码,之后加载到工程即可运行,需要注意的是VC中只能有一个MainTask函数
如若放到单片机上运行,也是一样,将其加入工程,然后调用即可。

zhuxingtu.rar (2.08 KB, 下载次数: 62)
bbs.anbn.cn---Q群295214484
bbs.anbn.cn---Q群295214484
bbs.anbn.cn---Q群295214484

mmuuss586 发表于 2013-8-28 12:04 | 显示全部楼层
不错啊
 楼主| 610095871 发表于 2013-8-28 14:27 | 显示全部楼层
t6.png
经过修改使其支持数据显示,而且对同等高度的条形图的数据显示位置进行自动调整
不过可以看出 在x方向并没有进行判断 导致输入的条形图个数超过后也没进行相应的处理
 楼主| 610095871 发表于 2013-8-28 14:55 | 显示全部楼层
char CHART__InvalidateItem(CHART_Handle hObj, CHART_Obj* pObj, int Index)
{
        GUI_RECT r;
        int spacing;
        int Xsize;
        int XStart=0;
        int y1=0;
        CHART_Item* pItem;
//        WM_GetWindowRectEx(hObj,&r);
        WM_GetInsideRectEx(hObj,&r);
        spacing=pObj->Xspacing ;
        Xsize=pObj->ItemXsize ;
        y1=r.y1 -pObj->Yspacing ;
        XStart=r.x0 +pObj->Xofft;
       
                pItem= (CHART_Item*)GUI_ARRAY_GetpItem(&pObj->ItemArray, Index);
                pItem->r .x0 =XStart+Index*(Xsize+spacing);
                pItem->r .x1 =pItem->r .x0+Xsize;
       
                pItem->r .y0 =y1 -(int)pItem->Value ;

                pItem->r .y1 =y1 ;
                if(pItem->r .x1 >r.x1)
                {
                        return 1;
                }
                else
                        return 0;
        //        WM_InvalidateWindow(hObj);
       

}
在这个函数最后进行判断之后返回值


void CHART_AddItem(CHART_Handle hObj, char * s,float Value,GUI_COLOR Color)
{
        float Value0;
        GUI_RECT r;
        WM_GetInsideRectEx(hObj,&r);
        if(hObj)
        {
                CHART_Obj * pObj = (CHART_Obj *)GUI_ALLOC_h2p(hObj);
                CHART_Item Item = {0};
                if (GUI_ARRAY_AddItem(&pObj->ItemArray, &Item, sizeof(CHART_Item)+strlen(s))  == 0)
                {
                        unsigned ItemIndex = GUI_ARRAY_GetNumItems(&pObj->ItemArray) - 1;
                        CHART_Item* pItem= (CHART_Item*)GUI_ARRAY_GetpItem(&pObj->ItemArray, ItemIndex);
                        if(s)
                    strcpy(pItem->htext , s);
                        //////////////////对数据进行处理
                        Value0=pObj->ymin +Value*(r.y1 -pObj->Yspacing -r.y0 )/(pObj->ymax - pObj->ymin );
                        //////////////////
                        pItem->DispValue = Value;
                        pItem->Value =Value0;
            pItem->Color =Color;
                        if(CHART__InvalidateItem(hObj,pObj,ItemIndex))
                        {
                                GUI_ARRAY_DeleteItem(&pObj->ItemArray, ItemIndex);
                        }
                        else
                        {
                                WM_InvalidateWindow(hObj);
                        }
                       
                }
        }
}
在这个添加函数中对上面那个函数的返回值进行判断来确定是不是添加成功
不成功删掉 成功则重绘。
 楼主| 610095871 发表于 2013-8-28 14:56 | 显示全部楼层
t7.png
这样既可对x轴溢出进行判断和处理
reille 发表于 2013-8-28 15:20 | 显示全部楼层
不错,左边的数字可以不用搞得这么密集撒
 楼主| 610095871 发表于 2013-8-28 15:29 | 显示全部楼层
reille 发表于 2013-8-28 15:20
不错,左边的数字可以不用搞得这么密集撒

t8.png
通过调整 t9.png
YScale即可调整
刻度会自动计算并生成
puchuang 发表于 2013-8-28 19:00 | 显示全部楼层
这玩意不错   楼主   比较给力   顶你一个   很不错
dfsa 发表于 2013-8-28 19:07 | 显示全部楼层
很有参考价值
baidudz 发表于 2013-8-28 19:53 | 显示全部楼层
支持原创
 楼主| 610095871 发表于 2013-8-29 09:08 | 显示全部楼层
bbs.anbn.cn---Q群295214484
那就地方iv 发表于 2016-1-12 22:42 | 显示全部楼层
谢谢楼主分享,很受用
keluonaduo 发表于 2016-5-10 17:11 | 显示全部楼层
压缩包数据损坏了
楼主可以重发一个吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:UCGUI源码学习中---Q群295214484 http://ucgui.taobao.com

27

主题

323

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部