硬汉嵌入式论坛

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

[emWin] 如果Graph控件的刻度不满足自己的设计要求,可以使用文本控件实现

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107145
QQ
发表于 2019-4-11 05:20:49 | 显示全部楼层 |阅读模式
实现的关键是使用对话框创建,在对话框资源列表里面优先创建Graph,然后需要多个TEXT文本控件添加即可,这样就可以随意设置效果了

QQ截图20190411051922.jpg
回复

使用道具 举报

3

主题

28

回帖

37

积分

新手上路

积分
37
发表于 2019-4-12 14:18:44 | 显示全部楼层
也可以使用GRAPH_SetUserDraw设置回调函数在其中进行绘制
// 自绘制X轴坐标
GRAPH_SetUserDraw(hItem, OnGraphDraw);

/**
* Comments: 自绘制Graph控件X轴刻度
* @Param :
* @Return void
*/
PRIVATE void OnGraphDraw(WM_HWIN hWin, int Stage)
{
        if (Stage == GRAPH_DRAW_LAST)
        {
                // 绘制X轴坐标
                GUI_DispDecAt(10, X_BORDER_WIDTH - 8 + X_DIST_TICK, Y_AREA_SIZE, 2);
                GUI_DispDecAt(50, X_BORDER_WIDTH - 8 + X_DIST_TICK * 5, Y_AREA_SIZE, 2);
                GUI_DispDecAt(100, X_BORDER_WIDTH - 10 + X_DIST_TICK * 10, Y_AREA_SIZE, 3);
                GUI_DispDecAt(500, X_BORDER_WIDTH - 10 + X_DIST_TICK * 14, Y_AREA_SIZE, 3);
                GUI_DispDecAt(1000, X_BORDER_WIDTH - 14 + X_DIST_TICK * 19, Y_AREA_SIZE, 4);
                GUI_DispDecAt(5000, X_BORDER_WIDTH - 14 + X_DIST_TICK * 23, Y_AREA_SIZE, 4);
                GUI_DispDecAt(10000, X_BORDER_WIDTH - 18 + X_DIST_TICK * 28, Y_AREA_SIZE, 4);
        }
}
不过我遇到一个问题是当我创建一个按钮在GRAPH控件上之后使用按键无法触发这个按钮, 已经获取到焦点, 不知管理遇到过这种情况没?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107145
QQ
 楼主| 发表于 2019-4-12 15:09:18 | 显示全部楼层
