CChart发布已有多年,QQ交流群也成立了很久。在和网友的交流中,发行了CChart的很多问题,也进行了很多改进和完善。
网友们接触CChart的时间有早有晚,不同的网友经常在群里或私聊的时候提出的相近的问题,本节课准备对这些共性问题进行一些介绍。
A56.1 刷新问题
问:为什么我添加数据或修改数据后,屏幕的图像没有变化,或者是需要鼠标在图像上动一下图像才有变化?
答:CChart一般不会自动画图。
有时候你觉得好像我没有主动调用绘图函数啊,怎么也画图了呢?这是由于你使用CChartWnd的时候,在窗口的OnPaint函数里面调用了CChart的OnDraw函数。只要不触发OnPaint,图像是画不出来的。而鼠标移动有可能会触发OnPaint,所以有时候需要鼠标在图像上动一下图像才有变化。
为了主动刷新图像,在添加完数据后,可以调用一下CChartWnd::ReDraw(),或者CChart::OnDraw(HWND hWnd),也可以用Win32API的InvalidateRect刷新。
A56.2 默认背景问题
问:我不喜欢CChart的默认背景,请问怎么取消?
答:一般软件都有一个无法取消的默认背景,起到版权宣示或者产品推广的作用,
CChart的默认背景就温柔得多了,如下:

这个背景并不是强制性的,可以取消,也可以换成别的背景。参考本系列教程的第A17课,“深入浅出CChart 每日一课——快乐高四第十七课 麦田的守望,默认界面的设置方法_baita96的博客-CSDN博客”。
默认背景界面的设置内容其实也是很丰富的。
A56.3 多线程问题
问:我在多线程下使用CChart,偶尔程序崩溃,但也不一定崩溃,是什么原因。
答:所有的操作系统,刷新UI界面都不建议在工作线程中进行,包括Windows、Linux、Android、MacOS等。因为各大系统的UI元素都不是线程安全的。
Windows推荐的在线程中刷新界面的标准方法是发消息,具体的方法是调用InvalidateRect,使得窗口某一部分失效,这样Windows系统会在主线程的消息队列里插入一个WM_PAINT消息,从而刷新窗口。当然,这样的话,由于WM_PAINT消息在队列里排队,有时候刷新可能不即时,可以在InvalidateRect之后,立马调用一下UpdateWindow或RedrawWindow,这样系统会立马处理WM_PAINT消息。
具体到CChart中,有两种情况。
如果使用的是CChart这个类,一般情况下在主线程里面可以调用OnDraw(HWND hWnd)这个接口刷新界面。但在主线程之外的其它线程里面,不要这样使用,还是用InvalidateRect吧。当然如果是MFC,可以调用Invalidate这个函数,它是InvalidateRect的一个包装。
如果使用的是CChartWnd,那么CChartWnd::ReDraw()这个接口就是刷新绘图区域。但这里要注意CChart::SetDirectRedraw(bool bRedraw)这个函数。默认情况下这个函数是设置为false的,也就是说,CChartWnd内部不是直接绘图,而是调用消息刷新的,也就是说这是安全的。如果SetDirectRedraw(true),那么CChartWnd内部调用OnDraw重绘,线程不安全。
A56.4 曲线颜色问题
问:我怎么才能设置曲线的颜色,SetDataColor似乎不起作用?
答:CChart的曲线颜色具有很丰富的选项,具体设置方法请参考上一课“深入浅出CChart 每日一课——快乐高四第五十五课 天然去雕饰,出水芙蓉之美轮美奂_baita96的博客-CSDN博客”。
此外,上一课主要介绍的是绘图类型为kTypeXY的折线图的曲线颜色设置。对于多层视图,包括分层视图和共享X轴视图,默认情况下,每一层的所有曲线颜色均设置为和该层的坐标轴颜色相同,以便区分不同的图层。在这种情况下,如果想单独设置曲线颜色,请先调用CChart::SetUniteLayerColor(bool bUnite)这个接口,参数设置为false,以解除曲线颜色的绑定。
A56.5 曲线名称问题
问:怎么修改屏幕上“未命名000”、“未命名001”等显示的曲线名称为我想要的名字?
答:屏幕上曲线名称是显示在图例之中的。每条曲线都有一个名称,可以用CChart::SetDataTitle()这个接口设置。如果不设置,在图例中显示的名称就是“未命名XXX”。
A56.6 图像缩放问题
问:图像怎么放大缩小?可以用鼠标滚轮缩放图像吗?
答:在默认状态下,CChart是关闭图像缩放功能的。
打开图像缩放功能用两种方式。
一种是在程序运行时,通过右键菜单打开,“绘图状态”-->“特别功能”-->“坐标缩放”。
一种是通过代码打开,调用CChart::SetRangeZoomMode();
CChart坐标缩放功能是按住鼠标左键,往右拖动放大,往左拖动缩小(还原上一次拖动状态),很方便实用。

如图,在往右拖动的时候,会出现一个拖动框,松开鼠标左键,图像就放大到拖动框的范围。

1944

被折叠的 条评论
为什么被折叠?



