深入浅出CChart 每日一课——快乐高四第十七课 麦田的守望,默认界面的设置方法

我说我想静静,我说我想躲躲。

群里的小伙伴经常问同一个问题,就是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指针。

完事了,下面是效果图。

下课啦!!!

 

猜你喜欢

转载自blog.csdn.net/baita96/article/details/88652667