MFC 自定义坐标系上画点

Mr_tao2016 2015-11-12 09:45:57
我在对话框中的静态文本框里画了一个坐标轴,横轴自定义以时间为刻度,纵轴以人数为刻度。我怎么把自己得到的数据(实时人数),画到我建立的坐标系中去呢。我尝试画点的时候总是以控件左上角为原点,而不是我建立的坐标原点。怎么进行坐标转换啊,小弟刚接触MFC,还不太懂应该怎么解决,请各位大哥帮帮忙!
...全文
477 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
gz_qmc 2015-11-16
  • 打赏
  • 举报
回复
引用 11 楼 lct1991 的回复:
[quote=引用 10 楼 gz_qmc 的回复:] 你脑袋上长的是尿壶吗
大哥,您好,小弟其实是做安卓开发的,只是目前项目需要在windows上面展示,而时间又比较紧迫,所以才会学个一知半解就来提问,可能我的提问对您来说是很小儿科,但对我来说确实是急需解决的问题,还望大哥不吝赐教,感激不尽!在此把我的问题再描述一下,我已经建立好坐标轴,是在onpaint函数里面写的,横坐标是时间,纵坐标是人数,我想每隔1S(或者更短)读取一次数据(里面存的是实时人数),然后画到坐标轴上!请问我应该怎么写呢,有代码展示就更好了,谢谢大哥,感激不尽![/quote] 不是我说你,这根本不是编程的问题,和安卓还是windows没有半毛钱关系 X坐标是没问题的,反向的是Y坐标 假设屏幕分辨率是1920X1080 那么Y坐标从上到下是0+y,从下到上就是1080-y 我真不信这是一个成年人想不出来的高难问题 小学没毕业就去学编程的吧?还是习惯了不思考大脑退化了?? 从 ( x1,y1 ) 画线到 ( x2,y2 ) 默认: dc.MoveTo(x1,y1); 等同于:dc.MoveTo(x1, 0+y1); dc.LineTo(x2,y2); 等同于:dc.LineTo(x2, 0+y2); y坐标反向 dc.MoveTo(x1,1080-y1); dc.MoveTo(x2,1080-y2);
gz_qmc 2015-11-12
  • 打赏
  • 举报
回复
你脑袋上长的是尿壶吗
阿源是少年 2015-11-12
  • 打赏
  • 举报
回复
引用 7 楼 lct1991 的回复:
[quote=引用 5 楼 pcradio 的回复:] 通过SetWindowExt和SetViewportExt的比值来改变坐标轴方向,默认X向右,Y向下,现在Y要向上,只需让Y的比值为负即可,由于不经行放大,所以比例值应为1,所以:
SetMapMode(MM_ISOTROPIC);
SetViewportExt(1,-1);
SetWindowExt(1,1);
这两个函数调用之前必须确保映射模式为MM_ISOTROPIC
坐标是转换过来了,现在有个问题,因为我要每隔一定时间读取数据然后画在坐标轴上,我应该怎么办啊,我用settimer好像不行,我的坐标轴是在onpaint函数中建立的。[/quote] 把timer或者线程读到的数据放入一个全局的数组或者CArray等动态数组中,OnPaint只负责从中取数据来绘制,timer或者线程 只负责Add数据到Array中然后Invalidate();
Mr_tao2016 2015-11-12
  • 打赏
  • 举报
回复
引用 5 楼 pcradio 的回复:
通过SetWindowExt和SetViewportExt的比值来改变坐标轴方向,默认X向右,Y向下,现在Y要向上,只需让Y的比值为负即可,由于不经行放大,所以比例值应为1,所以:
SetMapMode(MM_ISOTROPIC);
SetViewportExt(1,-1);
SetWindowExt(1,1);
这两个函数调用之前必须确保映射模式为MM_ISOTROPIC
坐标是转换过来了,现在有个问题,因为我要每隔一定时间读取数据然后画在坐标轴上,我应该怎么办啊,我用settimer好像不行,我的坐标轴是在onpaint函数中建立的。
Mr_tao2016 2015-11-12
  • 打赏
  • 举报
