深入浅出CChart 每日一课——快乐高四第四十四课 攻入城池,SoUI探险第四关之SWindow窗口

通过前面三课的练习,我们的预热已经差不多了,下面开始直接利用SoUI的SWindow来使用CChart。

SWindow是SoUI中的标准窗口,当然是不带句柄的窗口。一般情况下,CChart的使用都需要句柄。下面看看怎么用SWindow编程。

第一步和第二步,和前面的课程完全一样,新建一个名为LessonA44的Soui工程。

第三步,开始创建一个SWindow。

首先写一个头文件SChartWnd.h,内容如下。

#pragma once
 
#include <core/SWnd.h>

#include "CChart\Chart.h"
using namespace NsCChart;
#pragma comment(lib,"CChart/CChartu.lib")
 
namespace SOUI
{
	class SChartWnd : public SWindow
	{
		SOUI_CLASS_NAME(SChartWnd,L"SChartWnd")
 
	public:
		SChartWnd();
		~SChartWnd();
 
	protected:
//		void OnPaint(IRenderTarget *pRT);
		int OnCreate(LPVOID lpVoid);
		void OnSize(UINT nType, CSize size);
  
		SOUI_MSG_MAP_BEGIN()
//			MSG_WM_PAINT_EX(OnPaint)
			MSG_WM_CREATE(OnCreate)
			MSG_WM_SIZE(OnSize)
		SOUI_MSG_MAP_END()
 
	private:
		HWND	hChartWnd;
	};
}

这里我们直接继承SWindow,创建了SChartWnd这个类。

首先注意到SOUI_CLASS_NAME(SChartWnd,L"SChartWnd")这句话,这说明我们这个类在xml布局文件中的类名为"SChartWnd",后面在布局文件中将要用到。

其次注意到我们把void OnPaint(IRenderTarget *pRT);这句话注释掉了。其实在SoUI的教程里,自定义SWindow最关键的地方就是这个绘图函数。为什么这里不用呢?因为本节课的方法里面,CChart会自动完成绘图。

最后注意到文件末尾的HWND   hChartWnd;这句话,说明本节课的方法实际上还是要用到句柄。完全不用句柄的方法,下节课再说。

第四步,继续创建这个SWindow。

编写文件SChartWnd.cpp,内容如下。

#include "stdafx.h"
#include "SChartWnd.h"
 
namespace SOUI
{
	double Func(double x, double y)
	{
		return 2.0/((x+1.0)*(x+1.0)+y*y+2.0)+1.0/((x-1.0)*(x-1.0)+y*y+1.0);
	}

	SChartWnd::SChartWnd()
	{
	}
 
 
	SChartWnd::~SChartWnd()
	{
	}
 
//	void SChartWnd::OnPaint(IRenderTarget *pRT)
//	{
		
//	}
	int SChartWnd::OnCreate(LPVOID lpVoid)
	{
		HWND hWndHost = GetContainer()->GetHostHwnd();
		hChartWnd = CreateSubChartWnd(hWndHost, kTypeContour);

		GetChart(hChartWnd)->SetFieldFcn(Func);
		GetChart(hChartWnd)->SetPlotRange(-4.0, 4.0, -4.0, 4.0);
GetChart(hChartWnd)->SetContourPrecision(8);


		return 0;
	}
	void SChartWnd::OnSize(UINT nType, CSize size)
	{
		CRect rt;
		GetClientRect(&rt);
		::MoveWindow(hChartWnd, rt.left, rt.top, rt.right-rt.left, rt.bottom-rt.top, TRUE);
	}
}

前几课都画的同一条曲线,腻了,这里我们画一个等高线图。

发现了吗?这里仍然利用CreateSubChartWnd新建了一个带句柄的窗口,并通过OnSize,使得这个窗口如影随形地跟随着我们位于空气中的SWindow。为什么说这个SWindow位于空气中呢?因为OnPaint这个函数我们根本就没有实现它!虽然我们没有画这个SWindow,不过新建的CChart窗口完全可以顶上。从实际效果上看,CChart窗口就是SWindow了,哈哈。

是不是有点受骗的感觉呢?不要嘛,因为CChart基本上就是基于HWND的,在无窗口的DirectUI中使用处处受限,没有办法啦。

实在不想要句柄?那就等下节课咯!

 

第五步,注册这个SWindow。

打开LessonA44.cpp,在其头部,加入:

#include "SChartWnd.h"

找到m_theApp = new SApplication(pRenderFactory, hInstance); 这一行,在其下面添加:

m_theApp->RegisterWindowClass<SChartWnd>();

第六步,在布局文件中使用这个SWindow。

打开dlg_main.xml文件,删除或注释掉下面一句话。

<text pos="|0,|0" offset="-0.5,-0.5">这是一个由SOUI向导生成的APP框架</text>

在这句话的位置,添加下面一句话。

<SChartWnd pos="10,10, -10, -10"   name="chartwnd" />

注意这里的SChartWnd,需要和前面编写的头文件中,SOUI_CLASS_NAME(SChartWnd,L"SChartWnd")这行代码匹配。

新建的窗口位于主窗口的客户区中,上下左右各缩进10个像素。

同时,需要把translucent="0"修改为:

translucent="0" 

编译运行,程序运行结果如图。

终于完成了SWindow的拓展,踏进了SoUI的大门!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值