深入浅出CChart 每日一课——快乐高四第五十四课 空谷幽兰,在WxWidgets中使用CChart

大家可能都知道WxWidgets这个库,这是一个跨平台的开发包,可以开发GUI界面,但不限于GUI界面,功能可能类似MFC吧。

WxWidgets的优点在于他都是用本地代码实现的,而不是像Java那样,弄出一个四不像的蜗牛型软件。

这里展示一下怎么在WxWidgets中使用CChart。

大家上了这么久的课,应该已经知道关键问题所在了,那就是:怎么获得窗口的HWND句柄或者HDC句柄。WxWidgets很直接,其窗口提供了GetHWND()这个函数,返回值是WXHWND句柄,这个句柄实际上和HWND句柄是一样的。

既然抓住了关键,那在WxWidgets中使用CChart就很容易了。

下面简略介绍一下吧。

首先还是WxWidgets的安装,这里不赘述。

1、利用VS2010建立一个Win32项目LessonA54,空项目。

 

 

 2、插入一个cpp文件,在里面添加一个WxWidgets的框架程序如下。

#define __WXMSW__   /// 使用windows平台
//#define WXUSINGDLL  /// 使用动态链接库
#define WXUSINGLIB  /// 使用静态链接库
 
#ifdef _DEBUG
#define __WXDEBUG__  /// 使用WxWidgets调试
#endif //_DEBUG
 
#include "wx/config.h"
 
#include "wx/wx.h"       /// 使用WxWidgets通用功能和类
#include "wx/aui/aui.h" /// 使用AUI
#include "wx/artprov.h"  /// 使用预定义的图标资源


class MyFrame: public wxFrame {
public:
    MyFrame(): wxFrame(NULL, wxID_ANY, "WxWidgets") {
	}
};
class MyApp: public wxApp {
public:
    virtual bool OnInit(){
        MyFrame *pframe = new MyFrame();
        pframe->Show( true );
        return true;
    }
};

wxIMPLEMENT_APP(MyApp);

这个程序可以说是最简单的了,应该没有办法更简单,除非只是弹出一个消息框。

注意最前面,我们设置使用静态库。WxWidgets如果使用动态库,需要打包不少文件,比较麻烦。

运行效果如图。

 

这只是一个框架窗口。一般来说,框架窗口里面是放置其它窗口的,但是,我们也可以直接在里面干点别的,也不是不可以。这里为了简单,就直接在里面画图了。

3、添加CChart绘图代码。

由于代码很少,这里直接给出全部代码。

#define __WXMSW__   /// 使用windows平台
//#define WXUSINGDLL  /// 使用动态链接库
#define WXUSINGLIB  /// 使用静态链接库
 
#ifdef _DEBUG
#define __WXDEBUG__  /// 使用WxWidgets调试
#endif //_DEBUG
 
#include "wx/config.h"
 
#include "wx/wx.h"       /// 使用WxWidgets通用功能和类
#include "wx/aui/aui.h" /// 使用AUI
#include "wx/artprov.h"  /// 使用预定义的图标资源

#include "Chart.h"
#if defined(_UNICODE) || defined(UNICODE)
#	pragma comment(lib,"CChartu.lib")
#else
#	pragma comment(lib,"CChart.lib")
#endif
using namespace NsCChart;

CChartWnd chartWnd;

class MyFrame: public wxFrame {
public:
    MyFrame(): wxFrame(NULL, wxID_ANY, "WxWidgets") {
		WXHWND wxhWnd = GetHWND();
		chartWnd.Attach((HWND)wxhWnd, kTypeXY);
		int i, hc=5;
		for(i=-hc; i<=hc; ++i)
		{
			chartWnd.GetChart()->AddPoint2D(i, i*i);
		}
		chartWnd.GetChart()->SetBLAxis();
		chartWnd.GetChart()->SetTitle(_T("Title"));
	}
};
class MyApp: public wxApp {
public:
    virtual bool OnInit(){
        MyFrame *pframe = new MyFrame();
        pframe->Show( true );
        return true;
    }
};

wxIMPLEMENT_APP(MyApp);

这里就是利用了GetHWND()这个函数获得了窗口句柄,然后绘图,简单吧!

运行效果如下!

 

但还有一点小问题。窗口放大的时候,完全正常,但窗口缩小的时候,图像不刷新,需要响应鼠标或键盘消息才重绘。

这个原因暂时不清楚。不管怎么,我们响应一下OnSize就可以了!

4、添加消息响应代码。

在class MyFrame类里面的最后面,添加代码

wxDECLARE_EVENT_TABLE();

在文件尾部,wxIMPLEMENT_APP(MyApp);这一行的前面,添加代码

wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
    EVT_SIZE(MyFrame::OnSize)
wxEND_EVENT_TABLE()

在class MyFrame类代码里面,添加代码

void MyFrame::OnSize(wxSizeEvent &event) {
		chartWnd.ReDraw();
	}

这些代码和MFC的消息映射有点类似。

好,现在消息响应没有问题了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值