回复
引用 1 楼 pcradio 的回复:
设置视口坐标原点即可,POINT坐标是相对于相对于窗口坐标系的
virtual CPoint SetViewportOrg( int x, int y );

virtual CPoint SetViewportOrg( POINT point );
坐标映射这块属于有些难以理解的部分,你需要自己好好理解
坐标是转换过来了,现在有个问题,因为我要每隔一定时间读取数据然后画在坐标轴上,我应该怎么办啊,我用settimer好像不行,我的坐标轴是在onpaint函数中建立的。
Mr_tao2016 2015-11-12
  • 打赏
  • 举报
回复
引用 3 楼 lx624909677 的回复:
实际绘图的时候自己从新计算下坐标就可以了,比如你以左下角为原点,那么在绘图的时候,用Y轴长度减去以左上角为原点时的长度,算下来的就是以左下角为原点的坐标了
嗯嗯,坐标是转换过来了,现在有个问题,因为我要每隔一定时间读取数据然后画在坐标轴上,我应该怎么办啊,我用settimer好像不行,我的坐标轴是在onpaint函数中建立的。
阿源是少年 2015-11-12
  • 打赏
  • 举报
回复
通过SetWindowExt和SetViewportExt的比值来改变坐标轴方向,默认X向右,Y向下,现在Y要向上,只需让Y的比值为负即可,由于不经行放大,所以比例值应为1,所以:
SetMapMode(MM_ISOTROPIC);
SetViewportExt(1,-1);
SetWindowExt(1,1);
这两个函数调用之前必须确保映射模式为MM_ISOTROPIC
ArthurKingYs 2015-11-12
  • 打赏
  • 举报
回复
用控件吧 teechart控件 画图神器 百度就行
lx624909677 2015-11-12
  • 打赏
  • 举报
回复
实际绘图的时候自己从新计算下坐标就可以了,比如你以左下角为原点,那么在绘图的时候,用Y轴长度减去以左上角为原点时的长度,算下来的就是以左下角为原点的坐标了
赵4老师 2015-11-12
  • 打赏
  • 举报
回复
Mapping Functions GetMapMode Retrieves the current mapping mode. SetMapMode Sets the current mapping mode. GetViewportOrg Retrieves the x- and y-coordinates of the viewport origin. SetViewportOrg Sets the viewport origin. OffsetViewportOrg Modifies the viewport origin relative to the coordinates of the current viewport origin. GetViewportExt Retrieves the x- and y-extents of the viewport. SetViewportExt Sets the x- and y-extents of the viewport. ScaleViewportExt Modifies the viewport extent relative to the current values. GetWindowOrg Retrieves the x- and y-coordinates of the origin of the associated window. SetWindowOrg Sets the window origin of the device context. OffsetWindowOrg Modifies the window origin relative to the coordinates of the current window origin. GetWindowExt Retrieves the x- and y-extents of the associated window. SetWindowExt Sets the x- and y-extents of the associated window. ScaleWindowExt Modifies the window extents relative to the current values. Coordinate Functions DPtoHIMETRIC Converts device units into HIMETRIC units. DPtoLP Converts device units into logical units. HIMETRICtoDP Converts HIMETRIC units into device units. HIMETRICtoLP Converts HIMETRIC units into logical units. LPtoDP Converts logical units into device units. LPtoHIMETRIC Converts logical units into HIMETRIC units.
阿源是少年 2015-11-12
  • 打赏
  • 举报
回复
设置视口坐标原点即可,POINT坐标是相对于相对于窗口坐标系的
virtual CPoint SetViewportOrg( int x, int y );

virtual CPoint SetViewportOrg( POINT point );
坐标映射这块属于有些难以理解的部分,你需要自己好好理解
lx624909677 2015-11-12
  • 打赏
  • 举报
回复
引用 8 楼 lct1991 的回复:
[quote=引用 3 楼 lx624909677 的回复:]
实际绘图的时候自己从新计算下坐标就可以了,比如你以左下角为原点,那么在绘图的时候,用Y轴长度减去以左上角为原点时的长度,算下来的就是以左下角为原点的坐标了


