我说我想静静,我说我想躲躲。
群里的小伙伴经常问同一个问题,就是CChart的默认界面能否取消。
这个默认界面是这样的,比较简单,没有什么花里胡哨的东西,可以说是笨笨做的一个小小的广告。
为了演示,先简单实现这个界面。
建立一个多文档MFC程序LessonA17。
在CLessonA17View里面放置一个变量。
CChartWnd m_ChartWnd;
在CLessonA17View的OnCreate里面添加一句话。
m_ChartWnd.Attach(m_hWnd, kTypeXY);
不添加数据,即可出现上面的界面。
如果不想显示这些内容,怎么办呢?
很简单!首先看下面这个函数。
void SetDefScreen( void (*fcnDefScreen)( void *plot, HDC hDC, RECT plotRect, void *pPara ), void *pPara );
没错,这个函数就是设置默认屏幕的,具体用法后面再详细介绍,这里先这样调用一下。
m_ChartWnd.GetChart()->SetDefScreen(NULL, NULL);
哈,屏幕是空的了。
有同学说了,其实嘛,我还是想放点东西在屏幕上的,只是想把笨笨提供的内容改改,这该怎么办呢?
笨笨想说,没有比这个更简单的事了。
我们先把前一句代码删掉,不然下面的代码不起作用。然后增加这么两句话。
m_ChartWnd.GetChart()->SetDefMainString(_T("《弹琴》作者:刘长卿"));
m_ChartWnd.GetChart()->SetDefSubString(_T("泠泠七弦上,静听松风寒。\n古调虽自爱,今人多不弹。"));
效果如图。
这里用SetDefMainString和SetDefSubString设置了默认的字符串,注意到可以用’\n’来实现换行。
有人在说了,图上如果能显示坐标轴,那才显得专业。
没问题啊,请添加下面这句话。
m_ChartWnd.GetChart()->SetDrawBasicAnyway(true);
图上有坐标轴了!
这时,其实可以调用很多相关的接口函数,来调整这个默认界面。例如,可以添加如下代码。
m_ChartWnd.GetChart()->SetGridLine(true, true);
m_ChartWnd.GetChart()->SetTitle(_T("唐诗赏析"));
这时的结果如图。
老师已经听到了,有人悄悄地说,还是图片更漂亮。
没问题,请继续增加下列代码。
HBITMAP hb;
hb = (HBITMAP)LoadImage(GetModuleHandle(NULL), _T("DefScreen.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if(hb)
{
m_ChartWnd.GetChart()->SetDefImage(hb);
DeleteObject(hb);
}
同时找一张图片,改名为DefScreen.bmp放到LessonA17目录里面。
结果如图。
嗯嗯,笨笨只想说,女神真漂亮!
这里要说明的是,如果同时设置了默认字符串和默认图像,图像显示优先。
最后,笨笨介绍一下SetDefScreen的完整用法。
编写一个自己绘制屏幕的函数,格式如下。
void MyDefScreen( void *plot, HDC hDC, RECT plotRect, void *pPara )
{
CChart *pChart = (CChart *)pPara;
HPEN hPen, hOldPen;
hPen = CreatePen(PS_SOLID, 3, RGB(255, 255, 0));
hOldPen = (HPEN)SelectObject(hDC, hPen);
MoveToEx(hDC, plotRect.left, plotRect.top, NULL);
LineTo(hDC, plotRect.right, plotRect.bottom);
MoveToEx(hDC, plotRect.left, plotRect.bottom, NULL);
LineTo(hDC, plotRect.right, plotRect.top);
SelectObject(hDC, hOldPen);
DeleteObject(hPen);
}
这里只是简单画了两条线。
注意到这个函数的参数。第一个是个保留参数,不管;第二个是绘图的设备环境;第三个是绘图的矩形位置;第四个是个void*指针,这比较重要,可以传入需要的数据。本例传入的是一个CChart指针,具体怎么传,马上会讲到。当然这里没有用到CChart指针里的数据。
下面把自绘函数MyDefScreen添加到CChart绘图系统里面。
m_ChartWnd.GetChart()->SetDefScreen(MyDefScreen, m_ChartWnd.GetChart());
注意到,SetDefScreen的第二个参数,就是传递给MyDefScreen的数据。具体到本例,就是传了一个CChart指针。
完事了,下面是效果图。
下课啦!!!