打印

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

[复制链接]
3968|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
在和群里成员聊天的时候,聊到了用ucgui实现条形图的功能,当时有点思路,就利用空闲时间做了下测试,基本功能可以实现,绘制条形图,画刻度,对条形图数据进行修改,很多功能还没完善,先分享给大家,感兴趣的朋友可以一起交流下。
更多更好的ucgui源码例程尽在101度开水开发板。详情咨询610095871



通过调用CHART_SetItemValue(c1,1,300);          //对指定条形图进行修改
给指定项进行修改

同时坐标系和刻度均由软件计算绘图,可以设置是否显示x方向的虚线,可以设置输入数据的范围。
共享的源文件是个c文件,下载一个ucgui的源码,之后加载到工程即可运行,需要注意的是VC中只能有一个MainTask函数
如若放到单片机上运行,也是一样,将其加入工程,然后调用即可。

zhuxingtu.rar (2.08 KB)
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 | 只看该作者

经过修改使其支持数据显示,而且对同等高度的条形图的数据显示位置进行自动调整
不过可以看出 在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);
                        }
                       
                }
        }
}
在这个添加函数中对上面那个函数的返回值进行判断来确定是不是添加成功
不成功删掉 成功则重绘。

使用特权

评论回复
5
610095871|  楼主 | 2013-8-28 14:56 | 只看该作者

这样既可对x轴溢出进行判断和处理

使用特权

评论回复
6
reille| | 2013-8-28 15:20 | 只看该作者
不错,左边的数字可以不用搞得这么密集撒

使用特权

评论回复
7
610095871|  楼主 | 2013-8-28 15:29 | 只看该作者
reille 发表于 2013-8-28 15:20
不错,左边的数字可以不用搞得这么密集撒


通过调整
YScale即可调整
刻度会自动计算并生成

使用特权

评论回复
8
puchuang| | 2013-8-28 19:00 | 只看该作者
这玩意不错   楼主   比较给力   顶你一个   很不错

使用特权

评论回复
9
dfsa| | 2013-8-28 19:07 | 只看该作者
很有参考价值

使用特权

评论回复
10
baidudz| | 2013-8-28 19:53 | 只看该作者
支持原创

使用特权

评论回复
11
610095871|  楼主 | 2013-8-29 09:08 | 只看该作者
bbs.anbn.cn---Q群295214484

使用特权

评论回复
12
那就地方iv| | 2016-1-12 22:42 | 只看该作者
谢谢楼主分享,很受用

使用特权

评论回复
13
keluonaduo| | 2016-5-10 17:11 | 只看该作者
压缩包数据损坏了
楼主可以重发一个吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

27

主题

323

帖子

10

粉丝