嗯嗯,坐标是转换过来了,现在有个问题,因为我要每隔一定时间读取数据然后画在坐标轴上,我应该怎么办啊,我用settimer好像不行,我的坐标轴是在onpaint函数中建立的。[/quote]
在OnTimer中计算坐标,在OnPaint里绘图,或者起一个线程用来计算坐标,坐标做成类的成员变量就行了
Mr_tao2016 2015-11-12
  • 打赏
  • 举报
回复
引用 15 楼 pcradio 的回复:
闪烁用双缓冲
我会马上学习双缓冲绘图。现在我的疑问是为什么我重绘的时候,我原来静态文本框的内容会消失,移动到对话框的左上角去了,这是什么原因造成的呀!
阿源是少年 2015-11-12
  • 打赏
  • 举报
回复
闪烁用双缓冲
Mr_tao2016 2015-11-12
  • 打赏
  • 举报
回复
引用 13 楼 pcradio 的回复:
[quote=引用 12 楼 lct1991 的回复:] [quote=引用 9 楼 pcradio 的回复:] [quote=引用 7 楼 lct1991 的回复:] [quote=引用 5 楼 pcradio 的回复:] 通过SetWindowExt和SetViewportExt的比值来改变坐标轴方向,默认X向右,Y向下,现在Y要向上,只需让Y的比值为负即可,由于不经行放大,所以比例值应为1,所以:
SetMapMode(MM_ISOTROPIC);
SetViewportExt(1,-1);
SetWindowExt(1,1);
这两个函数调用之前必须确保映射模式为MM_ISOTROPIC
坐标是转换过来了,现在有个问题,因为我要每隔一定时间读取数据然后画在坐标轴上,我应该怎么办啊,我用settimer好像不行,我的坐标轴是在onpaint函数中建立的。[/quote] 把timer或者线程读到的数据放入一个全局的数组或者CArray等动态数组中,OnPaint只负责从中取数据来绘制,timer或者线程 只负责Add数据到Array中然后Invalidate();[/quote] 大哥能给个具体例子不,感激不尽! 603091737@qq.com[/quote] OnPaint遍历CArray取对象来绘制,Timer往CArray放一个数据就调用一次Invalidate重绘,这个不能再具体了,Invalidate发送WM_PAINT引发OnPaint执行,原理即是如此,懂得这个就行[/quote] 大哥,我的MFC对话框有三个控件,两个ipicture,一个静态对话框,我现在在ontimer里面写了数据,在onpaint里面遍历取数据。然后Invalidate();本来我的那个坐标轴是画在对话框的右下角,现在是一直在左上角闪烁。
阿源是少年 2015-11-12
  • 打赏
  • 举报
回复
引用 12 楼 lct1991 的回复:
[quote=引用 9 楼 pcradio 的回复:] [quote=引用 7 楼 lct1991 的回复:] [quote=引用 5 楼 pcradio 的回复:] 通过SetWindowExt和SetViewportExt的比值来改变坐标轴方向,默认X向右,Y向下,现在Y要向上,只需让Y的比值为负即可,由于不经行放大,所以比例值应为1,所以:
SetMapMode(MM_ISOTROPIC);
SetViewportExt(1,-1);
SetWindowExt(1,1);
这两个函数调用之前必须确保映射模式为MM_ISOTROPIC
坐标是转换过来了,现在有个问题,因为我要每隔一定时间读取数据然后画在坐标轴上,我应该怎么办啊,我用settimer好像不行,我的坐标轴是在onpaint函数中建立的。[/quote] 把timer或者线程读到的数据放入一个全局的数组或者CArray等动态数组中,OnPaint只负责从中取数据来绘制,timer或者线程 只负责Add数据到Array中然后Invalidate();[/quote] 大哥能给个具体例子不,感激不尽! 603091737@qq.com[/quote] OnPaint遍历CArray取对象来绘制,Timer往CArray放一个数据就调用一次Invalidate重绘,这个不能再具体了,Invalidate发送WM_PAINT引发OnPaint执行,原理即是如此,懂得这个就行
Mr_tao2016 2015-11-12
  • 打赏
  • 举报
