天天看点

深入浅出CChart 每日一课——快乐高四第四十二课 步步为营,SoUI探险第二关之普通子窗口

上节课说的是在SoUI里使用弹出窗口绘图,说实话这个方法太简单,而且其实和SoUI也没有什么关系,哪里都可以这样用。

本节课呢,就讲一下在SoUI的窗口里面建一个子窗口来绘图。

闲话少说,直接开始。

第一步到第三步,和上一课完全一样,新建一个名为LessonA42的Soui工程。

第四步,打开MainDlg.cpp文件。

在OnInitDialog函数里,添加如下代码。

CRect rect;
	rect = GetClientRect();
	m_hWndChart = CreateSubChartWnd(m_hWnd, kTypeXY, L"CChart", rect.left+10, rect.top+40, rect.right-rect.left-20, rect.bottom-rect.top-50);

	int len=10;
	for(int i=0; i<len; i++)
	{
		GetChart(m_hWndChart)->AddPoint2D(i, i*i/(double)len/len);
	}
	GetChart(m_hWndChart)->SetTitle(L"测试子窗口");
           

这里和上一课不同,采用CreateSubChartWnd建立了一个m_hWnd的子窗口。实际上,这个窗口的窗口类名也是”ChartCtrl”。

在OnClose函数里,添加和上一课完全一样的代码。

::DestroyWindow(m_hWndChart);
           

现在可以编译了!编译完成后,把Chartu.dll文件拷贝到外层的Debug文件夹里,就可以运行了。

深入浅出CChart 每日一课——快乐高四第四十二课 步步为营,SoUI探险第二关之普通子窗口

咦!怎么啥也没有哇?

不要着急,下面是关键的一步。

第五步,打开dlg_main.xml文件。

找到translucent="1" 这一行,修改为:

translucent="0"
           

这是为啥呢?黄大师告诉我说是使用了GDI函数,就会破坏Soui的alpha通道,这样就必须把translucent设置为0。嗯嗯,CChart的绘图操作全部是GDI,那莫法啰!

再运行试试,如图。

深入浅出CChart 每日一课——快乐高四第四十二课 步步为营,SoUI探险第二关之普通子窗口

移动鼠标,试试消息响应,一切正常。欧耶!

不过呢,谦虚是一个人的美德。不要高兴得过早。拖拉窗口的边框试试,发现CChart的图像不动,不会跟着变。

对于熟悉VC的人来说,处理这个问题手到擒来。

第六步,打开MainDlg.cpp文件,在OnSize函数的最后,添加如下语句。

CRect rect;
	rect = GetClientRect();
	::MoveWindow(m_hWndChart, rect.left+10, rect.top+40, rect.right-rect.left-20, rect.bottom-rect.top-50, TRUE);
           

再打开程序试试,这下一切正常了。

这样是不是就很完美了?

No,No,No!

实际上,我们到现在为止,还没有用到SoUI的布局功能,而SoUI最强大、最方便的功能恰恰就是控件的自动布局功能。

看看我们上面的代码,rect.left+10,rect.top+40,这些都是硬编码,要是界面的布局一变,就可能出问题。比如,如果标题栏的高度增加,那我们的图像会覆盖一部分标题栏,这样的话,这个窗口也太难看了吧!另外我们还得手动处理OnSize消息。嗯嗯,这不是我们想要的!

所以呢,我们现在还在SoUI的门外打探,根本还没有跨进SoUI的大门。

从下一课开始,我们将进入到SoUI的核心。

继续阅读