深入浅出CChart 每日一课——快乐高四第四十课 爪哇王国,Java调用CChart绘图

Java,一个无敌的存在!虽然C++程序员都很鄙视Java的运行效率,但仍然无可奈何地看着自己的阵地一点点地被Java攻占。

当然,在Java里面,已经有无数好用的可视化类库,CChart并没有什么特别突出的优势,本节课只是为了说明CChart在Java中是可用的。当然,易拓展可定制仍然可以作为CChart的特点。

CChart是Windows native的库,Java中调用原则上需要采用JNI,不过JNI使用起来比较繁琐,这里采用了JNA。

另外,CChart类库中存在的C++ Name mangling,使得JNA无法直接调用。为了解决这个问题,仍然需要利用前两节课采用的二次包装方法。

下面开始。

第一步,安装JNA。

这里采用的是32位版的CChart,JDK也是32位的。

JNA实际就两个文件,笨笨下载的是5.3.1版本,jna-5.3.1.jar和jna-platform-5.3.1.jar。

JNA的安装方法是把这两个文件的路径加文件名,添加到系统变量classpath里面。

第二步,用VC打开上一节课二次包装CChart库的Dll工程文件,在ChartWrapper.cpp里面,输入下面的代码,然后编译出CChartWrapperU.dll待用。

#pragma comment(linker, "/export:_CreateChart=CChartu.?CreateChart@Classless@@YAXXZ")
#pragma comment(linker, "/export:_DestroyChart=CChartu.?DestroyChart@Classless@@YAXXZ")
#pragma comment(linker, "/export:_Attach=CChartu.?Attach@Classless@@YAHPAUHWND__@@@Z")
#pragma comment(linker, "/export:_AddPoint2D=CChartu.?AddPoint2D@Classless@@YAHNNHH@Z")
#pragma comment(linker, "/export:_SetTitle=CChartu.?SetTitle@Classless@@YAXPB_W@Z")
#pragma comment(linker, "/export:_ReDraw=CChartu.?ReDraw@Classless@@YAXXZ")

第三步,利用任意文本编辑器,采用JFrame类库建立一个简单的Java窗口程序。记事本就可以了哟,哈哈。

import javax.swing.JFrame;

public class JavaWnd
{
	public static void main(String[] args)
	{
		JFrame myWnd = new JFrame("Java Window");
		myWnd.setLocation(100, 100);
		myWnd.setSize(600, 450);
		myWnd.setVisible(true);
		myWnd.setResizable(false);
    }
}

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

第四步,拷贝CChartWrapperU.dll和CChartu.dll两个文件。

第五步,导入JNA类库中相关的类。

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.WinDef.HWND;

import com.sun.jna.WString;

第六步,基于JNA建立CChart的调用接口界面。

	public interface CChartLib extends Library
	{
        	CChartLib INSTANCE = (CChartLib)Native.loadLibrary("CChartWrapperU.dll",CChartLib.class);

		public abstract void CreateChart();
		public abstract int Attach(HWND hWnd);
		public abstract int AddPoint2D(double x, double y, int nDataIndex, int nPlotIndex);
		public abstract void SetTitle(WString title);
		public abstract void ReDraw();
	}

这里利用JNA,把前面DLL二次包装的函数写成Java可以直接调用的接口。

第七步,获得窗口的HWND指针。

在Windows下,Java窗口也是有HWND指针的,这使得CChart的使用成为可能。

Pointer p = Native.getComponentPointer(myWnd);
HWND h = new HWND(p);

第八步,通过JNA调用CChart API绘图。

		CChartLib.INSTANCE.CreateChart();
		CChartLib.INSTANCE.Attach(h);
		for(int i=-10; i<=10; i++)
		{
			CChartLib.INSTANCE.AddPoint2D(i, i*i*i*i, 0, 0);
		}
		CChartLib.INSTANCE.SetTitle(new WString("Java标题"));
		CChartLib.INSTANCE.ReDraw();

代码编制完成,效果如图。

在Java程序里,CChart的消息响应仍然正常。

对于Java环境中的使用,本节课仅做了一个简单的演示。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值