回复
引用 9 楼 pcradio 的回复:
[quote=引用 7 楼 lct1991 的回复:] [quote=引用 5 楼 pcradio 的回复:] 通过SetWindowExt和SetViewportExt的比值来改变坐标轴方向,默认X向右,Y向下,现在Y要向上,只需让Y的比值为负即可,由于不经行放大,所以比例值应为1,所以:
SetMapMode(MM_ISOTROPIC);
SetViewportExt(1,-1);
SetWindowExt(1,1);
这两个函数调用之前必须确保映射模式为MM_ISOTROPIC
坐标是转换过来了,现在有个问题,因为我要每隔一定时间读取数据然后画在坐标轴上,我应该怎么办啊,我用settimer好像不行,我的坐标轴是在onpaint函数中建立的。[/quote] 把timer或者线程读到的数据放入一个全局的数组或者CArray等动态数组中,OnPaint只负责从中取数据来绘制,timer或者线程 只负责Add数据到Array中然后Invalidate();[/quote] 大哥能给个具体例子不,感激不尽! 603091737@qq.com
Mr_tao2016 2015-11-12
  • 打赏
  • 举报
回复
引用 10 楼 gz_qmc 的回复:
你脑袋上长的是尿壶吗
大哥,您好,小弟其实是做安卓开发的,只是目前项目需要在windows上面展示,而时间又比较紧迫,所以才会学个一知半解就来提问,可能我的提问对您来说是很小儿科,但对我来说确实是急需解决的问题,还望大哥不吝赐教,感激不尽!在此把我的问题再描述一下,我已经建立好坐标轴,是在onpaint函数里面写的,横坐标是时间,纵坐标是人数,我想每隔1S(或者更短)读取一次数据(里面存的是实时人数),然后画到坐标轴上!请问我应该怎么写呢,有代码展示就更好了,谢谢大哥,感激不尽!
基本介绍】 一:什么是ST_Curve? ST_Curve是一个专业的曲线绘制控件,只要是xy坐标系的曲线,都可绘制,纵坐标只能显示为值,横坐标可以显示为值或者时间。 二:ST_Curve面向对象? 二次开发者,即你必须要对ST_Curve进行开发,它才能使用,就像现在流行的诸多界面库一样。 三:ST_Curve有什么使用与分发限制? 使用无任何限制,分发时,必须保证控件的完整性,包括但不限于主控件、开发文档等。 四:ST_Curve的开发环境与运行平台 控件的开发环境为vc7.1,unicode(所以控件无法加载时最可能的原因就是缺少mfc71u.dll),二次开发环境则是所有可以使用控件的地方,运行平台为win2000及其以上的操作系统,如果需要在win98下面使用,请向我索取mbcs版本的控件,如果要在纯英文操作系统下使用,请向我索取英文版控件,都不需要付费,但只提供release版本。 【软件特点】 一:ST_Curve的特点与优势(对操作者) 鼠标任意拖动曲线,任意缩放曲线,定点(鼠标取点)缩放曲线,数字键快速找到曲线,F5键居中曲线,F4键显示隐藏帮助(帮助显示于背景图之上),支持方向键,翻页键等,可显示三维效果。 二:ST_Curve的特点与优势(对开发者,只说说几个重点,其它的请看开发文档) 自定义各种颜色,字体,背景,画笔,填充模式等,可切换坐标原点到窗口四个角的任意一个,可导出图片(bmp、png、jpg、gif),可批量导出图片,以及定时导出图片,可导入图片作为背景或者用于填充曲线,可导出曲线到文件(支持二进制文件,它速度最快,还支持文本文件,它的好处是可以手动编辑,支持的文本格式包括:ansi、unicode、unicode big endian、utf8,这些文本格式都被windows支持),可绘制实时曲线(曲线自动滚动),支持在各个方向上对曲线进行填充,支持打印,打印或者导出图片时,可指定只对某一条曲线,或某一段数据。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