xinxinsky 发表于 2019-4-12 14:18
也可以使用GRAPH_SetUserDraw设置回调函数在其中进行绘制
// 自绘制X轴坐标
GRAPH_SetUserDraw(hItem, On ...

回头我试试这种方式,谢谢提供
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2019-4-12 15:47:20 | 显示全部楼层
搭车问个问题,如果有个报警窗口可能在任何界面下弹出,是不是要在每个界面下都有这种报警窗口的处理代码
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107145
QQ
 楼主| 发表于 2019-4-12 16:09:15 | 显示全部楼层
myxiaonia 发表于 2019-4-12 15:47
搭车问个问题,如果有个报警窗口可能在任何界面下弹出,是不是要在每个界面下都有这种报警窗口的处理代码

可以单独开一个任务,设置到顶层显示,需要的时候显示,不需要的时候隐藏。

早期这个例子的闹钟界面是采用的这个方案

http://www.armbbs.cn/forum.php?m ... ypeid%26typeid%3D37
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2019-4-13 07:46:54 | 显示全部楼层
eric2013 发表于 2019-4-12 16:09
可以单独开一个任务,设置到顶层显示,需要的时候显示,不需要的时候隐藏。

早期这个例子的闹钟界面是 ...

我网上找了找,搜索全局对话框,发现都只有谈到安卓是支持的,其他平台上都没有提到
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107145
QQ
 楼主| 发表于 2019-4-13 12:02:10 | 显示全部楼层
myxiaonia 发表于 2019-4-13 07:46
我网上找了找,搜索全局对话框,发现都只有谈到安卓是支持的,其他平台上都没有提到

emWin里面还没有这种概念。

倒是可以用双图层实现,在图层2上搞一个全局对话框。
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2019-4-13 19:58:17 | 显示全部楼层
eric2013 发表于 2019-4-13 12:02
emWin里面还没有这种概念。

倒是可以用双图层实现,在图层2上搞一个全局对话框。

看了你的例程,闹钟界面因为是主桌面的子窗口,是不是只要向主桌面发送一个消息就可以做到这个弹出对话框,无论当时是处在哪一级全屏界面下,主桌面对回调函数可以处理,而不需要开一个任务,我看到你使用了emwin的多任务模式
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107145
QQ
 楼主| 发表于 2019-4-14 01:25:24 | 显示全部楼层
myxiaonia 发表于 2019-4-13 19:58
看了你的例程,闹钟界面因为是主桌面的子窗口,是不是只要向主桌面发送一个消息就可以做到这个弹出对话框 ...

最好将它设置到顶层。
回复

使用道具 举报

3

主题

28

回帖

37

积分

新手上路

积分
37
发表于 2019-4-15 11:42:33 | 显示全部楼层
myxiaonia 发表于 2019-4-13 19:58
看了你的例程,闹钟界面因为是主桌面的子窗口,是不是只要向主桌面发送一个消息就可以做到这个弹出对话框 ...

如果你这个窗口频繁使用的话我觉着你可以创建一个窗口不用销毁, 一直保存在内存中, 显示时BringToTop就可以.
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2019-4-15 15:07:07 | 显示全部楼层
我再看透明对话框的官方例程,就是那个地图上的透明对话框,有3个地方不明白

1 对话框设置成了无父窗口的,这样不是和背景窗口并列了吗
2 对话框是后设的,假定它是焦点窗口,那么背景窗口回调为何也能接收消息,虽然它的消息是通过定时器发送的,按文档说法只有活动窗口可以接收消息的
3 对话框的frame回调函数里有个函数FRAMEWIN_Callback,这个函数是什么意思
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2019-4-17 09:19:01 | 显示全部楼层
本帖最后由 myxiaonia 于 2019-4-17 15:07 编辑
myxiaonia 发表于 2019-4-15 15:07
我再看透明对话框的官方例程,就是那个地图上的透明对话框,有3个地方不明白

1 对话框设置成了无父窗口 ...

我自己回答一下这几天的学习总结,emwin学习是个长期坚持的过程,希望能坚持

1.有没有父窗口是无所谓的,我个人估计即使对于背景窗口而言,所有窗口在其上操作的行为都是类似于其是个父窗口,这样的话声明为其是否为父窗口也是件隐含的,不言而喻的事
2.消息循环并不是只能在活动窗口上分发,我估计只有按键消息才有这个要求,像pid等等其他消息都不会有限制
3.FRAMEWIN_Callback手册上没有显式说明,从个人实践看,FRAMEWIN_Callback很可能就是FRAMEWIN的默认回调函数,WM_DefaultProc不能替代它,这和手册上说法不符,假如将FRAMEWIN_Callback用WM_DefaultProc替代,则FRAMEWIN和clientWindow都不能再接收消息和处理消息了,和窗口有关的操作全部失效,但是控件操作是有效的


所以这又引出一些问题
pid消息到底是怎么个派发机制,是不是只要我们所见的界面上,pid事件对应的区域正好有控件,就把此pid事件发送给此控件?
FRAMEWIN,clientWindow,widgets分别是父子关系,widgets向clientWindow发送的消息难道也要经过FRAMEWIN?

我又看了ucgui3.98的源码,考虑到和现在版本的非一致性,有以下结论:
1.FRAMEWIN_Callback是默认的FRAME callback,因为FRAMEWIN现在创建时都只能传入clientwindow的callback。FRAMEWIN_Callback的功能非常全,即使指定了frame的callback,也能在内部调用
2.WINDOW_Callback现在到底派啥用是搞不懂了,WINDOW的默认callback也不是这个函数了,库里还有保留但是用法令人存疑,从ucgui3.98里看到它还会再次调用自定义callback,造成循环递归,模拟器里则直接弹出错误,自定义callback一般会使用WM_DefaultProc,手册上讲解自定义callbac一般k模式已经过时了

回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2019-4-18 14:35:15 | 显示全部楼层
本帖最后由 myxiaonia 于 2019-4-18 14:36 编辑

emwin的消息有个非常大的特点是消息一发出,立刻就执行对应回调函数,这个特点好处是消息响应会很快,坏处当然也有
1.可能会生成很多次的函数嵌套调用,对栈有很高要求
2.回调函数之间也可能会产生嵌套调用,这些回调函数间用户必须要保证可重入性,使用全局变量的话一定要注意
3.可能在中断中嵌套调用很多次,在中断函数中使用emwin函数要注意栈和执行时间的问题,不知道像pid消息这种是不是也会立刻分发信息
我一直以为会是在消息循环中处理信息,想当然了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 12:04 , Processed in 0.195028 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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