发布网友 发布时间:2022-04-19 09:50
共1个回答
热心网友 时间:2023-06-22 18:09
这个详细的过程不太好给出,你关键要理解MFC绘图的原理。
在不使用其它图像处理库的前提下,MFC可以使用定时器和线程完成动态绘制,你这个图形比较简单,首选定时器。
处理逻辑:
全部绘制(包括坐标和动态线条)都在OnPaint里面完成,其它消息响应中的绘制,不会被保存。
在按钮“运动”响应函数中,根据当前状态标记变量(类成员)开启定时器(SetTimer)或关闭定时器(KillTimer),并触发绘图区的完整重绘(InvalidateRect)
在定时器中,改变运动轨迹参数,完成动态绘制所需要的数据,并InvalidateRect触发动态区域重画。这个动态区域需要在定时器中计算完成,要求计算出一个CRect,包含了动态绘制的“前坐标”和“当前坐标”的所有线段。
通过之前的步骤,已经符合你的要求了。具体原理你可以百度InvalidateRect这个函数,关于这个函数的讲解文章,都是讨论MFC绘图机制的。之后说说可以优化的地方:1)“运动”按钮可以优化,比如设置为check按钮,有“按下”和“抬起”状态标识当前图状态,也可以改变文字,只显示运动和暂停中的一个。2)其实你这个需求,通过MFC单文档加上一个CDialogBar(CDockablePane)来实现更好,尤其是在图形和坐标计算复杂的时候,差异非常大。3)关注CDC类的SetROP2函数,这个在动态绘制中也是很有用的。