MFC 自定义坐标系上画点

Mr_tao2016 2015-11-12 09:45:57
我在对话框中的静态文本框里画了一个坐标轴,横轴自定义以时间为刻度,纵轴以人数为刻度。我怎么把自己得到的数据(实时人数),画到我建立的坐标系中去呢。我尝试画点的时候总是以控件左上角为原点,而不是我建立的坐标原点。怎么进行坐标转换啊,小弟刚接触MFC,还不太懂应该怎么解决,请各位大哥帮帮忙!
...全文
525 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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(或者更短)读取一次数据(里面存的是实时人数),然后画到坐标轴上!请问我应该怎么写呢,有代码展示就更好了,谢谢大哥,感激不尽!

15,980

社区成员

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

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