大家可能都知道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的消息映射有点类似。
好,现在消息响应没有问题了。